mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00

These are non-functional changes. * accounting * activation * actual * added * addresult * aggregable * aligned * alternatively * ambiguous * analysis * analyzer * anticlimactic * apparently * application * appropriate * arithmetic * assignment * assigns * associated * authentication * authoritative * barrier * boundary * broccoli * buffering * caching * called * canonicalized * capturing * certificates * ciphersuite * columns * communication * comparison * comparisons * compilation * component * concatenating * concatenation * connection * convenience * correctly * corresponding * could * counting * data * declared * decryption * defining * dependent * deprecated * detached * dictionary * directional * directly * directory * discarding * disconnecting * distinguishes * documentation * elsewhere * emitted * empty * endianness * endpoint * enumerator * essentially * evaluated * everything * exactly * execute * explicit * expressions * facilitates * fiddling * filesystem * flag * flagged * for * fragments * guarantee * guaranteed * happen * happening * hemisphere * identifier * identifies * identify * implementation * implemented * implementing * including * inconsistency * indeterminate * indices * individual * information * initial * initialization * initialize * initialized * initializes * instantiate * instantiated * instantiates * interface * internal * interpreted * interpreter * into * it * iterators * length * likely * log * longer * mainly * mark * maximum * message * minimum * module * must * name * namespace * necessary * nonexistent * not * notifications * notifier * number * objects * occurred * operations * original * otherwise * output * overridden * override * overriding * overwriting * ownership * parameters * particular * payload * persistent * potential * precision * preexisting * preservation * preserved * primarily * probably * procedure * proceed * process * processed * processes * processing * propagate * propagated * prototype * provides * publishing * purposes * queue * reached * reason * reassem * reassemble * reassembler * recommend * record * reduction * reference * regularly * representation * request * reserved * retrieve * returning * separate * should * shouldn't * significant * signing * simplified * simultaneously * single * somebody * sources * specific * specification * specified * specifies * specify * statement * subdirectories * succeeded * successful * successfully * supplied * synchronization * tag * temporarily * terminating * that * the * transmitted * true * truncated * try * understand * unescaped * unforwarding * unknown * unknowndata * unspecified * update * usually * which * wildcard Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
125 lines
2.9 KiB
C++
125 lines
2.9 KiB
C++
// See the file "COPYING" in the main distribution directory for copyright.
|
|
//
|
|
// A notification framework to inform interested parties of modifications to
|
|
// selected global objects. To get notified about a change, derive a class
|
|
// from notifier::Receiver and register the interesting objects with the
|
|
// notification::Registry.
|
|
|
|
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <unordered_map>
|
|
|
|
namespace zeek::notifier::detail
|
|
{
|
|
|
|
class Modifiable;
|
|
|
|
/** Interface class for receivers of notifications. */
|
|
class Receiver
|
|
{
|
|
public:
|
|
Receiver();
|
|
virtual ~Receiver();
|
|
|
|
/**
|
|
* Callback executed when a register object has been modified.
|
|
*
|
|
* @param m object that was modified
|
|
*/
|
|
virtual void Modified(Modifiable* m) = 0;
|
|
|
|
/**
|
|
* Callback executed when notification registry is terminating and
|
|
* no further modifications can possibly occur.
|
|
*/
|
|
virtual void Terminate() { }
|
|
};
|
|
|
|
/** Singleton class tracking all notification requests globally. */
|
|
class Registry
|
|
{
|
|
public:
|
|
~Registry();
|
|
|
|
/**
|
|
* Registers a receiver to be informed when a modifiable object has
|
|
* changed.
|
|
*
|
|
* @param m object to track. Does not take ownership, but the object
|
|
* will automatically unregister itself on destruction.
|
|
*
|
|
* @param r receiver to notify on changes. Does not take ownership,
|
|
* the receiver must remain valid as long as the registration stays
|
|
* in place.
|
|
*/
|
|
void Register(Modifiable* m, Receiver* r);
|
|
|
|
/**
|
|
* Cancels a receiver's request to be informed about an object's
|
|
* modification. The arguments to the method must match what was
|
|
* originally registered.
|
|
*
|
|
* @param m object to no longer track.
|
|
*
|
|
* @param r receiver to no longer notify.
|
|
*/
|
|
void Unregister(Modifiable* m, Receiver* Receiver);
|
|
|
|
/**
|
|
* Cancels any active receiver requests to be informed about a
|
|
* particular object's modifications.
|
|
*
|
|
* @param m object to no longer track.
|
|
*/
|
|
void Unregister(Modifiable* m);
|
|
|
|
/**
|
|
* Notifies all receivers that no further modifications will occur
|
|
* as the registry is shutting down.
|
|
*/
|
|
void Terminate();
|
|
|
|
private:
|
|
friend class Modifiable;
|
|
|
|
// Inform all registered receivers of a modification to an object.
|
|
// Will be called from the object itself.
|
|
void Modified(Modifiable* m);
|
|
|
|
using ModifiableMap = std::unordered_multimap<Modifiable*, Receiver*>;
|
|
ModifiableMap registrations;
|
|
};
|
|
|
|
/**
|
|
* Singleton object tracking all global notification requests.
|
|
*/
|
|
extern Registry registry;
|
|
|
|
/**
|
|
* Base class for objects that can trigger notifications to receivers when
|
|
* modified.
|
|
*/
|
|
class Modifiable
|
|
{
|
|
public:
|
|
/**
|
|
* Calling this method signals to all registered receivers that the
|
|
* object has been modified.
|
|
*/
|
|
void Modified()
|
|
{
|
|
if ( num_receivers )
|
|
registry.Modified(this);
|
|
}
|
|
|
|
protected:
|
|
friend class Registry;
|
|
|
|
virtual ~Modifiable();
|
|
|
|
// Number of currently registered receivers.
|
|
uint64_t num_receivers = 0;
|
|
};
|
|
|
|
} // namespace zeek::notifier::detail
|