12#include <promeki/config.h>
13#if PROMEKI_ENABLE_CORE
28PROMEKI_NAMESPACE_BEGIN
36PROMEKI_NAMESPACE_BEGIN
81 Application(
int argc,
char **argv);
86 Application(
const Application &) =
delete;
87 Application(Application &&) =
delete;
88 Application &operator=(
const Application &) =
delete;
89 Application &operator=(Application &&) =
delete;
96 static const StringList &arguments();
102 static const UUID &appUUID();
108 static void setAppUUID(
const UUID &uuid);
127 static int64_t pid();
133 static const String &appName();
139 static void setAppName(
const String &name);
145 static Thread *mainThread();
152 static EventLoop *mainEventLoop();
163 static IODevice *stdinDevice();
174 static IODevice *stdoutDevice();
185 static IODevice *stderrDevice();
203 static void installSignalHandlers();
214 static void uninstallSignalHandlers();
224 static bool areSignalHandlersInstalled();
237 static void installCrashHandler();
247 static void uninstallCrashHandler();
257 static bool isCrashHandlerInstalled();
293 static void refreshCrashHandler();
308 static void writeTrace(
const char *reason =
nullptr);
328 static void quit(
int exitCode = 0);
339 using QuitRequestHandler = Function<bool(
int exitCode)>;
361 static void setQuitRequestHandler(QuitRequestHandler handler);
367 static bool shouldQuit();
373 static int exitCode();
386 static const char *DebugServerEnv;
405 static Error startDebugServer(
const SocketAddress &address);
414 static Error startDebugServer(uint16_t port);
425 static void stopDebugServer();
434 static DebugServer *debugServer();
459 static Error startCpuMonitor(
const Duration &interval);
470 static void stopCpuMonitor();
480 static CpuMonitor *cpuMonitor();
516 static Error startEventLoopMonitors(
const Duration &interval,
517 EventLoop::ReportFunction fn = {});
532 static void stopEventLoopMonitors();
538 static bool eventLoopMonitorsEnabled();
556 static void installEventLoopMonitorIfEnabled(EventLoop *loop);
577 StringList arguments;
580 Thread *mainThread =
nullptr;
585 Atomic<int> exitCode{0};
586 Atomic<bool> shouldQuit{
false};
587 QuitRequestHandler quitHandler;
588 UniquePtr<DebugServer> debugServer;
589 UniquePtr<CpuMonitor> cpuMonitor;
602 bool elMonitorEnabled =
false;
603 Duration elMonitorInterval;
604 EventLoop::ReportFunction elMonitorFn;
605 mutable Mutex elMonitorMutex;
609 static void maybeStartDebugServerFromEnv();
617 EventLoop _eventLoop;