pdb: more changes to monitor list handling
This commit is contained in:
@ -254,16 +254,7 @@ public:
|
||||
|
||||
virtual void destroy()
|
||||
{
|
||||
bool run;
|
||||
{
|
||||
guard_t G(lock);
|
||||
run = running;
|
||||
if(run) {
|
||||
running = false;
|
||||
}
|
||||
}
|
||||
if(run)
|
||||
this->onStop();
|
||||
stop();
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -91,8 +91,8 @@ void pdb_group_event(void *user_arg, struct dbChannel *chan,
|
||||
}
|
||||
|
||||
while(!self->interested_remove.empty()) {
|
||||
PDBGroupPV::interested_t::iterator first(self->interested_remove.begin());
|
||||
self->interested.erase(*first);
|
||||
PDBGroupPV::interested_remove_t::iterator first(self->interested_remove.begin());
|
||||
self->interested.erase(static_cast<PDBGroupMonitor*>(first->get()));
|
||||
self->interested_remove.erase(first);
|
||||
}
|
||||
|
||||
@ -185,8 +185,13 @@ void PDBGroupPV::removeMonitor(PDBGroupMonitor *mon)
|
||||
{
|
||||
Guard G(lock);
|
||||
|
||||
if(interested_iterating) {
|
||||
interested_remove.insert(mon);
|
||||
if(interested_add.erase(mon)) {
|
||||
// and+remove while iterating. no-op
|
||||
|
||||
} else if(interested_iterating) {
|
||||
// keep the monitor alive until we've finished iterating
|
||||
interested_remove.insert(mon->shared_from_this());
|
||||
|
||||
} else {
|
||||
interested.erase(mon);
|
||||
finalizeMonitor();
|
||||
@ -410,7 +415,7 @@ void PDBGroupMonitor::onStart()
|
||||
|
||||
void PDBGroupMonitor::onStop()
|
||||
{
|
||||
pv->addMonitor(this);
|
||||
pv->removeMonitor(this);
|
||||
}
|
||||
|
||||
void PDBGroupMonitor::requestUpdate()
|
||||
|
@ -109,7 +109,10 @@ struct epicsShareClass PDBGroupPV : public PDBPV
|
||||
|
||||
typedef std::set<PDBGroupMonitor*> interested_t;
|
||||
bool interested_iterating;
|
||||
interested_t interested, interested_add, interested_remove;
|
||||
interested_t interested, interested_add;
|
||||
|
||||
typedef std::set<BaseMonitor::shared_pointer> interested_remove_t;
|
||||
interested_remove_t interested_remove;
|
||||
|
||||
size_t initial_waits;
|
||||
|
||||
|
@ -73,8 +73,8 @@ void pdb_single_event(void *user_arg, struct dbChannel *chan,
|
||||
}
|
||||
|
||||
while(!self->interested_remove.empty()) {
|
||||
PDBSinglePV::interested_t::iterator first(self->interested_remove.begin());
|
||||
self->interested.erase(*first);
|
||||
PDBSinglePV::interested_remove_t::iterator first(self->interested_remove.begin());
|
||||
self->interested.erase(static_cast<PDBSingleMonitor*>(first->get()));
|
||||
self->interested_remove.erase(first);
|
||||
}
|
||||
|
||||
@ -169,8 +169,13 @@ void PDBSinglePV::removeMonitor(PDBSingleMonitor* mon)
|
||||
{
|
||||
Guard G(lock);
|
||||
|
||||
if(interested_iterating) {
|
||||
interested_remove.insert(mon);
|
||||
if(interested_add.erase(mon)) {
|
||||
// and+remove while iterating. no-op
|
||||
|
||||
} else if(interested_iterating) {
|
||||
// keep monitor alive while iterating
|
||||
interested_remove.insert(mon->shared_from_this());
|
||||
|
||||
} else {
|
||||
interested.erase(mon);
|
||||
finalizeMonitor();
|
||||
|
@ -46,7 +46,10 @@ struct epicsShareClass PDBSinglePV : public PDBPV
|
||||
|
||||
typedef std::set<PDBSingleMonitor*> interested_t;
|
||||
bool interested_iterating;
|
||||
interested_t interested, interested_add, interested_remove;
|
||||
interested_t interested, interested_add;
|
||||
|
||||
typedef std::set<BaseMonitor::shared_pointer> interested_remove_t;
|
||||
interested_remove_t interested_remove;
|
||||
|
||||
DBEvent evt_VALUE, evt_PROPERTY;
|
||||
bool hadevent_VALUE, hadevent_PROPERTY;
|
||||
|
Reference in New Issue
Block a user