aboutsummaryrefslogtreecommitdiff
path: root/zenutil/include
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-08-09 14:13:30 +0200
committerStefan Boberg <[email protected]>2021-08-09 14:13:30 +0200
commit0b9b482df96d1bd971151fb28614b3faafdaf451 (patch)
tree6c7a1d62fadf43675b546d7fe8badce71267d25f /zenutil/include
parentAdded ThrowLastError which accepts a std::source_location (diff)
downloadzen-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.h42
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;
+};