pdb: more changes to monitor list handling

This commit is contained in:
Michael Davidsaver
2017-11-05 17:50:34 -06:00
parent e7fa7b624e
commit 3a53e96b47
5 changed files with 28 additions and 21 deletions

View File

@ -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:

View File

@ -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()

View File

@ -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;

View File

@ -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();

View File

@ -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;