blob: f61c7846c25e82e57e54896766693d3d98f5b2b2 [file] [log] [blame]
[email protected]349ad582013-08-08 01:31:521// Copyright 2013 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#include "base/android/java_handler_thread.h"
6
7#include <jni.h>
8
9#include "base/android/jni_android.h"
10#include "base/android/jni_string.h"
Gabriel Charetteadadcc72017-07-27 23:51:3311#include "base/run_loop.h"
[email protected]349ad582013-08-08 01:31:5212#include "base/synchronization/waitable_event.h"
13#include "base/threading/thread_restrictions.h"
14#include "jni/JavaHandlerThread_jni.h"
15
boliu61687ec52017-03-29 20:09:3416using base::android::AttachCurrentThread;
17
[email protected]349ad582013-08-08 01:31:5218namespace base {
19
20namespace android {
21
boliu61687ec52017-03-29 20:09:3422JavaHandlerThread::JavaHandlerThread(const char* name)
23 : JavaHandlerThread(Java_JavaHandlerThread_create(
24 AttachCurrentThread(),
25 ConvertUTF8ToJavaString(AttachCurrentThread(), name))) {}
[email protected]349ad582013-08-08 01:31:5226
boliu61687ec52017-03-29 20:09:3427JavaHandlerThread::JavaHandlerThread(
28 const base::android::ScopedJavaLocalRef<jobject>& obj)
29 : java_thread_(obj) {}
[email protected]349ad582013-08-08 01:31:5230
31JavaHandlerThread::~JavaHandlerThread() {
Michael Thiessen7681cfee2017-08-18 16:55:3732 JNIEnv* env = base::android::AttachCurrentThread();
33 DCHECK(!Java_JavaHandlerThread_isAlive(env, java_thread_));
[email protected]349ad582013-08-08 01:31:5234}
35
36void JavaHandlerThread::Start() {
37 // Check the thread has not already been started.
38 DCHECK(!message_loop_);
39
40 JNIEnv* env = base::android::AttachCurrentThread();
gab77b6ad82016-06-07 21:42:3241 base::WaitableEvent initialize_event(
42 WaitableEvent::ResetPolicy::AUTOMATIC,
43 WaitableEvent::InitialState::NOT_SIGNALED);
boliu61687ec52017-03-29 20:09:3444 Java_JavaHandlerThread_startAndInitialize(
45 env, java_thread_, reinterpret_cast<intptr_t>(this),
46 reinterpret_cast<intptr_t>(&initialize_event));
[email protected]349ad582013-08-08 01:31:5247 // Wait for thread to be initialized so it is ready to be used when Start
48 // returns.
49 base::ThreadRestrictions::ScopedAllowWait wait_allowed;
50 initialize_event.Wait();
51}
52
53void JavaHandlerThread::Stop() {
jamesr2e146d72014-09-29 21:12:4454 JNIEnv* env = base::android::AttachCurrentThread();
torne948f3662016-08-16 15:10:4455 Java_JavaHandlerThread_stop(env, java_thread_,
Michael Thiessen7681cfee2017-08-18 16:55:3756 reinterpret_cast<intptr_t>(this));
[email protected]349ad582013-08-08 01:31:5257}
58
torne70f3fac92015-12-02 16:31:1859void JavaHandlerThread::InitializeThread(JNIEnv* env,
60 const JavaParamRef<jobject>& obj,
[email protected]f690ed92014-02-28 15:25:3161 jlong event) {
[email protected]349ad582013-08-08 01:31:5262 // TYPE_JAVA to get the Android java style message loop.
Michael Thiessen781ddeb2017-11-15 17:07:2363 message_loop_ = new base::MessageLoop(base::MessageLoop::TYPE_JAVA);
gsenntonebe2e2032016-08-18 22:34:1264 StartMessageLoop();
[email protected]349ad582013-08-08 01:31:5265 reinterpret_cast<base::WaitableEvent*>(event)->Signal();
66}
67
torne70f3fac92015-12-02 16:31:1868void JavaHandlerThread::StopThread(JNIEnv* env,
Michael Thiessen7681cfee2017-08-18 16:55:3769 const JavaParamRef<jobject>& obj) {
gsenntonebe2e2032016-08-18 22:34:1270 StopMessageLoop();
Michael Thiessen7681cfee2017-08-18 16:55:3771}
72
73void JavaHandlerThread::OnLooperStopped(JNIEnv* env,
74 const JavaParamRef<jobject>& obj) {
Michael Thiessen781ddeb2017-11-15 17:07:2375 delete message_loop_;
Michael Thiessen7681cfee2017-08-18 16:55:3776 CleanUp();
jamesr2e146d72014-09-29 21:12:4477}
78
gsenntonebe2e2032016-08-18 22:34:1279void JavaHandlerThread::StartMessageLoop() {
Michael Thiessen781ddeb2017-11-15 17:07:2380 static_cast<MessageLoopForUI*>(message_loop_)->Start();
Michael Thiessen7681cfee2017-08-18 16:55:3781 Init();
gsenntonebe2e2032016-08-18 22:34:1282}
83
84void JavaHandlerThread::StopMessageLoop() {
Gabriel Charetteadadcc72017-07-27 23:51:3385 base::RunLoop::QuitCurrentWhenIdleDeprecated();
gsenntonebe2e2032016-08-18 22:34:1286}
87
Michael Thiessen7681cfee2017-08-18 16:55:3788void JavaHandlerThread::StopMessageLoopForTesting() {
89 JNIEnv* env = base::android::AttachCurrentThread();
90 Java_JavaHandlerThread_stopOnThread(env, java_thread_,
91 reinterpret_cast<intptr_t>(this));
92}
93
94void JavaHandlerThread::JoinForTesting() {
95 JNIEnv* env = base::android::AttachCurrentThread();
96 Java_JavaHandlerThread_joinThread(env, java_thread_);
97}
98
Michael Thiessen781ddeb2017-11-15 17:07:2399void JavaHandlerThread::ListenForUncaughtExceptionsForTesting() {
100 JNIEnv* env = base::android::AttachCurrentThread();
101 Java_JavaHandlerThread_listenForUncaughtExceptionsForTesting(env,
102 java_thread_);
103}
104
105ScopedJavaLocalRef<jthrowable> JavaHandlerThread::GetUncaughtExceptionIfAny() {
106 JNIEnv* env = base::android::AttachCurrentThread();
107 return Java_JavaHandlerThread_getUncaughtExceptionIfAny(env, java_thread_);
108}
109
[email protected]349ad582013-08-08 01:31:52110} // namespace android
111} // namespace base