Commit 8babc70c authored by Bret Sepulveda's avatar Bret Sepulveda Committed by Commit Bot

Revert "java: Add a choreographer frame task trait"

This reverts commit f4ba6c5b.

Reason for revert:
content_shell_test_apk failing on Android CFI
Example: https://ci.chromium.org/p/chromium/builders/ci/Android%20CFI/5101
FindIt analysis: https://findit-for-me.appspot.com/waterfall/failure?url=https://build.chromium.org/p/chromium.memory/builders/Android%20CFI/builds/5101

Original change's description:
> java: Add a choreographer frame task trait
> 
> This is useful if you need to guarantee something like a layout pass has
> occurred before your task runs. Tasks posted with TaskTraits.CHOREOGRAPHER_FRAME
> will run next time there's a vsync and after all other ready tasks on the thread
> have run.
> 
> I put the trait under base because from what I understand there is some ui/ code
> that needs it but ui/ can't depend on content/.
> 
> Bug: 863341
> Change-Id: Ibcb7a843866c2b2c4f4394ebd18c8ef7aa33b5bc
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1549114
> Commit-Queue: Alex Clarke <alexclarke@chromium.org>
> Reviewed-by: Yaron Friedman <yfriedman@chromium.org>
> Reviewed-by: Sami Kyöstilä <skyostil@chromium.org>
> Reviewed-by: Karolina Soltys <ksolt@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#652215}

TBR=yfriedman@chromium.org,skyostil@chromium.org,alexclarke@chromium.org,ksolt@chromium.org

Change-Id: I2340b5c6c7ce1ac41e87ef689470e798304eb8a8
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 863341
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1574939Reviewed-by: default avatarBret Sepulveda <bsep@chromium.org>
Commit-Queue: Bret Sepulveda <bsep@chromium.org>
Cr-Commit-Position: refs/heads/master@{#652351}
parent 8e41a5c4
...@@ -3153,7 +3153,6 @@ if (is_android) { ...@@ -3153,7 +3153,6 @@ if (is_android) {
"android/java/src/org/chromium/base/task/AsyncTask.java", "android/java/src/org/chromium/base/task/AsyncTask.java",
"android/java/src/org/chromium/base/task/BackgroundOnlyAsyncTask.java", "android/java/src/org/chromium/base/task/BackgroundOnlyAsyncTask.java",
"android/java/src/org/chromium/base/task/DefaultTaskExecutor.java", "android/java/src/org/chromium/base/task/DefaultTaskExecutor.java",
"android/java/src/org/chromium/base/task/ChoreographerTaskRunner.java",
"android/java/src/org/chromium/base/task/ChromeThreadPoolExecutor.java", "android/java/src/org/chromium/base/task/ChromeThreadPoolExecutor.java",
"android/java/src/org/chromium/base/task/PostTask.java", "android/java/src/org/chromium/base/task/PostTask.java",
"android/java/src/org/chromium/base/task/SequencedTaskRunner.java", "android/java/src/org/chromium/base/task/SequencedTaskRunner.java",
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.task;
import android.view.Choreographer;
/**
* An adapter that allows PostTask to submit Choreographer frame callbacks which
* run after the next vsync.
*/
final class ChoreographerTaskRunner implements SingleThreadTaskRunner {
private final Choreographer mChoreographer;
ChoreographerTaskRunner(Choreographer choreographer) {
mChoreographer = choreographer;
}
@Override
public boolean belongsToCurrentThread() {
try {
return mChoreographer == Choreographer.getInstance();
} catch (IllegalStateException e) {
return false;
}
}
@Override
public void postTask(Runnable task) {
mChoreographer.postFrameCallback(new Choreographer.FrameCallback() {
@Override
public void doFrame(long frameTimeNanos) {
task.run();
}
});
}
@Override
public void destroy() {
// NOP
}
@Override
public void disableLifetimeCheck() {
// NOP
}
@Override
public void postDelayedTask(Runnable task, long delayMillis) {
mChoreographer.postFrameCallbackDelayed(new Choreographer.FrameCallback() {
@Override
public void doFrame(long frameTimeNanos) {
task.run();
}
}, delayMillis);
}
@Override
public void initNativeTaskRunner() {
// NOP
}
}
...@@ -4,10 +4,6 @@ ...@@ -4,10 +4,6 @@
package org.chromium.base.task; package org.chromium.base.task;
import android.view.Choreographer;
import org.chromium.base.ThreadUtils;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -15,18 +11,15 @@ import java.util.Map; ...@@ -15,18 +11,15 @@ import java.util.Map;
* The default {@link TaskExecutor} which maps directly to base::ThreadPool. * The default {@link TaskExecutor} which maps directly to base::ThreadPool.
*/ */
class DefaultTaskExecutor implements TaskExecutor { class DefaultTaskExecutor implements TaskExecutor {
private final Map<TaskTraits, TaskRunner> mTraitsToRunnerMap = new HashMap<>(); Map<TaskTraits, TaskRunner> mTraitsToRunnerMap = new HashMap<>();
private ChoreographerTaskRunner mChoreographerTaskRunner;
@Override @Override
public TaskRunner createTaskRunner(TaskTraits taskTraits) { public TaskRunner createTaskRunner(TaskTraits taskTraits) {
if (taskTraits.mIsChoreographerFrame) return getChoreographerTaskRunner();
return new TaskRunnerImpl(taskTraits); return new TaskRunnerImpl(taskTraits);
} }
@Override @Override
public SequencedTaskRunner createSequencedTaskRunner(TaskTraits taskTraits) { public SequencedTaskRunner createSequencedTaskRunner(TaskTraits taskTraits) {
if (taskTraits.mIsChoreographerFrame) return getChoreographerTaskRunner();
return new SequencedTaskRunnerImpl(taskTraits); return new SequencedTaskRunnerImpl(taskTraits);
} }
...@@ -36,13 +29,12 @@ class DefaultTaskExecutor implements TaskExecutor { ...@@ -36,13 +29,12 @@ class DefaultTaskExecutor implements TaskExecutor {
*/ */
@Override @Override
public SingleThreadTaskRunner createSingleThreadTaskRunner(TaskTraits taskTraits) { public SingleThreadTaskRunner createSingleThreadTaskRunner(TaskTraits taskTraits) {
if (taskTraits.mIsChoreographerFrame) return getChoreographerTaskRunner();
// Tasks posted via this API will not execute until after native has started. // Tasks posted via this API will not execute until after native has started.
return new SingleThreadTaskRunnerImpl(null, taskTraits); return new SingleThreadTaskRunnerImpl(null, taskTraits);
} }
@Override @Override
public synchronized void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) { public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
if (taskTraits.hasExtension()) { if (taskTraits.hasExtension()) {
TaskRunner runner = createTaskRunner(taskTraits); TaskRunner runner = createTaskRunner(taskTraits);
runner.postDelayedTask(task, delay); runner.postDelayedTask(task, delay);
...@@ -65,14 +57,4 @@ class DefaultTaskExecutor implements TaskExecutor { ...@@ -65,14 +57,4 @@ class DefaultTaskExecutor implements TaskExecutor {
public boolean canRunTaskImmediately(TaskTraits traits) { public boolean canRunTaskImmediately(TaskTraits traits) {
return false; return false;
} }
private synchronized ChoreographerTaskRunner getChoreographerTaskRunner() {
// TODO(alexclarke): Migrate to the new Android UI thread trait when available.
ChoreographerTaskRunner choreographerTaskRunner =
ThreadUtils.runOnUiThreadBlockingNoException(
() -> { return new ChoreographerTaskRunner(Choreographer.getInstance()); });
mTraitsToRunnerMap.put(TaskTraits.CHOREOGRAPHER_FRAME, choreographerTaskRunner);
return choreographerTaskRunner;
}
} }
...@@ -54,11 +54,6 @@ public class TaskTraits { ...@@ -54,11 +54,6 @@ public class TaskTraits {
public static final TaskTraits USER_BLOCKING = public static final TaskTraits USER_BLOCKING =
new TaskTraits().taskPriority(TaskPriority.USER_BLOCKING); new TaskTraits().taskPriority(TaskPriority.USER_BLOCKING);
// A bit like requestAnimationFrame, this task will be posted onto the Choreographer
// and will be run on the android main thread after the next vsync.
public static final TaskTraits CHOREOGRAPHER_FRAME =
new TaskTraits().setIsChoreographerFrame(true);
public TaskTraits() {} public TaskTraits() {}
private TaskTraits(TaskTraits other) { private TaskTraits(TaskTraits other) {
...@@ -94,11 +89,6 @@ public class TaskTraits { ...@@ -94,11 +89,6 @@ public class TaskTraits {
return taskTraits; return taskTraits;
} }
private TaskTraits setIsChoreographerFrame(boolean isChoreographerFrame) {
mIsChoreographerFrame = isChoreographerFrame;
return this;
}
// For convenience of the JNI code, we use primitive types only. // For convenience of the JNI code, we use primitive types only.
// Note shutdown behavior is not supported on android. // Note shutdown behavior is not supported on android.
boolean mPrioritySetExplicitly; boolean mPrioritySetExplicitly;
...@@ -106,7 +96,6 @@ public class TaskTraits { ...@@ -106,7 +96,6 @@ public class TaskTraits {
boolean mMayBlock; boolean mMayBlock;
byte mExtensionId = INVALID_EXTENSION_ID; byte mExtensionId = INVALID_EXTENSION_ID;
byte mExtensionData[]; byte mExtensionData[];
boolean mIsChoreographerFrame;
/** /**
* @return true if this task is using some TaskTraits extension. * @return true if this task is using some TaskTraits extension.
...@@ -163,7 +152,6 @@ public class TaskTraits { ...@@ -163,7 +152,6 @@ public class TaskTraits {
hash = 37 * hash + (mMayBlock ? 0 : 1); hash = 37 * hash + (mMayBlock ? 0 : 1);
hash = 37 * hash + (int) mExtensionId; hash = 37 * hash + (int) mExtensionId;
hash = 37 * hash + Arrays.hashCode(mExtensionData); hash = 37 * hash + Arrays.hashCode(mExtensionData);
hash = 37 * hash + (mIsChoreographerFrame ? 0 : 1);
return hash; return hash;
} }
} }
...@@ -18,7 +18,6 @@ import org.chromium.base.test.task.SchedulerTestHelpers; ...@@ -18,7 +18,6 @@ import org.chromium.base.test.task.SchedulerTestHelpers;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
/** /**
...@@ -96,34 +95,4 @@ public class PostTaskTest { ...@@ -96,34 +95,4 @@ public class PostTaskTest {
taskQueue.destroy(); taskQueue.destroy();
} }
} }
@Test
@SmallTest
public void testChoreographerFrameTrait() throws Exception {
List<Integer> orderList = new ArrayList<>();
CountDownLatch latch = new CountDownLatch(2);
PostTask.postTask(TaskTraits.CHOREOGRAPHER_FRAME, new Runnable() {
@Override
public void run() {
synchronized (orderList) {
orderList.add(1);
latch.countDown();
}
}
});
PostTask.postTask(TaskTraits.CHOREOGRAPHER_FRAME, new Runnable() {
@Override
public void run() {
synchronized (orderList) {
orderList.add(2);
latch.countDown();
}
}
});
latch.await();
assertThat(orderList, contains(1, 2));
}
} }
...@@ -32,7 +32,6 @@ import org.chromium.content_public.browser.test.util.UiThreadSchedulerTestUtils; ...@@ -32,7 +32,6 @@ import org.chromium.content_public.browser.test.util.UiThreadSchedulerTestUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
/** /**
...@@ -227,52 +226,6 @@ public class UiThreadSchedulerTest { ...@@ -227,52 +226,6 @@ public class UiThreadSchedulerTest {
Assert.assertTrue(taskExecuted.get()); Assert.assertTrue(taskExecuted.get());
} }
@Test
@MediumTest
public void testChoreographerFrameTrait() throws Exception {
List<Integer> orderList = new ArrayList<>();
CountDownLatch latch = new CountDownLatch(3);
// Post a task so we can run on the UI thread.
PostTask.postTask(UiThreadTaskTraits.DEFAULT, new Runnable() {
@Override
public void run() {
PostTask.postTask(TaskTraits.CHOREOGRAPHER_FRAME, new Runnable() {
@Override
public void run() {
synchronized (orderList) {
orderList.add(1);
latch.countDown();
}
}
});
PostTask.postTask(TaskTraits.CHOREOGRAPHER_FRAME, new Runnable() {
@Override
public void run() {
synchronized (orderList) {
orderList.add(2);
latch.countDown();
}
}
});
PostTask.postTask(UiThreadTaskTraits.DEFAULT, new Runnable() {
@Override
public void run() {
synchronized (orderList) {
orderList.add(3);
latch.countDown();
}
}
});
}
});
latch.await();
// The UiThreadTaskTraits.DEFAULT task should run before the two choreographer tasks.
assertThat(orderList, contains(3, 1, 2));
}
private void startContentMainOnUiThread() { private void startContentMainOnUiThread() {
final Object lock = new Object(); final Object lock = new Object();
final AtomicBoolean uiThreadInitalized = new AtomicBoolean(); final AtomicBoolean uiThreadInitalized = new AtomicBoolean();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment