mirror of
https://github.com/zeek/zeek.git
synced 2025-10-09 10:08:20 +00:00

Fixed a few small bugs - Modifiable had an uninitialized member and the Registry looped over a map while deleting elements from it. Fixes GH-319 * remotes/origin/topic/robin/gh59-when: Renaming src/StateAccess.{h,cc} to src/Notifier.{h,cc}. Clean up new code. Remove MutableVal class. Redo API for notifiers. Remove most of MutableVal (but not the class itelf yet) Remove enum Opcode. Remove StateAccess class. Redo NotfifierRegistry to no longer rely on StateAccess. Add new test for when-statement watching global variables. Couple of compile fixes.
72 lines
1.6 KiB
C++
72 lines
1.6 KiB
C++
// See the file "COPYING" in the main distribution directory for copyright.
|
|
|
|
#include "DebugLogger.h"
|
|
#include "Notifier.h"
|
|
|
|
notifier::Registry notifier::registry;
|
|
|
|
notifier::Receiver::Receiver()
|
|
{
|
|
DBG_LOG(DBG_NOTIFIERS, "creating receiver %p", this);
|
|
}
|
|
|
|
notifier::Receiver::~Receiver()
|
|
{
|
|
DBG_LOG(DBG_NOTIFIERS, "deleting receiver %p", this);
|
|
}
|
|
|
|
notifier::Registry::~Registry()
|
|
{
|
|
while ( registrations.begin() != registrations.end() )
|
|
Unregister(registrations.begin()->first);
|
|
}
|
|
|
|
void notifier::Registry::Register(Modifiable* m, notifier::Receiver* r)
|
|
{
|
|
DBG_LOG(DBG_NOTIFIERS, "registering object %p for receiver %p", m, r);
|
|
|
|
registrations.insert({m, r});
|
|
++m->num_receivers;
|
|
}
|
|
|
|
void notifier::Registry::Unregister(Modifiable* m, notifier::Receiver* r)
|
|
{
|
|
DBG_LOG(DBG_NOTIFIERS, "unregistering object %p from receiver %p", m, r);
|
|
|
|
auto x = registrations.equal_range(m);
|
|
for ( auto i = x.first; i != x.second; i++ )
|
|
{
|
|
if ( i->second == r )
|
|
{
|
|
--i->first->num_receivers;
|
|
registrations.erase(i);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void notifier::Registry::Unregister(Modifiable* m)
|
|
{
|
|
DBG_LOG(DBG_NOTIFIERS, "unregistering object %p from all notifiers", m);
|
|
|
|
auto x = registrations.equal_range(m);
|
|
for ( auto i = x.first; i != x.second; i++ )
|
|
--i->first->num_receivers;
|
|
|
|
registrations.erase(x.first, x.second);
|
|
}
|
|
|
|
void notifier::Registry::Modified(Modifiable* m)
|
|
{
|
|
DBG_LOG(DBG_NOTIFIERS, "object %p has been modified", m);
|
|
|
|
auto x = registrations.equal_range(m);
|
|
for ( auto i = x.first; i != x.second; i++ )
|
|
i->second->Modified(m);
|
|
}
|
|
|
|
notifier::Modifiable::~Modifiable()
|
|
{
|
|
if ( num_receivers )
|
|
registry.Unregister(this);
|
|
}
|