Ignore OOMEs in ThreadStress' QueuedWait operation.
Previous work on ThreadStress' QueuedWait operation avoided some
out-of-memory issues by by forcing ahead-of-time initialization of
classes used by the Semaphore class (see
https://android-review.googlesource.com/508595).
However, the execution of code from the Semaphore can still throw an
OutOfMemoryError as some of its code paths allocate memory. In that
case (which is expected to be rare), just ignore the OOME and continue
the execution.
Test: art/test/testrunner/testrunner.py -t 004-ThreadStress
Bug: 71570713
Change-Id: I0970e9cc768ce69c669ed75ade22961700ed4549
diff --git a/test/004-ThreadStress/src/Main.java b/test/004-ThreadStress/src/Main.java
index a9e0faf..6ad160c 100644
--- a/test/004-ThreadStress/src/Main.java
+++ b/test/004-ThreadStress/src/Main.java
@@ -267,6 +267,15 @@
semaphore.acquire();
permitAcquired = true;
Thread.sleep(SLEEP_TIME);
+ } catch (OutOfMemoryError ignored) {
+ // The call to semaphore.acquire() above may trigger an OOME,
+ // despite the care taken doing some warm-up by forcing
+ // ahead-of-time initialization of classes used by the Semaphore
+ // class (see forceTransitiveClassInitialization below).
+ // For instance, one of the code paths executes
+ // AbstractQueuedSynchronizer.addWaiter, which allocates an
+ // AbstractQueuedSynchronizer$Node (see b/67730573).
+ // In that case, just ignore the OOME and continue.
} catch (InterruptedException ignored) {
} finally {
if (permitAcquired) {