blob: 3db6670d71478fec7483aea7cd84b45dff3734a5 [file] [log] [blame]
// Copyright 2015 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.system.impl;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.mojo.system.RunLoop;
/**
* Implementation of {@link RunLoop} suitable for the base:: message loop implementation.
*/
@JNINamespace("mojo::android")
class BaseRunLoop implements RunLoop {
/**
* Pointer to the C run loop.
*/
private long mRunLoopID;
private final CoreImpl mCore;
BaseRunLoop(CoreImpl core) {
this.mCore = core;
this.mRunLoopID = nativeCreateBaseRunLoop();
}
@Override
public void run() {
assert mRunLoopID != 0 : "The run loop cannot run once closed";
nativeRun();
}
@Override
public void runUntilIdle() {
assert mRunLoopID != 0 : "The run loop cannot run once closed";
nativeRunUntilIdle();
}
@Override
public void quit() {
assert mRunLoopID != 0 : "The run loop cannot be quitted run once closed";
nativeQuit(mRunLoopID);
}
@Override
public void postDelayedTask(Runnable runnable, long delay) {
assert mRunLoopID != 0 : "The run loop cannot run tasks once closed";
nativePostDelayedTask(mRunLoopID, runnable, delay);
}
@Override
public void close() {
if (mRunLoopID == 0) {
return;
}
// We don't want to de-register a different run loop!
assert mCore.getCurrentRunLoop() == this : "Only the current run loop can be closed";
mCore.clearCurrentRunLoop();
nativeDeleteMessageLoop(mRunLoopID);
mRunLoopID = 0;
}
@CalledByNative
private static void runRunnable(Runnable runnable) {
runnable.run();
}
private native long nativeCreateBaseRunLoop();
private native void nativeRun();
private native void nativeRunUntilIdle();
private native void nativeQuit(long runLoopID);
private native void nativePostDelayedTask(long runLoopID, Runnable runnable, long delay);
private native void nativeDeleteMessageLoop(long runLoopID);
}