diff options
| author | Stefan Boberg <[email protected]> | 2021-08-09 16:31:55 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-08-09 16:31:55 +0200 |
| commit | 5e12cf0c02b2e6687a246f7a5ae5fe2b6c62f079 (patch) | |
| tree | a19c21ea012bd61921165635990a94802c8aabc3 | |
| parent | Basic implementation of zen top/ps (currently identical but won't be) functio... (diff) | |
| download | zen-5e12cf0c02b2e6687a246f7a5ae5fe2b6c62f079.tar.xz zen-5e12cf0c02b2e6687a246f7a5ae5fe2b6c62f079.zip | |
Added ZenServerInstance::AttachToRunningServer
| -rw-r--r-- | zenutil/include/zenserverprocess.h | 13 | ||||
| -rw-r--r-- | zenutil/zenserverprocess.cpp | 30 |
2 files changed, 37 insertions, 6 deletions
diff --git a/zenutil/include/zenserverprocess.h b/zenutil/include/zenserverprocess.h index 60ed273cb..d2101c8e8 100644 --- a/zenutil/include/zenserverprocess.h +++ b/zenutil/include/zenserverprocess.h @@ -49,6 +49,7 @@ struct ZenServerInstance } void SpawnServer(int BasePort = 0); + void AttachToRunningServer(int BasePort = 0); private: ZenServerEnvironment& m_Env; @@ -87,12 +88,12 @@ public: 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); + void Initialize(); + [[nodiscard]] bool InitializeReadOnly(); + [[nodiscard]] ZenServerEntry* Lookup(int ListenPort); + ZenServerEntry* Register(int ListenPort); + void Sweep(); + void Snapshot(std::function<void(const ZenServerEntry&)>&& Callback); private: void* m_hMapFile = nullptr; diff --git a/zenutil/zenserverprocess.cpp b/zenutil/zenserverprocess.cpp index 8427e612e..2a6b583de 100644 --- a/zenutil/zenserverprocess.cpp +++ b/zenutil/zenserverprocess.cpp @@ -491,6 +491,36 @@ ZenServerInstance::SpawnServer(int BasePort) } void +ZenServerInstance::AttachToRunningServer(int BasePort) +{ + ZenServerState State; + if (!State.InitializeReadOnly()) + { + // TODO: return success/error code instead? + throw std::exception("No zen state found"); + } + + const ZenServerState::ZenServerEntry* Entry = nullptr; + + if (BasePort) + { + Entry = State.Lookup(BasePort); + } + else + { + State.Snapshot([&](const ZenServerState::ZenServerEntry& InEntry) { Entry = &InEntry; }); + } + + if (!Entry) + { + // TODO: return success/error code instead? + throw std::exception("No server found"); + } + + m_Process.Initialize(Entry->Pid); +} + +void ZenServerInstance::WaitUntilReady() { m_ReadyEvent.Wait(); |