summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2025-01-08 20:25:07 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-01-08 20:25:07 -0800
commit16d2494a4db722ddefbe51a3b471e0f007d8737e (patch)
tree8429130ad27f69aca05d066dbda6659e8922ced1
parent176c5931d7315c9bd78d1ec0b32fb7d0c82231b4 (diff)
parent670df0a2bbf9c58030fc0486b22679a5eb7af522 (diff)
Merge "Wait until the thread is waiting before issuing next task" into main
-rw-r--r--services/core/java/com/android/server/wm/PersisterQueue.java28
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/PersisterQueueTests.java11
2 files changed, 34 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/PersisterQueue.java b/services/core/java/com/android/server/wm/PersisterQueue.java
index 9dc3d6a81338..bc16a566bfef 100644
--- a/services/core/java/com/android/server/wm/PersisterQueue.java
+++ b/services/core/java/com/android/server/wm/PersisterQueue.java
@@ -86,6 +86,34 @@ class PersisterQueue {
mLazyTaskWriterThread = new LazyTaskWriterThread("LazyTaskWriterThread");
}
+ /**
+ * Busy wait until {@link #mLazyTaskWriterThread} is in {@link Thread.State#WAITING}, or
+ * times out. This indicates the thread is waiting for new tasks to appear. If the wait
+ * succeeds, this queue waits at least {@link #mPreTaskDelayMs} milliseconds before running the
+ * next task.
+ *
+ * <p>This is for testing purposes only.
+ *
+ * @param timeoutMillis the maximum time of waiting in milliseconds
+ * @return {@code true} if the thread is in {@link Thread.State#WAITING} at return
+ */
+ @VisibleForTesting
+ boolean waitUntilWritingThreadIsWaiting(long timeoutMillis) {
+ final long timeoutTime = SystemClock.uptimeMillis() + timeoutMillis;
+ do {
+ Thread.State state;
+ synchronized (this) {
+ state = mLazyTaskWriterThread.getState();
+ }
+ if (state == Thread.State.WAITING) {
+ return true;
+ }
+ Thread.yield();
+ } while (SystemClock.uptimeMillis() < timeoutTime);
+
+ return false;
+ }
+
synchronized void startPersisting() {
if (!mLazyTaskWriterThread.isAlive()) {
mLazyTaskWriterThread.start();
diff --git a/services/tests/wmtests/src/com/android/server/wm/PersisterQueueTests.java b/services/tests/wmtests/src/com/android/server/wm/PersisterQueueTests.java
index 3e87f1f96fcd..ee9673f5ee77 100644
--- a/services/tests/wmtests/src/com/android/server/wm/PersisterQueueTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/PersisterQueueTests.java
@@ -177,15 +177,16 @@ public class PersisterQueueTests {
assertTrue("Target didn't call callback enough times.",
mListener.waitForAllExpectedCallbackDone(TIMEOUT_ALLOWANCE));
+ // Wait until writing thread is waiting, which indicates the thread is waiting for new tasks
+ // to appear.
+ assertTrue("Failed to wait until the writing thread is waiting.",
+ mTarget.waitUntilWritingThreadIsWaiting(TIMEOUT_ALLOWANCE));
+
// Second item
mFactory.setExpectedProcessedItemNumber(1);
mListener.setExpectedOnPreProcessItemCallbackTimes(1);
dispatchTime = SystemClock.uptimeMillis();
- // Synchronize on the instance to make sure we schedule the item after it starts to wait for
- // task indefinitely.
- synchronized (mTarget) {
- mTarget.addItem(mFactory.createItem(), false);
- }
+ mTarget.addItem(mFactory.createItem(), false);
assertTrue("Target didn't process item enough times.",
mFactory.waitForAllExpectedItemsProcessed(PRE_TASK_DELAY_MS + TIMEOUT_ALLOWANCE));
assertEquals("Target didn't process all items.", 2, mFactory.getTotalProcessedItemCount());