From: <ag...@us...> - 2011-11-18 18:39:02
|
Revision: 2612 http://zoolib.svn.sourceforge.net/zoolib/?rev=2612&view=rev Author: agreen Date: 2011-11-18 18:38:56 +0000 (Fri, 18 Nov 2011) Log Message: ----------- As callables are set from construction onwards we don't need as much protection. Modified Paths: -------------- trunk/zoolib/source/cxx/zoolib/ZRoster.cpp trunk/zoolib/source/cxx/zoolib/ZRoster.h Modified: trunk/zoolib/source/cxx/zoolib/ZRoster.cpp =================================================================== --- trunk/zoolib/source/cxx/zoolib/ZRoster.cpp 2011-11-18 18:37:54 UTC (rev 2611) +++ trunk/zoolib/source/cxx/zoolib/ZRoster.cpp 2011-11-18 18:38:56 UTC (rev 2612) @@ -25,6 +25,7 @@ namespace ZooLib { +using std::set; using std::vector; // ================================================================================================= @@ -46,46 +47,37 @@ void ZRoster::Finalize() { ZGuardRMtx guard(fMtx); - vector<ZRef<Entry> > local(fEntries.begin(), fEntries.end()); - ZRef<ZCallable_Void> theCallable = fCallable_Gone; - for (vector<ZRef<Entry> >::const_iterator ii = local.begin(); ii != local.end(); ++ii) + if (not this->FinishFinalize()) + return; + + for (set<Entry*>::const_iterator ii = fEntries.begin(); ii != fEntries.end(); ++ii) (*ii)->fRoster.Clear(); - if (this->FinishFinalize()) - { - guard.Release(); - sCall(theCallable); - delete this; - } - else - { - // Rare/impossible? Someone snagged a strong reference, reinstate entries' weak references. - ZRef<ZRoster> thisRef = this; - for (vector<ZRef<Entry> >::const_iterator ii = local.begin(); ii != local.end(); ++ii) - (*ii)->fRoster = thisRef; - } + ZRef<ZCallable_Void> theCallable = fCallable_Gone; + + guard.Release(); + + delete this; + + sCall(theCallable); } ZRef<ZRoster::Entry> ZRoster::MakeEntry() { return this->MakeEntry(null, null); } -ZRef<ZRoster::Entry> ZRoster::MakeEntry - (const ZRef<ZCallable_Void>& iCallable_Broadcast, const ZRef<ZCallable_Void>& iCallable_Gone) +ZRef<ZRoster::Entry> ZRoster::MakeEntry(const ZRef<ZCallable_Void>& iCallable_Broadcast, + const ZRef<ZCallable_Void>& iCallable_Gone) { - ZRef<ZRoster> thisRef = this; + ZRef<Entry> theEntry = new Entry(this, iCallable_Broadcast, iCallable_Gone); - ZGuardRMtx guard(fMtx); - - ZRef<Entry> theEntry = new Entry(thisRef, iCallable_Broadcast, null); + { + ZAcqMtx acq(fMtx); ZUtil_STL::sInsertMustNotContain(fEntries, theEntry.Get()); fCnd.Broadcast(); + } - if (ZRef<ZCallable_Void> theCallable = fCallable_Change) - { - guard.Release(); - theCallable->Call(); - } + sCall(fCallable_Change); return theEntry; } @@ -97,15 +89,7 @@ guard.Release(); for (vector<ZRef<Entry> >::const_iterator ii = local.begin(); ii != local.end(); ++ii) - { - ZGuardRMtx guardEntry((*ii)->fMtx); - if (ZRef<ZCallable_Void> theCallable = (*ii)->fCallable_Broadcast) - { - guardEntry.Release(); - theCallable->Call(); - guardEntry.Acquire(); - } - } + sCall((*ii)->fCallable_Broadcast); } size_t ZRoster::Count() @@ -139,20 +123,20 @@ void ZRoster::pFinalizeEntry(Entry* iEntry, const ZRef<ZCallable_Void>& iCallable_Gone) { - ZGuardRMtx guard(fMtx); + { + ZAcqMtx acq(fMtx); - if (iEntry->FinishFinalize()) - { - ZUtil_STL::sEraseMustContain(fEntries, iEntry); - delete iEntry; - fCnd.Broadcast(); - ZRef<ZCallable_Void> theCallable_Change = fCallable_Change; - guard.Release(); - - sCall(theCallable_Change); - sCall(iCallable_Gone); - } + if (not iEntry->FinishFinalize()) + return; + + ZUtil_STL::sEraseMustContain(fEntries, iEntry); + delete iEntry; + fCnd.Broadcast(); } + + sCall(fCallable_Change); + sCall(iCallable_Gone); + } // ================================================================================================= #pragma mark - @@ -171,18 +155,15 @@ {} void ZRoster::Entry::Finalize() - { - ZGuardRMtx guard(fMtx); + { ZRef<ZCallable_Void> theCallable = fCallable_Gone; if (ZRef<ZRoster> theRoster = fRoster) { - guard.Release(); theRoster->pFinalizeEntry(this, theCallable); } else if (this->FinishFinalize()) { - guard.Release(); delete this; sCall(theCallable); } Modified: trunk/zoolib/source/cxx/zoolib/ZRoster.h =================================================================== --- trunk/zoolib/source/cxx/zoolib/ZRoster.h 2011-11-18 18:37:54 UTC (rev 2611) +++ trunk/zoolib/source/cxx/zoolib/ZRoster.h 2011-11-18 18:38:56 UTC (rev 2612) @@ -70,8 +70,8 @@ ZMtx fMtx; ZCnd fCnd; std::set<Entry*> fEntries; - ZRef<ZCallable_Void> fCallable_Change; - ZRef<ZCallable_Void> fCallable_Gone; + const ZRef<ZCallable_Void> fCallable_Change; + const ZRef<ZCallable_Void> fCallable_Gone; friend class Entry; }; @@ -99,9 +99,8 @@ private: ZWeakRef<ZRoster> fRoster; - ZMtx fMtx; - ZRef<ZCallable_Void> fCallable_Broadcast; - ZRef<ZCallable_Void> fCallable_Gone; + const ZRef<ZCallable_Void> fCallable_Broadcast; + const ZRef<ZCallable_Void> fCallable_Gone; friend class ZRoster; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |