diff options
| author | 2025-01-08 20:25:07 -0800 | |
|---|---|---|
| committer | 2025-01-08 20:25:07 -0800 | |
| commit | 16d2494a4db722ddefbe51a3b471e0f007d8737e (patch) | |
| tree | 8429130ad27f69aca05d066dbda6659e8922ced1 | |
| parent | 176c5931d7315c9bd78d1ec0b32fb7d0c82231b4 (diff) | |
| parent | 670df0a2bbf9c58030fc0486b22679a5eb7af522 (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.java | 28 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/PersisterQueueTests.java | 11 |
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()); |