15970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org// Copyright 2013 The Chromium Authors. All rights reserved. 25970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org// Use of this source code is governed by a BSD-style license that can be 35970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org// found in the LICENSE file. 45970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 55970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "base/android/java_handler_thread.h" 65970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 75970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include <jni.h> 85970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 95970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "base/android/jni_android.h" 105970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "base/android/jni_string.h" 115970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "base/message_loop/message_loop.h" 125970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "base/synchronization/waitable_event.h" 135970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "base/threading/thread_restrictions.h" 145970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org#include "jni/JavaHandlerThread_jni.h" 155970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 165970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.orgnamespace base { 175970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 183e629e16548e45750fcad5e7a28bbf6dfc8571efLeon Scroggins IIInamespace android { 193e629e16548e45750fcad5e7a28bbf6dfc8571efLeon Scroggins III 205970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.orgJavaHandlerThread::JavaHandlerThread(const char* name) { 21e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com JNIEnv* env = base::android::AttachCurrentThread(); 225970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 235970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org java_thread_.Reset(Java_JavaHandlerThread_create( 245970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org env, ConvertUTF8ToJavaString(env, name).Release())); 25e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com} 265970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 275970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.orgJavaHandlerThread::~JavaHandlerThread() { 285970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org} 295970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 30e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.comvoid JavaHandlerThread::Start() { 315970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org // Check the thread has not already been started. 325970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org DCHECK(!message_loop_); 335970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 34e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com JNIEnv* env = base::android::AttachCurrentThread(); 359de5b514d38c5b36066bcdc14fba2f7e5196d372dandov base::WaitableEvent initialize_event(false, false); 369de5b514d38c5b36066bcdc14fba2f7e5196d372dandov Java_JavaHandlerThread_start(env, 379de5b514d38c5b36066bcdc14fba2f7e5196d372dandov java_thread_.obj(), 389de5b514d38c5b36066bcdc14fba2f7e5196d372dandov reinterpret_cast<intptr_t>(this), 393e629e16548e45750fcad5e7a28bbf6dfc8571efLeon Scroggins III reinterpret_cast<intptr_t>(&initialize_event)); 405970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org // Wait for thread to be initialized so it is ready to be used when Start 415970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org // returns. 425970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org base::ThreadRestrictions::ScopedAllowWait wait_allowed; 439de5b514d38c5b36066bcdc14fba2f7e5196d372dandov initialize_event.Wait(); 445970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org} 459de5b514d38c5b36066bcdc14fba2f7e5196d372dandov 469de5b514d38c5b36066bcdc14fba2f7e5196d372dandovvoid JavaHandlerThread::Stop() { 479de5b514d38c5b36066bcdc14fba2f7e5196d372dandov} 489de5b514d38c5b36066bcdc14fba2f7e5196d372dandov 499de5b514d38c5b36066bcdc14fba2f7e5196d372dandovvoid JavaHandlerThread::InitializeThread(JNIEnv* env, jobject obj, 509de5b514d38c5b36066bcdc14fba2f7e5196d372dandov jlong event) { 519de5b514d38c5b36066bcdc14fba2f7e5196d372dandov // TYPE_JAVA to get the Android java style message loop. 529de5b514d38c5b36066bcdc14fba2f7e5196d372dandov message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_JAVA)); 539de5b514d38c5b36066bcdc14fba2f7e5196d372dandov static_cast<MessageLoopForUI*>(message_loop_.get())->Start(); 549de5b514d38c5b36066bcdc14fba2f7e5196d372dandov reinterpret_cast<base::WaitableEvent*>(event)->Signal(); 559de5b514d38c5b36066bcdc14fba2f7e5196d372dandov} 565970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 575970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org// static 583e629e16548e45750fcad5e7a28bbf6dfc8571efLeon Scroggins IIIbool JavaHandlerThread::RegisterBindings(JNIEnv* env) { 595970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org return RegisterNativesImpl(env); 605970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org} 615970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org 62e92c68f7d7398e8a510b7157a38747b23cb883aeskia.committer@gmail.com} // namespace android 635970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org} // namespace base 645970f625e96cdc007c563ae72f343ae0d71719a1commit-bot@chromium.org