From 3dfdda667a2c8b950e09d26b06721bf930d4f39e Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Wed, 29 Nov 2017 09:48:54 -0600 Subject: [PATCH] avoid possible lock order issue with interested_remove Ensure that Monitors aren't destroy()'d with an extra, unnecessary, lock held. --- pdbApp/pdbgroup.cpp | 10 ++++++---- pdbApp/pdbsingle.cpp | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/pdbApp/pdbgroup.cpp b/pdbApp/pdbgroup.cpp index 75efc50..bfa8b0a 100644 --- a/pdbApp/pdbgroup.cpp +++ b/pdbApp/pdbgroup.cpp @@ -82,6 +82,7 @@ void pdb_group_event(void *user_arg, struct dbChannel *chan, mon.post(self->scratch); } + PDBGroupPV::interested_remove_t temp; { Guard G(self->lock); @@ -93,10 +94,11 @@ void pdb_group_event(void *user_arg, struct dbChannel *chan, self->interested_add.erase(first); } - while(!self->interested_remove.empty()) { - PDBGroupPV::interested_remove_t::iterator first(self->interested_remove.begin()); - self->interested.erase(static_cast(first->get())); - self->interested_remove.erase(first); + temp.swap(self->interested_remove); + for(PDBGroupPV::interested_remove_t::iterator it(temp.begin()), + end(temp.end()); it != end; ++it) + { + self->interested.erase(static_cast(it->get())); } self->interested_iterating = false; diff --git a/pdbApp/pdbsingle.cpp b/pdbApp/pdbsingle.cpp index 548cf8f..07d3be6 100644 --- a/pdbApp/pdbsingle.cpp +++ b/pdbApp/pdbsingle.cpp @@ -61,6 +61,7 @@ void pdb_single_event(void *user_arg, struct dbChannel *chan, mon.post(self->scratch); } + PDBSinglePV::interested_remove_t temp; { Guard G(self->lock); @@ -72,10 +73,11 @@ void pdb_single_event(void *user_arg, struct dbChannel *chan, self->interested_add.erase(first); } - while(!self->interested_remove.empty()) { - PDBSinglePV::interested_remove_t::iterator first(self->interested_remove.begin()); - self->interested.erase(static_cast(first->get())); - self->interested_remove.erase(first); + temp.swap(self->interested_remove); + for(PDBSinglePV::interested_remove_t::iterator it(temp.begin()), + end(temp.end()); it != end; ++it) + { + self->interested.erase(static_cast(it->get())); } self->interested_iterating = false;