| Index: mojo/public/java/bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java
|
| diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java
|
| deleted file mode 100644
|
| index d0d5c3bcf211dc495d765c4c6cacb6885af9fcea..0000000000000000000000000000000000000000
|
| --- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/ExecutorFactory.java
|
| +++ /dev/null
|
| @@ -1,184 +0,0 @@
|
| -// Copyright 2014 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.mojo.bindings;
|
| -
|
| -import org.chromium.mojo.system.AsyncWaiter;
|
| -import org.chromium.mojo.system.AsyncWaiter.Callback;
|
| -import org.chromium.mojo.system.Core;
|
| -import org.chromium.mojo.system.MessagePipeHandle;
|
| -import org.chromium.mojo.system.MessagePipeHandle.ReadMessageResult;
|
| -import org.chromium.mojo.system.MojoException;
|
| -import org.chromium.mojo.system.MojoResult;
|
| -import org.chromium.mojo.system.Pair;
|
| -
|
| -import java.nio.ByteBuffer;
|
| -import java.util.ArrayList;
|
| -import java.util.List;
|
| -import java.util.concurrent.Executor;
|
| -
|
| -/**
|
| - * A factory which provides per-thread executors, which enable execution on the thread from which
|
| - * they were obtained.
|
| - */
|
| -class ExecutorFactory {
|
| -
|
| - /**
|
| - * A null buffer which is used to send messages without any data on the PipedExecutor's
|
| - * signaling handles.
|
| - */
|
| - private static final ByteBuffer NOTIFY_BUFFER = null;
|
| -
|
| - /**
|
| - * Implementation of the executor which uses a pair of {@link MessagePipeHandle} for signaling.
|
| - * The executor will wait asynchronously on one end of a {@link MessagePipeHandle} on the thread
|
| - * on which it was created. Other threads can call execute with a {@link Runnable}, and the
|
| - * executor will queue the {@link Runnable} and write a message on the other end of the handle.
|
| - * This will wake up the executor which is waiting on the handle, which will then dequeue the
|
| - * {@link Runnable} and execute it on the original thread.
|
| - */
|
| - private static class PipedExecutor implements Executor, Callback {
|
| -
|
| - /**
|
| - * The handle which is written to. Access to this object must be protected with |mLock|.
|
| - */
|
| - private final MessagePipeHandle mWriteHandle;
|
| - /**
|
| - * The handle which is read from.
|
| - */
|
| - private final MessagePipeHandle mReadHandle;
|
| - /**
|
| - * The list of actions left to be run. Access to this object must be protected with |mLock|.
|
| - */
|
| - private final List<Runnable> mPendingActions;
|
| - /**
|
| - * Lock protecting access to |mWriteHandle| and |mPendingActions|.
|
| - */
|
| - private final Object mLock;
|
| - /**
|
| - * The {@link AsyncWaiter} to get notified of new message availability on |mReadHandle|.
|
| - */
|
| - private final AsyncWaiter mWaiter;
|
| -
|
| - /**
|
| - * Constructor.
|
| - */
|
| - public PipedExecutor(Core core) {
|
| - mWaiter = core.getDefaultAsyncWaiter();
|
| - assert mWaiter != null;
|
| - mLock = new Object();
|
| - Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(
|
| - new MessagePipeHandle.CreateOptions());
|
| - mReadHandle = handles.first;
|
| - mWriteHandle = handles.second;
|
| - mPendingActions = new ArrayList<Runnable>();
|
| - asyncWait();
|
| - }
|
| -
|
| - /**
|
| - * Asynchronously wait for the next command to arrive. This should only be called on the
|
| - * executor thread.
|
| - */
|
| - private void asyncWait() {
|
| - mWaiter.asyncWait(mReadHandle, Core.HandleSignals.READABLE, Core.DEADLINE_INFINITE,
|
| - this);
|
| - }
|
| -
|
| - /**
|
| - * @see Callback#onResult(int)
|
| - */
|
| - @Override
|
| - public void onResult(int result) {
|
| - if (result == MojoResult.OK && readNotifyBufferMessage()) {
|
| - runNextAction();
|
| - } else {
|
| - close();
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * @see Callback#onError(MojoException)
|
| - */
|
| - @Override
|
| - public void onError(MojoException exception) {
|
| - close();
|
| - }
|
| -
|
| - /**
|
| - * Close the handles. Should only be called on the executor thread.
|
| - */
|
| - private void close() {
|
| - synchronized (mLock) {
|
| - mWriteHandle.close();
|
| - mPendingActions.clear();
|
| - }
|
| - mReadHandle.close();
|
| - }
|
| -
|
| - /**
|
| - * Read the next message on |mReadHandle|, and return |true| if successful, |false|
|
| - * otherwise.
|
| - */
|
| - private boolean readNotifyBufferMessage() {
|
| - try {
|
| - ReadMessageResult readMessageResult = mReadHandle.readMessage(NOTIFY_BUFFER, 0,
|
| - MessagePipeHandle.ReadFlags.NONE);
|
| - if (readMessageResult.getMojoResult() == MojoResult.OK) {
|
| - asyncWait();
|
| - return true;
|
| - }
|
| - } catch (MojoException e) {
|
| - // Will be closed by the fall back at the end of this method.
|
| - }
|
| - return false;
|
| - }
|
| -
|
| - /**
|
| - * Run the next action in the |mPendingActions| queue.
|
| - */
|
| - private void runNextAction() {
|
| - Runnable toRun = null;
|
| - synchronized (mWriteHandle) {
|
| - toRun = mPendingActions.remove(0);
|
| - }
|
| - toRun.run();
|
| - }
|
| -
|
| - /**
|
| - * Execute the given |command| in the executor thread. This can be called on any thread.
|
| - *
|
| - * @see Executor#execute(Runnable)
|
| - */
|
| - @Override
|
| - public void execute(Runnable command) {
|
| - // Accessing the write handle must be protected by the lock, because it can be closed
|
| - // from the executor's thread.
|
| - synchronized (mLock) {
|
| - if (!mWriteHandle.isValid()) {
|
| - throw new IllegalStateException(
|
| - "Trying to execute an action on a closed executor.");
|
| - }
|
| - mPendingActions.add(command);
|
| - mWriteHandle.writeMessage(NOTIFY_BUFFER, null, MessagePipeHandle.WriteFlags.NONE);
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Keep one executor per executor thread.
|
| - */
|
| - private static final ThreadLocal<Executor> EXECUTORS = new ThreadLocal<Executor>();
|
| -
|
| - /**
|
| - * Returns an {@link Executor} that will run all of its actions in the current thread.
|
| - */
|
| - public static Executor getExecutorForCurrentThread(Core core) {
|
| - Executor executor = EXECUTORS.get();
|
| - if (executor == null) {
|
| - executor = new PipedExecutor(core);
|
| - EXECUTORS.set(executor);
|
| - }
|
| - return executor;
|
| - }
|
| -}
|
|
|