Index: mojo/android/system/base_run_loop.cc |
diff --git a/mojo/android/system/base_run_loop.cc b/mojo/android/system/base_run_loop.cc |
index df33f01a3c2720c9af58f7078e30e102752ea6f1..3d05e30c57d7979b4944253d4072887a81ddc4d3 100644 |
--- a/mojo/android/system/base_run_loop.cc |
+++ b/mojo/android/system/base_run_loop.cc |
@@ -17,22 +17,46 @@ |
namespace mojo { |
namespace android { |
+namespace { |
+ |
+struct MessageLoopHolder { |
+ MessageLoopHolder() { |
+ if (base::MessageLoop::current()) { |
+ message_loop = base::MessageLoop::current(); |
+ owned = false; |
+ } else { |
+ message_loop = new base::MessageLoop(common::MessagePumpMojo::Create()); |
+ owned = true; |
+ } |
+ } |
+ |
+ ~MessageLoopHolder() { |
+ if (owned) { |
+ delete message_loop; |
+ message_loop = nullptr; |
+ } |
+ } |
+ |
+ base::MessageLoop* message_loop; |
+ bool owned; |
+}; |
+ |
+} // namespace |
+ |
static jlong CreateBaseRunLoop(JNIEnv* env, jobject jcaller) { |
- base::MessageLoop* message_loop = |
- new base::MessageLoop(common::MessagePumpMojo::Create()); |
- return reinterpret_cast<uintptr_t>(message_loop); |
+ return reinterpret_cast<uintptr_t>(new MessageLoopHolder()); |
} |
static void Run(JNIEnv* env, jobject jcaller, jlong runLoopID) { |
- reinterpret_cast<base::MessageLoop*>(runLoopID)->Run(); |
+ reinterpret_cast<MessageLoopHolder*>(runLoopID)->message_loop->Run(); |
} |
static void RunUntilIdle(JNIEnv* env, jobject jcaller, jlong runLoopID) { |
- reinterpret_cast<base::MessageLoop*>(runLoopID)->RunUntilIdle(); |
+ reinterpret_cast<MessageLoopHolder*>(runLoopID)->message_loop->RunUntilIdle(); |
} |
static void Quit(JNIEnv* env, jobject jcaller, jlong runLoopID) { |
- reinterpret_cast<base::MessageLoop*>(runLoopID)->Quit(); |
+ reinterpret_cast<MessageLoopHolder*>(runLoopID)->message_loop->Quit(); |
} |
static void RunJavaRunnable( |
@@ -51,15 +75,16 @@ static void PostDelayedTask(JNIEnv* env, |
// use it across threads. |RunJavaRunnable| will acquire a new JNIEnv before |
// running the Runnable. |
runnable_ref.Reset(env, runnable); |
- reinterpret_cast<base::MessageLoop*>(runLoopID)->PostDelayedTask( |
- FROM_HERE, base::Bind(&RunJavaRunnable, runnable_ref), |
- base::TimeDelta::FromMicroseconds(delay)); |
+ reinterpret_cast<MessageLoopHolder*>(runLoopID) |
+ ->message_loop->PostDelayedTask( |
+ FROM_HERE, base::Bind(&RunJavaRunnable, runnable_ref), |
+ base::TimeDelta::FromMicroseconds(delay)); |
} |
static void DeleteMessageLoop(JNIEnv* env, jobject jcaller, jlong runLoopID) { |
- base::MessageLoop* message_loop = |
- reinterpret_cast<base::MessageLoop*>(runLoopID); |
- delete message_loop; |
+ MessageLoopHolder* native_loop = |
+ reinterpret_cast<MessageLoopHolder*>(runLoopID); |
+ delete native_loop; |
} |
bool RegisterBaseRunLoop(JNIEnv* env) { |