mirror of
https://github.com/oxen-io/lokinet.git
synced 2024-11-17 15:25:35 +00:00
4103908a8d
the win32 and sd_notify components provided a disjointed set of similar high level functionality so we consolidate these duplicate code paths into one that has the same lifecycle regardless of platform to reduce complexity of this feature. this new component is responsible for reporting state changes to the system layer and optionally propagating state change to lokinet requested by the system layer (used by windows service).
119 lines
2.1 KiB
C++
119 lines
2.1 KiB
C++
#pragma once
|
|
|
|
namespace llarp
|
|
{
|
|
struct Context;
|
|
}
|
|
|
|
namespace llarp::sys
|
|
{
|
|
|
|
// what state lokinet will report we are in to the system layer
|
|
enum class ServiceState
|
|
{
|
|
Initial,
|
|
Starting,
|
|
Running,
|
|
Stopping,
|
|
Stopped,
|
|
HardStop,
|
|
Failed,
|
|
};
|
|
|
|
/// interface type for interacting with the os dependant system layer
|
|
class I_SystemLayerManager
|
|
{
|
|
protected:
|
|
bool m_disable{false};
|
|
llarp::Context* m_Context{nullptr};
|
|
|
|
/// change our state and report it to the system layer
|
|
virtual void
|
|
we_changed_our_state(ServiceState st) = 0;
|
|
|
|
public:
|
|
virtual ~I_SystemLayerManager() = default;
|
|
|
|
/// disable all reporting to system layer
|
|
inline void
|
|
disable()
|
|
{
|
|
m_disable = true;
|
|
}
|
|
|
|
/// give our current lokinet context to the system layer manager
|
|
inline void
|
|
give_context(llarp::Context* ctx)
|
|
{
|
|
m_Context = ctx;
|
|
}
|
|
|
|
/// system told us to enter this state
|
|
virtual void
|
|
system_changed_our_state(ServiceState st) = 0;
|
|
|
|
/// report our current state to the system layer
|
|
virtual void
|
|
report_changed_state() = 0;
|
|
|
|
/// report our stats on each timer tick
|
|
virtual void
|
|
report_periodic_stats(){};
|
|
|
|
void
|
|
starting()
|
|
{
|
|
if (m_disable)
|
|
return;
|
|
we_changed_our_state(ServiceState::Starting);
|
|
}
|
|
|
|
void
|
|
ready()
|
|
{
|
|
if (m_disable)
|
|
return;
|
|
we_changed_our_state(ServiceState::Running);
|
|
}
|
|
|
|
void
|
|
stopping()
|
|
{
|
|
if (m_disable)
|
|
return;
|
|
we_changed_our_state(ServiceState::Stopping);
|
|
}
|
|
|
|
void
|
|
stopped()
|
|
{
|
|
if (m_disable)
|
|
return;
|
|
we_changed_our_state(ServiceState::Stopped);
|
|
}
|
|
|
|
void
|
|
failed()
|
|
{
|
|
if (m_disable)
|
|
return;
|
|
we_changed_our_state(ServiceState::Failed);
|
|
}
|
|
};
|
|
|
|
extern I_SystemLayerManager* const service_manager;
|
|
|
|
class NOP_SystemLayerHandler : public I_SystemLayerManager
|
|
{
|
|
protected:
|
|
void
|
|
we_changed_our_state(ServiceState) override
|
|
{}
|
|
|
|
public:
|
|
void
|
|
report_changed_state() override{};
|
|
void system_changed_our_state(ServiceState) override{};
|
|
};
|
|
} // namespace llarp::sys
|