1bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// found in the LICENSE file.
4bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
5bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#ifndef BASE_THREADING_JAVA_THREAD_H_
6bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#define BASE_THREADING_JAVA_THREAD_H_
7bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
8bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include <jni.h>
9bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
10bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/android/scoped_java_ref.h"
11bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/memory/scoped_ptr.h"
12bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
13bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace base {
14bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
15bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass MessageLoop;
16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass WaitableEvent;
17bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
18bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace android {
19bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
20bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// A Java Thread with a native message loop. To run tasks, post them
21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// to the message loop and they will be scheduled along with Java tasks
22bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// on the thread.
23bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// This is useful for callbacks where the receiver expects a thread
24bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch// with a prepared Looper.
25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass BASE_EXPORT JavaHandlerThread {
26bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch public:
27bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  JavaHandlerThread(const char* name);
28bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  virtual ~JavaHandlerThread();
29bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
30bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  base::MessageLoop* message_loop() const { return message_loop_.get(); }
31bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  void Start();
32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  void Stop();
33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
34bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Called from java on the newly created thread.
35bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Start() will not return before this methods has finished.
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void InitializeThread(JNIEnv* env, jobject obj, jlong event);
37bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
38bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  static bool RegisterBindings(JNIEnv* env);
39bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
40bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch private:
41bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  scoped_ptr<base::MessageLoop> message_loop_;
42bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  ScopedJavaGlobalRef<jobject> java_thread_;
43bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch};
44bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
45bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}  // namespace android
46bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}  // namespace base
47bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
48bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif  // BASE_THREADING_JAVA_THREAD_H_
49