diff options
| author | Stefan Boberg <[email protected]> | 2021-08-09 14:13:30 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-08-09 14:13:30 +0200 |
| commit | 0b9b482df96d1bd971151fb28614b3faafdaf451 (patch) | |
| tree | 6c7a1d62fadf43675b546d7fe8badce71267d25f /zenutil/include | |
| parent | Added ThrowLastError which accepts a std::source_location (diff) | |
| download | zen-0b9b482df96d1bd971151fb28614b3faafdaf451.tar.xz zen-0b9b482df96d1bd971151fb28614b3faafdaf451.zip | |
Added ZenServerState implementation, used to track and enumerate live Zen server instances
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; +}; |