diff options
Diffstat (limited to 'www/waterfox/files/patch-bug1425930')
-rw-r--r-- | www/waterfox/files/patch-bug1425930 | 66 |
1 files changed, 0 insertions, 66 deletions
diff --git a/www/waterfox/files/patch-bug1425930 b/www/waterfox/files/patch-bug1425930 deleted file mode 100644 index ca6d6af5e015..000000000000 --- a/www/waterfox/files/patch-bug1425930 +++ /dev/null @@ -1,66 +0,0 @@ -commit dc0965023fb7 -Author: Randell Jesup <rjesup@jesup.org> -Date: Mon May 21 15:30:35 2018 -0400 - - Bug 1425930 - Handle Broadcast()->Notify() calling RemoveObserver(). r=froydnj, a=abillings - - --HG-- - extra : source : a314710b0acd38afc7de74f0306f514b50d84463 ---- - xpcom/ds/Observer.h | 28 ++++++++++++++++++++++++---- - 1 file changed, 24 insertions(+), 4 deletions(-) - -diff --git xpcom/ds/Observer.h xpcom/ds/Observer.h -index 958e5e4a9694e..83d650a936ccc 100644 ---- xpcom/ds/Observer.h -+++ xpcom/ds/Observer.h -@@ -57,7 +57,17 @@ public: - */ - bool RemoveObserver(Observer<T>* aObserver) - { -- return mObservers.RemoveElement(aObserver); -+ if (mObservers.RemoveElement(aObserver)) { -+ if (!mBroadcastCopy.IsEmpty()) { -+ // Annoyingly, someone could RemoveObserver() an item on the list -+ // while we're in a Broadcast()'s Notify() call. -+ auto i = mBroadcastCopy.IndexOf(aObserver); -+ MOZ_ASSERT(i != mBroadcastCopy.NoIndex); -+ mBroadcastCopy[i] = nullptr; -+ } -+ return true; -+ } -+ return false; - } - - uint32_t Length() -@@ -65,17 +75,27 @@ public: - return mObservers.Length(); - } - -+ /** -+ * Call Notify() on each item in the list. -+ * Handles the case of Notify() calling RemoveObserver() -+ */ - void Broadcast(const T& aParam) - { -- nsTArray<Observer<T>*> observersCopy(mObservers); -- uint32_t size = observersCopy.Length(); -+ MOZ_ASSERT(mBroadcastCopy.IsEmpty()); -+ mBroadcastCopy = mObservers; -+ uint32_t size = mBroadcastCopy.Length(); - for (uint32_t i = 0; i < size; ++i) { -- observersCopy[i]->Notify(aParam); -+ // nulled if Removed during Broadcast -+ if (mBroadcastCopy[i]) { -+ mBroadcastCopy[i]->Notify(aParam); -+ } - } -+ mBroadcastCopy.Clear(); - } - - protected: - nsTArray<Observer<T>*> mObservers; -+ nsTArray<Observer<T>*> mBroadcastCopy; - }; - - } // namespace mozilla |