UniSet 2.45.1
ProcessManager.h
1/*
2 * Copyright (c) 2026 Pavel Vainerman.
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as
6 * published by the Free Software Foundation, version 2.1.
7 */
8// -------------------------------------------------------------------------
9#ifndef ProcessManager_H_
10#define ProcessManager_H_
11// -------------------------------------------------------------------------
12#include <memory>
13#include <string>
14#include <vector>
15#include <map>
16#include <mutex>
17#include <atomic>
18#include <thread>
19#include <functional>
20#include <iostream>
21#include <Poco/Process.h>
22#include "ProcessInfo.h"
23#include "DependencyResolver.h"
24#include "HealthChecker.h"
25#include "Configuration.h"
26#include "Debug.h"
27// -------------------------------------------------------------------------
28namespace uniset
29{
42 enum class BulkOperation : int
43 {
44 None = 0,
45 Restart,
46 Reload,
47 Stop
48 };
49
50 class ProcessManager
51 {
52 public:
53 explicit ProcessManager(std::shared_ptr<Configuration> conf = nullptr);
54 ~ProcessManager();
55
56 // Configuration
57 void setNodeName(const std::string& name);
58 std::string getNodeName() const;
59
60 void setHealthCheckInterval(size_t msec);
61 void setRestartWindow(size_t msec);
62 void setStopTimeout(size_t msec);
63 void setCommonArgs(const std::vector<std::string>& args);
64 void setPassthroughArgs(const std::vector<std::string>& args);
65 void setForwardArgs(const std::vector<std::string>& args);
66
67 // Process registration
68 void addProcess(const ProcessInfo& proc);
69 void addGroup(const ProcessGroup& group);
70
71 // Lifecycle management
72 bool startAll();
73 void stopAll();
74 void restartAll();
75 void reloadAll();
76 void requestStop();
77
89 void cancelStartup();
90 bool isBulkOperationInProgress() const;
91 BulkOperation currentBulkOperation() const;
92 bool restartProcess(const std::string& name);
93 bool stopProcess(const std::string& name);
94 bool startProcess(const std::string& name);
95
96 // Monitoring
97 void startMonitoring();
98 void stopMonitoring();
99 bool isMonitoring() const;
100
101 // State queries
102 ProcessState getProcessState(const std::string& name) const;
103 ProcessInfo getProcessInfo(const std::string& name) const;
104 std::vector<ProcessInfo> getAllProcesses() const;
105 std::vector<ProcessGroup> getAllGroups() const;
106
107 bool allRunning() const;
108 bool anyCriticalFailed() const;
109
111 std::vector<std::string> getFullArgs(const std::string& name) const;
112
118 void printRunList(std::ostream& out) const;
119
120 // Callbacks
121 using ProcessCallback = std::function<void(const ProcessInfo&)>;
122 void setOnProcessStarted(ProcessCallback cb);
123 void setOnProcessStopped(ProcessCallback cb);
124 void setOnProcessFailed(ProcessCallback cb);
125
126 // Debug
127 std::shared_ptr<DebugStream> log();
128
129 private:
130 bool startProcessWithUnlock(ProcessInfo& proc, std::unique_lock<std::mutex>& lock);
131 bool startOneshotWithUnlock(ProcessInfo& proc, std::unique_lock<std::mutex>& lock);
132 void stopProcess(ProcessInfo& proc);
133 void doStopAll();
134 void handleProcessExitByName(const std::string& name, int exitCode);
135 void monitorLoop();
136
137 // Helper methods for process startup
138 std::vector<std::string> assembleArgs(const ProcessInfo& proc) const;
139 std::vector<std::string> prepareProcessArgs(const ProcessInfo& proc);
140 bool launchDaemonProcess(ProcessInfo& proc);
141
143 static bool interruptibleSleep(size_t msec, const std::atomic<bool>& cancelFlag,
144 size_t pollInterval_msec = 500);
145
146 std::vector<std::string> resolveStartOrder();
147 void expandEnvironment(std::vector<std::string>& args);
148 std::string expandEnvVar(const std::string& s);
149
150 std::shared_ptr<Configuration> conf_;
151 std::unique_ptr<HealthChecker> healthChecker_;
152 DependencyResolver depResolver_;
153
154 std::string nodeName_;
155 std::map<std::string, ProcessInfo> processes_;
156 std::map<std::string, ProcessGroup> groups_;
157
158 std::thread monitorThread_;
159 std::atomic<bool> running_{false};
160 std::atomic<bool> stopping_{false};
161 std::atomic<bool> stopAllRunning_{false};
162 std::atomic<bool> shutdownRequested_{false}; // monotonic: SIGINT/SIGTERM was received
163 std::atomic<BulkOperation> currentBulkOp_{BulkOperation::None};
164 mutable std::mutex mutex_;
165
166 size_t healthCheckInterval_msec_ = 5000;
167 size_t restartWindow_msec_ = 60000;
168 size_t stopTimeout_msec_ = 5000; // Time to wait for graceful shutdown before SIGKILL
169 std::vector<std::string> commonArgs_;
170 std::vector<std::string> passthroughArgs_; // Arguments after "--" passed to all child processes
171 std::vector<std::string> forwardArgs_; // Unknown arguments forwarded to child processes
172
173 ProcessCallback onStarted_;
174 ProcessCallback onStopped_;
175 ProcessCallback onFailed_;
176
177 std::shared_ptr<DebugStream> mylog;
178 };
179
180} // end of namespace uniset
181// -------------------------------------------------------------------------
182#endif // ProcessManager_H_
183// -------------------------------------------------------------------------
Определения DependencyResolver.h:39
void restartAll()
Restart all running processes.
Определения ProcessManager.cc:1111
void reloadAll()
Stop all, then start all (except skip, manual). Oneshot processes ARE re-run.
Определения ProcessManager.cc:1353
std::vector< std::string > getFullArgs(const std::string &name) const
Get full arguments list for a process (commonArgs + args + forwardArgs).
Определения ProcessManager.cc:1874
void requestStop()
Set stopping_ flag (async-signal-safe).
Определения ProcessManager.cc:921
void printRunList(std::ostream &out) const
Определения ProcessManager.cc:1948
void cancelStartup()
Определения ProcessManager.cc:927
Определения Calibration.h:27
BulkOperation
Определения ProcessManager.h:43
Определения ProcessInfo.h:113
Определения ProcessInfo.h:66