diff options
Diffstat (limited to 'zenutil/include')
| -rw-r--r-- | zenutil/include/zenserverprocess.h | 42 |
1 files changed, 42 insertions, 0 deletions
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 <spdlog/spdlog.h> +#include <atomic> #include <filesystem> 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<uint32_t> Pid; + std::atomic<uint16_t> 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<void(const ZenServerEntry&)>&& Callback); + +private: + void* m_hMapFile = nullptr; + ZenServerEntry* m_Data; + int m_MaxEntryCount = 4096 / sizeof(ZenServerEntry); + ZenServerEntry* m_OurEntry = nullptr; +}; |