Index: base/android/java/src/org/chromium/base/ObserverList.java |
diff --git a/base/android/java/src/org/chromium/base/ObserverList.java b/base/android/java/src/org/chromium/base/ObserverList.java |
index e812b0de4341e0ac21fed05c71b1a268abb18c0d..7a2ab984feb2351ff8c786eceead74e832d2cc18 100644 |
--- a/base/android/java/src/org/chromium/base/ObserverList.java |
+++ b/base/android/java/src/org/chromium/base/ObserverList.java |
@@ -46,6 +46,7 @@ public class ObserverList<E> implements Iterable<E> { |
public final List<E> mObservers = new ArrayList<E>(); |
private int mIterationDepth = 0; |
private int mCount = 0; |
+ private boolean mNeedsCompact = false; |
public ObserverList() {} |
@@ -91,6 +92,7 @@ public class ObserverList<E> implements Iterable<E> { |
// No one is iterating over the list. |
mObservers.remove(index); |
} else { |
+ mNeedsCompact = true; |
mObservers.set(index, null); |
} |
--mCount; |
@@ -112,6 +114,7 @@ public class ObserverList<E> implements Iterable<E> { |
} |
int size = mObservers.size(); |
+ mNeedsCompact |= size != 0; |
for (int i = 0; i < size; i++) { |
mObservers.set(i, null); |
} |
@@ -167,7 +170,10 @@ public class ObserverList<E> implements Iterable<E> { |
private void decrementIterationDepthAndCompactIfNeeded() { |
mIterationDepth--; |
assert mIterationDepth >= 0; |
- if (mIterationDepth == 0) compact(); |
+ if (mIterationDepth > 0) return; |
+ if (!mNeedsCompact) return; |
+ mNeedsCompact = false; |
+ compact(); |
} |
/** |