• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.mojo.system.impl;
6 
7 import org.chromium.base.annotations.CalledByNative;
8 import org.chromium.base.annotations.JNINamespace;
9 import org.chromium.mojo.system.RunLoop;
10 
11 /**
12  * Implementation of {@link RunLoop} suitable for the base:: message loop implementation.
13  */
14 @JNINamespace("mojo::android")
15 class BaseRunLoop implements RunLoop {
16     /**
17      * Pointer to the C run loop.
18      */
19     private long mRunLoopID;
20     private final CoreImpl mCore;
21 
BaseRunLoop(CoreImpl core)22     BaseRunLoop(CoreImpl core) {
23         this.mCore = core;
24         this.mRunLoopID = nativeCreateBaseRunLoop();
25     }
26 
27     @Override
run()28     public void run() {
29         assert mRunLoopID != 0 : "The run loop cannot run once closed";
30         nativeRun(mRunLoopID);
31     }
32 
33     @Override
runUntilIdle()34     public void runUntilIdle() {
35         assert mRunLoopID != 0 : "The run loop cannot run once closed";
36         nativeRunUntilIdle(mRunLoopID);
37     }
38 
39     @Override
quit()40     public void quit() {
41         assert mRunLoopID != 0 : "The run loop cannot be quitted run once closed";
42         nativeQuit(mRunLoopID);
43     }
44 
45     @Override
postDelayedTask(Runnable runnable, long delay)46     public void postDelayedTask(Runnable runnable, long delay) {
47         assert mRunLoopID != 0 : "The run loop cannot run tasks once closed";
48         nativePostDelayedTask(mRunLoopID, runnable, delay);
49     }
50 
51     @Override
close()52     public void close() {
53         if (mRunLoopID == 0) {
54             return;
55         }
56         // We don't want to de-register a different run loop!
57         assert mCore.getCurrentRunLoop() == this : "Only the current run loop can be closed";
58         mCore.clearCurrentRunLoop();
59         nativeDeleteMessageLoop(mRunLoopID);
60         mRunLoopID = 0;
61     }
62 
63     @CalledByNative
runRunnable(Runnable runnable)64     private static void runRunnable(Runnable runnable) {
65         runnable.run();
66     }
67 
nativeCreateBaseRunLoop()68     private native long nativeCreateBaseRunLoop();
nativeRun(long runLoopID)69     private native void nativeRun(long runLoopID);
nativeRunUntilIdle(long runLoopID)70     private native void nativeRunUntilIdle(long runLoopID);
nativeQuit(long runLoopID)71     private native void nativeQuit(long runLoopID);
nativePostDelayedTask(long runLoopID, Runnable runnable, long delay)72     private native void nativePostDelayedTask(long runLoopID, Runnable runnable, long delay);
nativeDeleteMessageLoop(long runLoopID)73     private native void nativeDeleteMessageLoop(long runLoopID);
74 }
75