Reapplying r5785 now that the build is succeeding. It had been rolled back as part of r5794. git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5861 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java b/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java index 6545297..056cf51 100644 --- a/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java +++ b/user/src/com/google/gwt/core/client/impl/AsyncFragmentLoader.java
@@ -108,8 +108,9 @@ /** * A trivial queue of int's that should compile much better than a - * LinkedList<Integer>. It assumes that there will be a maximum number - * of items passed through the queue for its entire life. + * LinkedList<Integer>. It assumes that it has a bound on the number of + * items added to the queue. Removing items does not free up more space, but + * calling <code>clear()</code> does. */ private static class BoundedIntQueue { private final int[] array; @@ -119,22 +120,31 @@ public BoundedIntQueue(int maxPuts) { array = new int[maxPuts]; } - + public void add(int x) { assert (write < array.length); array[write++] = x; } - + + /** + * Removes all elements, and also makes all space in the queue available + * again. + */ + public void clear() { + read = 0; + write = 0; + } + public int peek() { assert read < write; return array[read]; } - + public int remove() { assert read < write; return array[read++]; } - + public int size() { return write - read; } @@ -178,6 +188,12 @@ waitingForInitialFragments.remove(); } + /* + * Call clear() here so that waitingForInitialFragments makes all of its + * space available for later requests. + */ + waitingForInitialFragments.clear(); + // add handlers for pending initial fragment downloads handlersToRun.addAll(initialFragmentErrorHandlers.values()); initialFragmentErrorHandlers.clear();
diff --git a/user/test/com/google/gwt/core/client/impl/AsyncFragmentLoaderTest.java b/user/test/com/google/gwt/core/client/impl/AsyncFragmentLoaderTest.java index 45f25b8..7e237e7 100644 --- a/user/test/com/google/gwt/core/client/impl/AsyncFragmentLoaderTest.java +++ b/user/test/com/google/gwt/core/client/impl/AsyncFragmentLoaderTest.java
@@ -239,6 +239,30 @@ } /** + * This test catches a case in an earlier version of AsyncFragmentLoader where + * AsyncFragmentLoader.waitingForInitialFragments could exhaust its available + * space. + */ + public void testOverflowInWaitingForInitialFragments() { + MockLoadStrategy reqs = new MockLoadStrategy(); + int numEntries = 6; + AsyncFragmentLoader loader = new AsyncFragmentLoader(numEntries, new int[] { + 1, 2, 3}, reqs, NULL_LOGGER); + + /* + * Repeatedly queue up extra downloads waiting on an initial and then fail. + */ + for (int i = 0; i < 10; i++) { + MockErrorHandler error = new MockErrorHandler(); + loader.inject(4, error); + reqs.assertFragmentsRequested(1); + + loadFailed(reqs, 1); + assertTrue(error.getWasCalled()); + } + } + + /** * A thorough exercise of loading with an initial load sequence specified. */ public void testWithInitialLoadSequence() {