Chromium Code Reviews| Index: mojo/edk/js/waiting_callback.cc |
| diff --git a/mojo/edk/js/waiting_callback.cc b/mojo/edk/js/waiting_callback.cc |
| index a28791ca965347271b1cd68fbbb598214c97fefc..89a7bc99eb9f52fd6dd83a1472b1e00f9cd3dda1 100644 |
| --- a/mojo/edk/js/waiting_callback.cc |
| +++ b/mojo/edk/js/waiting_callback.cc |
| @@ -7,7 +7,6 @@ |
| #include "base/bind.h" |
| #include "base/message_loop/message_loop.h" |
| #include "gin/per_context_data.h" |
| -#include "mojo/public/cpp/environment/environment.h" |
| namespace mojo { |
| namespace edk { |
| @@ -32,29 +31,31 @@ gin::Handle<WaitingCallback> WaitingCallback::Create( |
| MojoHandleSignals signals) { |
| gin::Handle<WaitingCallback> waiting_callback = gin::CreateHandle( |
| isolate, new WaitingCallback(isolate, callback, handle_wrapper)); |
| - waiting_callback->wait_id_ = Environment::GetDefaultAsyncWaiter()->AsyncWait( |
| - handle_wrapper->get().value(), |
| - signals, |
| - MOJO_DEADLINE_INDEFINITE, |
| - &WaitingCallback::CallOnHandleReady, |
| - waiting_callback.get()); |
| + |
| + waiting_callback->started_handle_watcher_ = true; |
|
jam
2016/02/23 16:54:13
i'm curious why keep this extra state around, whic
yzshen1
2016/02/23 21:22:07
Done.
|
| + waiting_callback->handle_watcher_.Start( |
| + handle_wrapper->get(), signals, MOJO_DEADLINE_INDEFINITE, |
| + base::Bind(&WaitingCallback::OnHandleReady, |
| + base::Unretained(waiting_callback.get()))); |
| return waiting_callback; |
| } |
| void WaitingCallback::Cancel() { |
| - if (!wait_id_) |
| + if (!started_handle_watcher_) |
| return; |
| handle_wrapper_->RemoveCloseObserver(this); |
| handle_wrapper_ = NULL; |
| - Environment::GetDefaultAsyncWaiter()->CancelWait(wait_id_); |
| - wait_id_ = 0; |
| + handle_watcher_.Stop(); |
| + started_handle_watcher_ = false; |
| } |
| WaitingCallback::WaitingCallback(v8::Isolate* isolate, |
| v8::Handle<v8::Function> callback, |
| gin::Handle<HandleWrapper> handle_wrapper) |
| - : wait_id_(0), handle_wrapper_(handle_wrapper.get()), weak_factory_(this) { |
| + : started_handle_watcher_(false), |
| + handle_wrapper_(handle_wrapper.get()), |
| + weak_factory_(this) { |
| handle_wrapper_->AddCloseObserver(this); |
| v8::Handle<v8::Context> context = isolate->GetCurrentContext(); |
| runner_ = gin::PerContextData::From(context)->runner()->GetWeakPtr(); |
| @@ -67,25 +68,20 @@ WaitingCallback::~WaitingCallback() { |
| Cancel(); |
| } |
| -// static |
| -void WaitingCallback::CallOnHandleReady(void* closure, MojoResult result) { |
| - static_cast<WaitingCallback*>(closure)->OnHandleReady(result); |
| -} |
| - |
| -void WaitingCallback::ClearWaitId() { |
| - wait_id_ = 0; |
| +void WaitingCallback::ClearWaitFlag() { |
| + started_handle_watcher_ = false; |
| handle_wrapper_->RemoveCloseObserver(this); |
| handle_wrapper_ = nullptr; |
| } |
| void WaitingCallback::OnHandleReady(MojoResult result) { |
| - ClearWaitId(); |
| + ClearWaitFlag(); |
| CallCallback(result); |
| } |
| void WaitingCallback::CallCallback(MojoResult result) { |
| - // ClearWaitId must already have been called. |
| - DCHECK(!wait_id_); |
| + // ClearWaitFlag must already have been called. |
| + DCHECK(!started_handle_watcher_); |
| DCHECK(!handle_wrapper_); |
| if (!runner_) |
| @@ -107,11 +103,11 @@ void WaitingCallback::CallCallback(MojoResult result) { |
| } |
| void WaitingCallback::OnWillCloseHandle() { |
| - Environment::GetDefaultAsyncWaiter()->CancelWait(wait_id_); |
| + handle_watcher_.Stop(); |
| // This may be called from GC, so we can't execute Javascript now, call |
| - // ClearWaitId explicitly, and CallCallback asynchronously. |
| - ClearWaitId(); |
| + // ClearWaitFlag explicitly, and CallCallback asynchronously. |
| + ClearWaitFlag(); |
| base::MessageLoop::current()->PostTask( |
| FROM_HERE, |
| base::Bind(&WaitingCallback::CallCallback, weak_factory_.GetWeakPtr(), |