mirror of
https://github.com/zeek/zeek.git
synced 2025-10-03 23:28:20 +00:00

This is based on Gilbert's code but I ended up refactoring it quite a bit. That's why I didn't do a direct merge but started with a new branch and copied things over to adapt. It looks quite a bit different now as I tried to generalize things a bit more to also support the Input Framework. The larger changes code are: - Moved all logging code into subdirectory src/logging/. Code here is in namespace "logging". - Moved all threading code into subdirectory src/threading/. Code here is in namespace "threading". - Introduced a central thread manager that tracks threads and is in charge of termination and (eventually) statistics. - Refactored logging independent threading code into base classes BasicThread and MsgThread. The former encapsulates all the pthread code with simple start/stop methods and provides a single Run() method to override. The latter is derived from BasicThread and adds bi-directional message passing between main and child threads. The hope is that the Input Framework can reuse this part quite directly. - A log writer is now split into a general WriterFrontend (LogEmissary in Gilbert's code) and a type-specific WriterBackend. Specific writers are implemented by deriving from the latter. (The plugin interface is almost unchanged compared to the 2.0 version.). Frontend and backend communicate via MsgThread's message passing. - MsgThread (and thus WriterBackend) has a Heartbeat() method that a thread can override to execute code on a regular basis. It's triggered roughly once a second by the main thread. - Integration into "the rest of Bro". Threads can send messages to the reporter and do debugging output; they are hooked into the I/O loop for sending messages back; and there's a new debugging stream "threading" that logs, well, threading activity. This all seems to work for the most part, but it's not done yet. TODO list: - Not all tests pass yet. In particular, diffs for the external tests seem to indicate some memory problem (no crashes, just an occasional weird character). - Only tested in --enable-debug mode. - Only tested on Linux. - Needs leak check. - Each log write is currently a single inter-thread message. Bring Gilbert's bulk writes back. - Code needs further cleanup. - Document the class API. - Document the internal structure of the logging framework. - Check for robustness: live traffic, aborting, signals, etc. - Add thread statistics to profile.log (most of the code is there). - Customize the OS-visible thread names on platforms that support it.
63 lines
1.1 KiB
C++
63 lines
1.1 KiB
C++
|
|
#ifndef THREADING_BASICTHREAD_H
|
|
#define THREADING_BASICTHREAD_H
|
|
|
|
#include <pthread.h>
|
|
#include <semaphore.h>
|
|
|
|
#include "Queue.h"
|
|
#include "util.h"
|
|
|
|
using namespace std;
|
|
|
|
namespace threading {
|
|
|
|
class Manager;
|
|
|
|
class BasicThread
|
|
{
|
|
public:
|
|
BasicThread(const string& name); // Managed by manager, must not delete otherwise.
|
|
virtual ~BasicThread();
|
|
|
|
const string& Name() const { return name; }
|
|
|
|
void Start(); // Spawns the thread and enters Run().
|
|
void Stop(); // Signals the thread to terminate.
|
|
|
|
bool Terminating() const { return terminating; }
|
|
|
|
// A thread-safe version of fmt().
|
|
const char* Fmt(const char* format, ...);
|
|
|
|
protected:
|
|
virtual void Run() = 0;
|
|
|
|
virtual void OnStart() {}
|
|
virtual void OnStop() {}
|
|
|
|
private:
|
|
friend class Manager;
|
|
|
|
static void* launcher(void *arg);
|
|
|
|
// Used from the ThreadMgr.
|
|
void Join(); // Waits until the thread has terminated and then joins it.
|
|
|
|
bool started; // Set to to true once running.
|
|
bool terminating; // Set to to true to signal termination.
|
|
string name;
|
|
|
|
pthread_t pthread;
|
|
sem_t terminate;
|
|
|
|
// For implementing Fmt().
|
|
char* buf;
|
|
unsigned int buf_len;
|
|
};
|
|
|
|
}
|
|
|
|
extern threading::Manager* thread_mgr;
|
|
|
|
#endif
|