37 engine(
"NetworkEngine"),
58 bool run(
double timeout_s);
69 static void runTask(
Task *task,
const std::string &name =
"MainLoop",
70 std::ostream *log_file =
nullptr,
73 static void runTask(
Task *task,
const std::string &name =
"MainLoop",
74 std::ostream *log_file =
nullptr);
105 engine.cancelConnection(s);
139 const std::string &key_path,
const std::string &password) {
140 return engine.
tlsSetKey(conn, crt_path, key_path, password);
168 std::ostream *log_file =
nullptr,
169 Task *parent =
nullptr);
187 unsigned int channels,
unsigned int wno);
192 unsigned int channels,
unsigned int wno);
203 openFileOnSIGHUP = filename;
212 auto ret = finishedTasks.insert(task);
222 auto ret = messageTasks.insert(task);
243 auto p = observed_by.find(observer);
244 return p != observed_by.end() &&
245 p->second.find(task) != p->second.end();
253 static std::map<int, int> terminatedPIDs;
254 std::map<int, Task *> pidOwner;
258 static std::string openFileOnSIGHUP;
265 engine(
"NetworkEngine"),
269 std::map<Task *, std::thread> threads;
271 std::map<Task *, Task *> threadTaskObserver;
272 void collect_thread(
Task *t);
281 static volatile int got_signal;
285 static volatile int terminatedPIDtmp[100];
287 static void signalHandler(
int signum);
288 void removeAllTasks();
289 void check_finished();
290 Task *nextTimerToExecute();
291 void _removeTimer(
Task *task);
292 void _removeTask(
Task *task,
bool killed =
false);
296 std::map<Task *, Task *> tasks;
300 std::map<Task *, std::set<Task *> > observed_by;
301 std::map<Task *, std::set<Task *> > observing;
303 std::set<Task *> finishedTasks, messageTasks;
304 std::multimap<int, void (*)(int,
EventLoop &)> userSignalHandler;
305 std::multimap<TimePoint, Task *> timer_queue;
307 bool do_abort =
false;
The network engine.
Definition: engine.h:33
bool tlsSetKey(ServerSocket *conn, const std::string &crt_path, const std::string &key_path, const std::string &password)
Use SSL certificate for a listening socket.
Definition: engine.cpp:73
bool connActive(const Socket *conn) const
Definition: engine.h:89
bool wakeUpConnection(SocketConnection *s)
Wake up connection s if it is idle, return false otherwise.
Definition: engine.cpp:587
bool setCABundle(const std::string &path)
Set path to file containing chain of trust for SSL certificate.
Definition: engine.cpp:63
static void yield()
Call this to make the Engine::run method return prematurely.
Definition: engine.h:67
Manage timers and tasks.
Definition: eventloop.h:31
bool run(double timeout_s)
Definition: eventloop.cpp:505
void addSignalHandler(int signum, void(*handler)(int, EventLoop &))
Add handler for the given OS signal.
Definition: eventloop.cpp:249
bool setCABundle(const std::string &path)
Set path to file containing chain of trust for SSL certificate.
Definition: eventloop.h:144
bool addServer(ServerSocket *conn)
Definition: eventloop.cpp:322
void abort()
Remove all tasks.
Definition: eventloop.h:84
bool wakeUpConnection(SocketConnection *s)
Restart an idle connection.
Definition: eventloop.h:99
void taskDeleted(Task *task)
Notify EventLoop that a task object it ows has been deleted.
Definition: eventloop.cpp:339
void runUntilComplete()
Run until all task are done.
Definition: eventloop.cpp:554
bool isObserving(Task *observer, Task *task) const
Return true if observer is observing task.
Definition: eventloop.h:242
void notifyTaskMessage(Task *task)
Notify the EventLoop that the given task has a message to deliver.
Definition: eventloop.h:221
void addTask(Task *task, Task *parent=nullptr)
Definition: eventloop.cpp:271
void wakeUpTask(Task *t)
Restart idle connections owned by the given task.
Definition: eventloop.cpp:404
bool tlsSetKey(ServerSocket *conn, const std::string &crt_path, const std::string &key_path, const std::string &password)
Use SSL certificate for a listening socket.
Definition: eventloop.h:138
void notifyTaskFinished(Task *task)
Mark the given task as finished.
Definition: eventloop.h:211
bool addConnected(SocketConnection *conn)
Definition: eventloop.cpp:308
void cancelConnection(SocketConnection *s)
Remove a connection.
Definition: eventloop.h:104
bool addConnection(SocketConnection *conn)
Definition: eventloop.cpp:294
void killChildProcesses(int signum)
Send signal to all child processes.
Definition: eventloop.cpp:196
void spawnThread(Task *task, const std::string &name="ThreadLoop", std::ostream *log_file=nullptr, Task *parent=nullptr)
Create a new thread and run task in its own loop in that thread.
Definition: eventloop.cpp:589
static void setLogFilename(const std::string &filename)
Set path to log file.
Definition: eventloop.h:202
bool running(Task *task)
Return true if task is running.
Definition: eventloop.cpp:412
std::set< Socket * > findConnByTask(const Task *t) const
Return all connetcions owned by the given task.
Definition: eventloop.cpp:408
bool aborted() const
Return true if the EventLoop is about to be terminated.
Definition: eventloop.h:228
WorkerProcess * createWorker(Task *parent, std::ostream *log_file, unsigned int channels, unsigned int wno)
Definition: eventloop.cpp:117
static void interrupt()
Definition: eventloop.h:161
static void daemonize()
Fork into background, detach from shell.
Definition: eventloop.cpp:90
void resetTimer(Task *task, double s)
Definition: eventloop.cpp:416
int externalCommand(Task *owner, const char *const argv[])
Definition: eventloop.cpp:73
void waitForThreadsToFinish()
Block current thread until all spawned threads have finished.
Definition: eventloop.cpp:629
void getChildTasks(std::set< Task * > &tset, Task *parent) const
Get all tasks with the given parent.
Definition: eventloop.cpp:376
static void runTask(Task *task, const std::string &name="MainLoop", std::ostream *log_file=nullptr, EventLoop *parent=nullptr)
Definition: eventloop.cpp:567
void abortChildTasks(Task *parent)
Remove all tasks with the given parent.
Definition: eventloop.cpp:388
bool startObserving(Task *from, Task *to)
Definition: eventloop.cpp:348
void abortTask(Task *task)
Remove the given task.
Definition: eventloop.cpp:398
EventLoop(std::string log_label="MainLoop")
Definition: eventloop.h:35
bool isActive(const Socket *conn) const
Return true if conn still exists.
Definition: eventloop.h:112
A simple logger. All classes that want to write to the global log file should inherit from this class...
Definition: logger.h:86
Listen on a single socket for incoming connections.
Definition: serversocket.h:15
This class implements low-level socket connection operations. Inherit from it to implement protocols ...
Definition: socketconnection.h:47
This is a slave to the Engine class. You can't use it directly, only through its subclasses,...
Definition: socket.h:18
The purpose of a task is to manage socket connections, and/or to execute timers.
Definition: task.h:39
Used by LoadBalancer to manage child processes.
Definition: workerprocess.h:21