From 0b9b482df96d1bd971151fb28614b3faafdaf451 Mon Sep 17 00:00:00 2001 From: Stefan Boberg Date: Mon, 9 Aug 2021 14:13:30 +0200 Subject: Added ZenServerState implementation, used to track and enumerate live Zen server instances --- zenutil/include/zenserverprocess.h | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'zenutil/include') diff --git a/zenutil/include/zenserverprocess.h b/zenutil/include/zenserverprocess.h index 239841a04..60ed273cb 100644 --- a/zenutil/include/zenserverprocess.h +++ b/zenutil/include/zenserverprocess.h @@ -6,6 +6,7 @@ #include +#include #include class ZenServerEnvironment @@ -58,3 +59,44 @@ private: std::filesystem::path m_TestDir; bool m_MeshEnabled = false; }; + +/** Shared system state + * + * Used as a scratchpad to identify running instances etc + * + * The state lives in a memory-mapped file backed by the swapfile + * + */ + +class ZenServerState +{ +public: + ZenServerState(); + ~ZenServerState(); + + struct ZenServerEntry + { + std::atomic Pid; + std::atomic ListenPort; + uint16_t Flags; + uint8_t SessionId[12]; + uint8_t Padding[12]; + + void Reset(); + }; + + static_assert(sizeof(ZenServerEntry) == 32); + + void Initialize(); + [[nodiscard]] bool InitializeReadOnly(); + ZenServerEntry* Lookup(int ListenPort); + ZenServerEntry* Register(int ListenPort); + void Sweep(); + void Snapshot(std::function&& Callback); + +private: + void* m_hMapFile = nullptr; + ZenServerEntry* m_Data; + int m_MaxEntryCount = 4096 / sizeof(ZenServerEntry); + ZenServerEntry* m_OurEntry = nullptr; +}; -- cgit v1.2.3