| Index: ppapi/proxy/ppb_message_loop_proxy.cc
|
| diff --git a/ppapi/proxy/ppb_message_loop_proxy.cc b/ppapi/proxy/ppb_message_loop_proxy.cc
|
| index 7f2fc337849720be301957626cfdaeb472f288f0..ac78eb9ad29745551bd4231313eb185848a25659 100644
|
| --- a/ppapi/proxy/ppb_message_loop_proxy.cc
|
| +++ b/ppapi/proxy/ppb_message_loop_proxy.cc
|
| @@ -9,8 +9,9 @@
|
| #include <vector>
|
|
|
| #include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| #include "base/compiler_specific.h"
|
| -#include "base/location.h"
|
| +#include "base/logging.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| #include "ppapi/c/pp_errors.h"
|
| #include "ppapi/c/ppb_message_loop.h"
|
| @@ -109,11 +110,17 @@ int32_t MessageLoopResource::Run() {
|
| if (is_main_thread_loop_)
|
| return PP_ERROR_INPROGRESS;
|
|
|
| + base::RunLoop* previous_run_loop = run_loop_;
|
| + base::RunLoop run_loop;
|
| + run_loop_ = &run_loop;
|
| +
|
| nested_invocations_++;
|
| CallWhileUnlocked(
|
| - base::Bind(&base::MessageLoop::Run, base::Unretained(loop_.get())));
|
| + base::Bind(&base::RunLoop::Run, base::Unretained(run_loop_)));
|
| nested_invocations_--;
|
|
|
| + run_loop_ = previous_run_loop;
|
| +
|
| if (should_destroy_ && nested_invocations_ == 0) {
|
| task_runner_ = NULL;
|
| loop_.reset();
|
| @@ -142,10 +149,13 @@ int32_t MessageLoopResource::PostQuit(PP_Bool should_destroy) {
|
| if (PP_ToBool(should_destroy))
|
| should_destroy_ = true;
|
|
|
| - if (IsCurrent() && nested_invocations_ > 0)
|
| - loop_->QuitWhenIdle();
|
| - else
|
| - PostClosure(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(), 0);
|
| + if (IsCurrent() && nested_invocations_ > 0) {
|
| + run_loop_->QuitWhenIdle();
|
| + } else {
|
| + PostClosure(FROM_HERE, base::Bind(&MessageLoopResource::QuitRunLoopWhenIdle,
|
| + Unretained(this)),
|
| + 0);
|
| + }
|
| return PP_OK;
|
| }
|
|
|
| @@ -201,6 +211,12 @@ bool MessageLoopResource::CurrentlyHandlingBlockingMessage() {
|
| return currently_handling_blocking_message_;
|
| }
|
|
|
| +void MessageLoopResource::QuitRunLoopWhenIdle() {
|
| + DCHECK(IsCurrent());
|
| + DCHECK(run_loop_);
|
| + run_loop_->QuitWhenIdle();
|
| +}
|
| +
|
| // static
|
| void MessageLoopResource::ReleaseMessageLoop(void* value) {
|
| static_cast<MessageLoopResource*>(value)->DetachFromThread();
|
|
|