12#include <promeki/config.h>
13#if PROMEKI_ENABLE_CORE
28PROMEKI_NAMESPACE_BEGIN
37PROMEKI_NAMESPACE_BEGIN
82 Application(
int argc,
char **argv);
87 Application(
const Application &) =
delete;
88 Application(Application &&) =
delete;
89 Application &operator=(
const Application &) =
delete;
90 Application &operator=(Application &&) =
delete;
97 static const StringList &arguments();
103 static const UUID &appUUID();
109 static void setAppUUID(
const UUID &uuid);
128 static int64_t pid();
134 static const String &appName();
140 static void setAppName(
const String &name);
146 static Thread *mainThread();
153 static EventLoop *mainEventLoop();
164 static IODevice *stdinDevice();
175 static IODevice *stdoutDevice();
186 static IODevice *stderrDevice();
204 static void installSignalHandlers();
215 static void uninstallSignalHandlers();
225 static bool areSignalHandlersInstalled();
238 static void installCrashHandler();
248 static void uninstallCrashHandler();
258 static bool isCrashHandlerInstalled();
294 static void refreshCrashHandler();
309 static void writeTrace(
const char *reason =
nullptr);
329 static void quit(
int exitCode = 0);
340 using QuitRequestHandler = Function<bool(
int exitCode)>;
362 static void setQuitRequestHandler(QuitRequestHandler handler);
368 static bool shouldQuit();
374 static int exitCode();
387 static const char *DebugServerEnv;
406 static Error startDebugServer(
const SocketAddress &address);
415 static Error startDebugServer(uint16_t port);
426 static void stopDebugServer();
435 static DebugServer *debugServer();
460 static Error startCpuMonitor(
const Duration &interval);
471 static void stopCpuMonitor();
481 static CpuMonitor *cpuMonitor();
519 static MdnsManager *mdnsManager();
536 static void stopMdnsManager();
572 static Error startEventLoopMonitors(
const Duration &interval,
573 EventLoop::ReportFunction fn = {});
588 static void stopEventLoopMonitors();
594 static bool eventLoopMonitorsEnabled();
612 static void installEventLoopMonitorIfEnabled(EventLoop *loop);
633 StringList arguments;
636 Thread *mainThread =
nullptr;
641 Atomic<int> exitCode{0};
642 Atomic<bool> shouldQuit{
false};
643 QuitRequestHandler quitHandler;
644 UniquePtr<DebugServer> debugServer;
645 UniquePtr<CpuMonitor> cpuMonitor;
646 UniquePtr<MdnsManager> mdnsManager;
659 bool elMonitorEnabled =
false;
660 Duration elMonitorInterval;
661 EventLoop::ReportFunction elMonitorFn;
662 mutable Mutex elMonitorMutex;
666 static void maybeStartDebugServerFromEnv();
674 EventLoop _eventLoop;