Index: mojo/message_pump/handle_watcher.cc |
diff --git a/mojo/message_pump/handle_watcher.cc b/mojo/message_pump/handle_watcher.cc |
index b2320cc5b96ee7e96f4e458c31e63ef65b5d7799..0071058f08a690252ea08b4acb7a43cee4a3a078 100644 |
--- a/mojo/message_pump/handle_watcher.cc |
+++ b/mojo/message_pump/handle_watcher.cc |
@@ -17,10 +17,8 @@ |
#include "base/profiler/scoped_tracker.h" |
#include "base/single_thread_task_runner.h" |
#include "base/synchronization/lock.h" |
-#include "base/synchronization/waitable_event.h" |
#include "base/thread_task_runner_handle.h" |
#include "base/threading/thread.h" |
-#include "base/threading/thread_restrictions.h" |
#include "base/time/time.h" |
#include "mojo/message_pump/message_pump_mojo.h" |
#include "mojo/message_pump/message_pump_mojo_handler.h" |
@@ -64,8 +62,6 @@ class WatcherBackend : public MessagePumpMojoHandler { |
~WatcherBackend() override; |
void StartWatching(const WatchData& data); |
- |
- // Cancels a previously scheduled request to start a watch. |
void StopWatching(WatcherID watcher_id); |
private: |
@@ -109,10 +105,11 @@ void WatcherBackend::StopWatching(WatcherID watcher_id) { |
// Because of the thread hop it is entirely possible to get here and not |
// have a valid handle registered for |watcher_id|. |
Handle handle; |
- if (GetMojoHandleByWatcherID(watcher_id, &handle)) { |
- handle_to_data_.erase(handle); |
- MessagePumpMojo::current()->RemoveHandler(handle); |
- } |
+ if (!GetMojoHandleByWatcherID(watcher_id, &handle)) |
+ return; |
+ |
+ handle_to_data_.erase(handle); |
+ MessagePumpMojo::current()->RemoveHandler(handle); |
} |
void WatcherBackend::RemoveAndNotify(const Handle& handle, |
@@ -151,8 +148,6 @@ void WatcherBackend::OnHandleError(const Handle& handle, MojoResult result) { |
// WatcherThreadManager manages the background thread that listens for handles |
// to be ready. All requests are handled by WatcherBackend. |
-} // namespace |
- |
class WatcherThreadManager { |
public: |
~WatcherThreadManager(); |
@@ -181,12 +176,11 @@ class WatcherThreadManager { |
// See description of |requests_| for details. |
struct RequestData { |
- RequestData() : type(REQUEST_START), stop_id(0), stop_event(NULL) {} |
+ RequestData() : type(REQUEST_START), stop_id(0) {} |
RequestType type; |
WatchData start_data; |
WatcherID stop_id; |
- base::WaitableEvent* stop_event; |
}; |
typedef std::vector<RequestData> Requests; |
@@ -262,16 +256,10 @@ void WatcherThreadManager::StopWatching(WatcherID watcher_id) { |
tracked_objects::ScopedTracker tracking_profile( |
FROM_HERE_WITH_EXPLICIT_FUNCTION( |
"554761 WatcherThreadManager::StopWatching")); |
- base::ThreadRestrictions::ScopedAllowWait allow_wait; |
- base::WaitableEvent event(true, false); |
RequestData request_data; |
request_data.type = REQUEST_STOP; |
request_data.stop_id = watcher_id; |
- request_data.stop_event = &event; |
AddRequest(request_data); |
- |
- // We need to block until the handle is actually removed. |
- event.Wait(); |
} |
void WatcherThreadManager::AddRequest(const RequestData& data) { |
@@ -282,7 +270,7 @@ void WatcherThreadManager::AddRequest(const RequestData& data) { |
if (!was_empty) |
return; |
} |
- // We own |thread_|, so it's safe to use Unretained() here. |
+ // We outlive |thread_|, so it's safe to use Unretained() here. |
thread_.task_runner()->PostTask( |
FROM_HERE, |
base::Bind(&WatcherThreadManager::ProcessRequestsOnBackendThread, |
@@ -302,7 +290,6 @@ void WatcherThreadManager::ProcessRequestsOnBackendThread() { |
backend_.StartWatching(requests[i].start_data); |
} else { |
backend_.StopWatching(requests[i].stop_id); |
- requests[i].stop_event->Signal(); |
} |
} |
} |
@@ -314,6 +301,8 @@ WatcherThreadManager::WatcherThreadManager() |
thread_.StartWithOptions(thread_options); |
} |
+} // namespace |
+ |
// HandleWatcher::StateBase and subclasses ------------------------------------- |
// The base class of HandleWatcher's state. Owns the user's callback and |