Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ffebc9cf authored by Satoshi Kataoka's avatar Satoshi Kataoka Committed by Android (Google) Code Review
Browse files

Merge "Add shutdown and isTerminated to PrioritizedSerialExecutor."

parents b9db10d6 a099a3e3
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -617,4 +617,14 @@ abstract public class ExpandableBinaryDictionary extends Dictionary {
        });
        return holder.get(false, TIMEOUT_FOR_READ_OPS_IN_MILLISECONDS);
    }

    @UsedForTesting
    public void shutdownExecutorForTests() {
        getExecutor(mFilename).shutdown();
    }

    @UsedForTesting
    public boolean isTerminatedForTests() {
        return getExecutor(mFilename).isTerminated();
    }
}
+27 −6
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ public class PrioritizedSerialExecutor {
    private static final int TASK_QUEUE_CAPACITY = 1000;
    private final Queue<Runnable> mTasks;
    private final Queue<Runnable> mPrioritizedTasks;
    private boolean mIsShutdown;

    // The task which is running now.
    private Runnable mActive;
@@ -38,6 +39,7 @@ public class PrioritizedSerialExecutor {
    public PrioritizedSerialExecutor() {
        mTasks = new ArrayDeque<Runnable>(TASK_QUEUE_CAPACITY);
        mPrioritizedTasks = new ArrayDeque<Runnable>(TASK_QUEUE_CAPACITY);
        mIsShutdown = false;
    }

    /**
@@ -56,12 +58,14 @@ public class PrioritizedSerialExecutor {
     */
    public void execute(final Runnable r) {
        synchronized(mLock) {
            if (!mIsShutdown) {
                mTasks.offer(r);
                if (mActive == null) {
                    scheduleNext();
                }
            }
        }
    }

    /**
     * Enqueues the given task into the prioritized task queue.
@@ -69,12 +73,14 @@ public class PrioritizedSerialExecutor {
     */
    public void executePrioritized(final Runnable r) {
        synchronized(mLock) {
            if (!mIsShutdown) {
                mPrioritizedTasks.offer(r);
                if (mActive ==  null) {
                    scheduleNext();
                }
            }
        }
    }

    private boolean fetchNextTasks() {
        synchronized(mLock) {
@@ -123,4 +129,19 @@ public class PrioritizedSerialExecutor {
            execute(newTask);
        }
    }

    public void shutdown() {
        synchronized(mLock) {
            mIsShutdown = true;
        }
    }

    public boolean isTerminated() {
        synchronized(mLock) {
            if (!mIsShutdown) {
                return false;
            }
            return mPrioritizedTasks.isEmpty() && mTasks.isEmpty() && mActive == null;
        }
    }
}
+18 −3
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ public class UserHistoryDictionaryTests extends AndroidTestCase {
    };

    private static final int MIN_USER_HISTORY_DICTIONARY_FILE_SIZE = 1000;
    private static final int WAIT_TERMINATING_IN_MILLISECONDS = 100;

    @Override
    public void setUp() {
@@ -122,8 +123,14 @@ public class UserHistoryDictionaryTests extends AndroidTestCase {
                    true /* checksContents */);
        } finally {
            try {
                final UserHistoryPredictionDictionary dict =
                        PersonalizationHelper.getUserHistoryPredictionDictionary(getContext(),
                                testFilenameSuffix, mPrefs);
                Log.d(TAG, "waiting for writing ...");
                Thread.sleep(TimeUnit.MILLISECONDS.convert(5L, TimeUnit.SECONDS));
                dict.shutdownExecutorForTests();
                while (!dict.isTerminatedForTests()) {
                    Thread.sleep(WAIT_TERMINATING_IN_MILLISECONDS);
                }
            } catch (InterruptedException e) {
                Log.d(TAG, "InterruptedException: " + e);
            }
@@ -146,11 +153,11 @@ public class UserHistoryDictionaryTests extends AndroidTestCase {
        final int numberOfWordsInsertedForEachLanguageSwitch = 100;

        final File dictFiles[] = new File[numberOfLanguages];
        final String testFilenameSuffixes[] = new String[numberOfLanguages];
        try {
            final Random random = new Random(123456);

            // Create filename suffixes for this test.
            String testFilenameSuffixes[] = new String[numberOfLanguages];
            for (int i = 0; i < numberOfLanguages; i++) {
                testFilenameSuffixes[i] = "testSwitchingLanguages" + i;
                final String fileName = UserHistoryPredictionDictionary.NAME + "." +
@@ -174,7 +181,15 @@ public class UserHistoryDictionaryTests extends AndroidTestCase {
        } finally {
            try {
                Log.d(TAG, "waiting for writing ...");
                Thread.sleep(TimeUnit.MILLISECONDS.convert(5L, TimeUnit.SECONDS));
                for (int i = 0; i < numberOfLanguages; i++) {
                    final UserHistoryPredictionDictionary dict =
                            PersonalizationHelper.getUserHistoryPredictionDictionary(getContext(),
                                    testFilenameSuffixes[i], mPrefs);
                    dict.shutdownExecutorForTests();
                    while (!dict.isTerminatedForTests()) {
                        Thread.sleep(WAIT_TERMINATING_IN_MILLISECONDS);
                    }
                }
            } catch (InterruptedException e) {
                Log.d(TAG, "InterruptedException: " + e);
            }