blob: cf61442c096dac258ca35bed8a101b091758f924 [file] [log] [blame]
// 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.
#include "base/android/task_scheduler/task_runner_android.h"
#include "base/android/task_scheduler/post_task_android.h"
#include "base/run_loop.h"
#include "base/task/post_task.h"
#include "base/time/time.h"
#include "jni/TaskRunnerImpl_jni.h"
namespace base {
jlong JNI_TaskRunnerImpl_Init(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jcaller,
jint task_runner_type,
jboolean priority_set_explicitly,
jint priority,
jboolean may_block,
jbyte extension_id,
const base::android::JavaParamRef<jbyteArray>& extension_data) {
TaskTraits task_traits = PostTaskAndroid::CreateTaskTraits(
env, priority_set_explicitly, priority, may_block, extension_id,
extension_data);
scoped_refptr<TaskRunner> task_runner;
switch (static_cast<TaskRunnerType>(task_runner_type)) {
case TaskRunnerType::BASE:
task_runner = CreateTaskRunnerWithTraits(task_traits);
break;
case TaskRunnerType::SEQUENCED:
task_runner = CreateSequencedTaskRunnerWithTraits(task_traits);
break;
case TaskRunnerType::SINGLE_THREAD:
task_runner = CreateSingleThreadTaskRunnerWithTraits(task_traits);
break;
}
return reinterpret_cast<intptr_t>(new TaskRunnerAndroid(task_runner));
}
TaskRunnerAndroid::TaskRunnerAndroid(scoped_refptr<TaskRunner> task_runner)
: task_runner_(std::move(task_runner)) {}
TaskRunnerAndroid::~TaskRunnerAndroid() = default;
void TaskRunnerAndroid::Destroy(JNIEnv* env,
const base::android::JavaRef<jobject>& caller) {
// This could happen on any thread.
delete this;
}
void TaskRunnerAndroid::PostDelayedTask(
JNIEnv* env,
const base::android::JavaRef<jobject>& caller,
const base::android::JavaRef<jobject>& task,
jlong delay) {
task_runner_->PostDelayedTask(
FROM_HERE,
base::BindOnce(&PostTaskAndroid::RunJavaTask,
base::android::ScopedJavaGlobalRef<jobject>(task)),
TimeDelta::FromMilliseconds(delay));
}
bool TaskRunnerAndroid::BelongsToCurrentThread(
JNIEnv* env,
const base::android::JavaRef<jobject>& caller) {
return task_runner_->RunsTasksInCurrentSequence();
}
} // namespace base