diff options
-rw-r--r-- | base/files/file_path_watcher_win.cc | 4 | ||||
-rw-r--r-- | base/process/kill_win.cc | 2 | ||||
-rw-r--r-- | base/synchronization/waitable_event_watcher_win.cc | 2 | ||||
-rw-r--r-- | base/win/object_watcher.cc | 78 | ||||
-rw-r--r-- | base/win/object_watcher.h | 28 | ||||
-rw-r--r-- | base/win/object_watcher_unittest.cc | 57 | ||||
-rw-r--r-- | base/win/registry.cc | 2 | ||||
-rw-r--r-- | chrome/common/service_process_util_win.cc | 2 | ||||
-rw-r--r-- | chrome/service/cloud_print/print_system_win.cc | 10 | ||||
-rw-r--r-- | components/policy/core/common/policy_loader_win.cc | 4 | ||||
-rw-r--r-- | content/browser/browser_child_process_host_impl.cc | 2 | ||||
-rw-r--r-- | device/hid/hid_connection_win.cc | 2 | ||||
-rw-r--r-- | net/base/network_change_notifier_win.cc | 2 | ||||
-rw-r--r-- | net/socket/tcp_socket_win.cc | 8 | ||||
-rw-r--r-- | net/test/embedded_test_server/stream_listen_socket.cc | 4 | ||||
-rw-r--r-- | net/udp/udp_socket_win.cc | 6 | ||||
-rw-r--r-- | remoting/host/win/worker_process_launcher.cc | 2 |
17 files changed, 144 insertions, 71 deletions
diff --git a/base/files/file_path_watcher_win.cc b/base/files/file_path_watcher_win.cc index 081698f..3f37cec 100644 --- a/base/files/file_path_watcher_win.cc +++ b/base/files/file_path_watcher_win.cc @@ -106,7 +106,7 @@ bool FilePathWatcherImpl::Watch(const FilePath& path, if (!UpdateWatch()) return false; - watcher_.StartWatching(handle_, this); + watcher_.StartWatchingOnce(handle_, this); return true; } @@ -198,7 +198,7 @@ void FilePathWatcherImpl::OnObjectSignaled(HANDLE object) { // The watch may have been cancelled by the callback. if (handle_ != INVALID_HANDLE_VALUE) - watcher_.StartWatching(handle_, this); + watcher_.StartWatchingOnce(handle_, this); } // static diff --git a/base/process/kill_win.cc b/base/process/kill_win.cc index 0da3a26..7cbf948 100644 --- a/base/process/kill_win.cc +++ b/base/process/kill_win.cc @@ -57,7 +57,7 @@ class TimerExpiredTask : public win::ObjectWatcher::Delegate { }; TimerExpiredTask::TimerExpiredTask(Process process) : process_(process.Pass()) { - watcher_.StartWatching(process_.Handle(), this); + watcher_.StartWatchingOnce(process_.Handle(), this); } TimerExpiredTask::~TimerExpiredTask() { diff --git a/base/synchronization/waitable_event_watcher_win.cc b/base/synchronization/waitable_event_watcher_win.cc index 46d47ac..6533539 100644 --- a/base/synchronization/waitable_event_watcher_win.cc +++ b/base/synchronization/waitable_event_watcher_win.cc @@ -22,7 +22,7 @@ bool WaitableEventWatcher::StartWatching( const EventCallback& callback) { callback_ = callback; event_ = event; - return watcher_.StartWatching(event->handle(), this); + return watcher_.StartWatchingOnce(event->handle(), this); } void WaitableEventWatcher::StopWatching() { diff --git a/base/win/object_watcher.cc b/base/win/object_watcher.cc index 5ebe185..93efd06 100644 --- a/base/win/object_watcher.cc +++ b/base/win/object_watcher.cc @@ -16,6 +16,7 @@ ObjectWatcher::ObjectWatcher() : object_(NULL), wait_object_(NULL), origin_loop_(NULL), + run_once_(true), weak_factory_(this) { } @@ -23,36 +24,13 @@ ObjectWatcher::~ObjectWatcher() { StopWatching(); } -bool ObjectWatcher::StartWatching(HANDLE object, Delegate* delegate) { - CHECK(delegate); - if (wait_object_) { - NOTREACHED() << "Already watching an object"; - return false; - } - - // Since our job is to just notice when an object is signaled and report the - // result back to this thread, we can just run on a Windows wait thread. - DWORD wait_flags = WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE; - - // DoneWaiting can be synchronously called from RegisterWaitForSingleObject, - // so set up all state now. - callback_ = base::Bind(&ObjectWatcher::Signal, weak_factory_.GetWeakPtr(), - delegate); - object_ = object; - origin_loop_ = MessageLoop::current(); - - if (!RegisterWaitForSingleObject(&wait_object_, object, DoneWaiting, - this, INFINITE, wait_flags)) { - DPLOG(FATAL) << "RegisterWaitForSingleObject failed"; - object_ = NULL; - wait_object_ = NULL; - return false; - } +bool ObjectWatcher::StartWatchingOnce(HANDLE object, Delegate* delegate) { + return StartWatchingInternal(object, delegate, true); +} - // We need to know if the current message loop is going away so we can - // prevent the wait thread from trying to access a dead message loop. - MessageLoop::current()->AddDestructionObserver(this); - return true; +bool ObjectWatcher::StartWatchingMultipleTimes(HANDLE object, + Delegate* delegate) { + return StartWatchingInternal(object, delegate, false); } bool ObjectWatcher::StopWatching() { @@ -93,7 +71,44 @@ void CALLBACK ObjectWatcher::DoneWaiting(void* param, BOOLEAN timed_out) { // that is always a pointer to a valid ObjectWater. ObjectWatcher* that = static_cast<ObjectWatcher*>(param); that->origin_loop_->task_runner()->PostTask(FROM_HERE, that->callback_); - that->callback_.Reset(); + if (that->run_once_) + that->callback_.Reset(); +} + +bool ObjectWatcher::StartWatchingInternal(HANDLE object, Delegate* delegate, + bool execute_only_once) { + CHECK(delegate); + if (wait_object_) { + NOTREACHED() << "Already watching an object"; + return false; + } + run_once_ = execute_only_once; + + // Since our job is to just notice when an object is signaled and report the + // result back to this thread, we can just run on a Windows wait thread. + DWORD wait_flags = WT_EXECUTEINWAITTHREAD; + if (run_once_) + wait_flags |= WT_EXECUTEONLYONCE; + + // DoneWaiting can be synchronously called from RegisterWaitForSingleObject, + // so set up all state now. + callback_ = base::Bind(&ObjectWatcher::Signal, weak_factory_.GetWeakPtr(), + delegate); + object_ = object; + origin_loop_ = MessageLoop::current(); + + if (!RegisterWaitForSingleObject(&wait_object_, object, DoneWaiting, + this, INFINITE, wait_flags)) { + DPLOG(FATAL) << "RegisterWaitForSingleObject failed"; + object_ = NULL; + wait_object_ = NULL; + return false; + } + + // We need to know if the current message loop is going away so we can + // prevent the wait thread from trying to access a dead message loop. + MessageLoop::current()->AddDestructionObserver(this); + return true; } void ObjectWatcher::Signal(Delegate* delegate) { @@ -101,7 +116,8 @@ void ObjectWatcher::Signal(Delegate* delegate) { // StartWatching(). As a result, we save any state we need and clear previous // watcher state before signaling the delegate. HANDLE object = object_; - StopWatching(); + if (run_once_) + StopWatching(); delegate->OnObjectSignaled(object); } diff --git a/base/win/object_watcher.h b/base/win/object_watcher.h index d68d935..f4d6085 100644 --- a/base/win/object_watcher.h +++ b/base/win/object_watcher.h @@ -26,16 +26,16 @@ namespace win { // // Typical usage: // -// class MyClass : public base::ObjectWatcher::Delegate { +// class MyClass : public base::win::ObjectWatcher::Delegate { // public: // void DoStuffWhenSignaled(HANDLE object) { -// watcher_.StartWatching(object, this); +// watcher_.StartWatchingOnce(object, this); // } -// virtual void OnObjectSignaled(HANDLE object) { +// void OnObjectSignaled(HANDLE object) override { // // OK, time to do stuff! // } // private: -// base::ObjectWatcher watcher_; +// base::win::ObjectWatcher watcher_; // }; // // In the above example, MyClass wants to "do stuff" when object becomes @@ -59,19 +59,23 @@ class BASE_EXPORT ObjectWatcher : public MessageLoop::DestructionObserver { ~ObjectWatcher() override; // When the object is signaled, the given delegate is notified on the thread - // where StartWatching is called. The ObjectWatcher is not responsible for + // where StartWatchingOnce is called. The ObjectWatcher is not responsible for // deleting the delegate. - // // Returns true if the watch was started. Otherwise, false is returned. - // - bool StartWatching(HANDLE object, Delegate* delegate); + bool StartWatchingOnce(HANDLE object, Delegate* delegate); + + // Notifies the delegate, on the thread where this method is called, each time + // the object is set. By definition, the handle must be an auto-reset object. + // The caller must ensure that it (or any Windows system code) doesn't reset + // the event or else the delegate won't be called. + // Returns true if the watch was started. Otherwise, false is returned. + bool StartWatchingMultipleTimes(HANDLE object, Delegate* delegate); // Stops watching. Does nothing if the watch has already completed. If the // watch is still active, then it is canceled, and the associated delegate is // not notified. // // Returns true if the watch was canceled. Otherwise, false is returned. - // bool StopWatching(); // Returns true if currently watching an object. @@ -84,6 +88,10 @@ class BASE_EXPORT ObjectWatcher : public MessageLoop::DestructionObserver { // Called on a background thread when done waiting. static void CALLBACK DoneWaiting(void* param, BOOLEAN timed_out); + // Helper used by StartWatchingOnce and StartWatchingMultipleTimes. + bool StartWatchingInternal(HANDLE object, Delegate* delegate, + bool execute_only_once); + void Signal(Delegate* delegate); // MessageLoop::DestructionObserver implementation: @@ -94,7 +102,7 @@ class BASE_EXPORT ObjectWatcher : public MessageLoop::DestructionObserver { HANDLE object_; // The object being watched HANDLE wait_object_; // Returned by RegisterWaitForSingleObject MessageLoop* origin_loop_; // Used to get back to the origin thread - + bool run_once_; WeakPtrFactory<ObjectWatcher> weak_factory_; DISALLOW_COPY_AND_ASSIGN(ObjectWatcher); diff --git a/base/win/object_watcher_unittest.cc b/base/win/object_watcher_unittest.cc index b30ca41..511ec49 100644 --- a/base/win/object_watcher_unittest.cc +++ b/base/win/object_watcher_unittest.cc @@ -42,7 +42,7 @@ void RunTest_BasicSignal(MessageLoop::Type message_loop_type) { HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL); QuitDelegate delegate; - bool ok = watcher.StartWatching(event, &delegate); + bool ok = watcher.StartWatchingOnce(event, &delegate); EXPECT_TRUE(ok); EXPECT_TRUE(watcher.IsWatching()); EXPECT_EQ(event, watcher.GetWatchedObject()); @@ -64,7 +64,7 @@ void RunTest_BasicCancel(MessageLoop::Type message_loop_type) { HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL); QuitDelegate delegate; - bool ok = watcher.StartWatching(event, &delegate); + bool ok = watcher.StartWatchingOnce(event, &delegate); EXPECT_TRUE(ok); watcher.StopWatching(); @@ -83,7 +83,7 @@ void RunTest_CancelAfterSet(MessageLoop::Type message_loop_type) { // A manual-reset event that is not yet signaled. HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL); - bool ok = watcher.StartWatching(event, &delegate); + bool ok = watcher.StartWatchingOnce(event, &delegate); EXPECT_TRUE(ok); SetEvent(event); @@ -110,7 +110,7 @@ void RunTest_SignalBeforeWatch(MessageLoop::Type message_loop_type) { HANDLE event = CreateEvent(NULL, TRUE, TRUE, NULL); QuitDelegate delegate; - bool ok = watcher.StartWatching(event, &delegate); + bool ok = watcher.StartWatchingOnce(event, &delegate); EXPECT_TRUE(ok); MessageLoop::current()->Run(); @@ -130,12 +130,53 @@ void RunTest_OutlivesMessageLoop(MessageLoop::Type message_loop_type) { MessageLoop message_loop(message_loop_type); QuitDelegate delegate; - watcher.StartWatching(event, &delegate); + watcher.StartWatchingOnce(event, &delegate); } } CloseHandle(event); } +class QuitAfterMultipleDelegate : public ObjectWatcher::Delegate { + public: + QuitAfterMultipleDelegate(HANDLE event, int iterations) + : event_(event), iterations_(iterations) {} + void OnObjectSignaled(HANDLE object) override { + if (--iterations_) { + SetEvent(event_); + } else { + MessageLoop::current()->QuitWhenIdle(); + } + } + + private: + HANDLE event_; + int iterations_; +}; + +void RunTest_ExecuteMultipleTimes(MessageLoop::Type message_loop_type) { + MessageLoop message_loop(message_loop_type); + + ObjectWatcher watcher; + EXPECT_FALSE(watcher.IsWatching()); + + // An auto-reset event that is not yet signaled. + HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL); + + QuitAfterMultipleDelegate delegate(event, 2); + bool ok = watcher.StartWatchingMultipleTimes(event, &delegate); + EXPECT_TRUE(ok); + EXPECT_TRUE(watcher.IsWatching()); + EXPECT_EQ(event, watcher.GetWatchedObject()); + + SetEvent(event); + + MessageLoop::current()->Run(); + + EXPECT_TRUE(watcher.IsWatching()); + EXPECT_TRUE(watcher.StopWatching()); + CloseHandle(event); +} + } // namespace //----------------------------------------------------------------------------- @@ -170,5 +211,11 @@ TEST(ObjectWatcherTest, OutlivesMessageLoop) { RunTest_OutlivesMessageLoop(MessageLoop::TYPE_UI); } +TEST(ObjectWatcherTest, ExecuteMultipleTimes) { + RunTest_ExecuteMultipleTimes(MessageLoop::TYPE_DEFAULT); + RunTest_ExecuteMultipleTimes(MessageLoop::TYPE_IO); + RunTest_ExecuteMultipleTimes(MessageLoop::TYPE_UI); +} + } // namespace win } // namespace base diff --git a/base/win/registry.cc b/base/win/registry.cc index 47afcbf..28e0461 100644 --- a/base/win/registry.cc +++ b/base/win/registry.cc @@ -82,7 +82,7 @@ bool RegKey::Watcher::StartWatching(HKEY key, const ChangeCallback& callback) { } callback_ = callback; - return object_watcher_.StartWatching(watch_event_.Get(), this); + return object_watcher_.StartWatchingOnce(watch_event_.Get(), this); } // RegKey ---------------------------------------------------------------------- diff --git a/chrome/common/service_process_util_win.cc b/chrome/common/service_process_util_win.cc index df7c039..99cb01d 100644 --- a/chrome/common/service_process_util_win.cc +++ b/chrome/common/service_process_util_win.cc @@ -58,7 +58,7 @@ class ServiceProcessTerminateMonitor base::string16 event_name = GetServiceProcessTerminateEventName(); DCHECK(event_name.length() <= MAX_PATH); terminate_event_.Set(CreateEvent(NULL, TRUE, FALSE, event_name.c_str())); - watcher_.StartWatching(terminate_event_.Get(), this); + watcher_.StartWatchingOnce(terminate_event_.Get(), this); } // base::ObjectWatcher::Delegate implementation. diff --git a/chrome/service/cloud_print/print_system_win.cc b/chrome/service/cloud_print/print_system_win.cc index e4a6262..26c56263 100644 --- a/chrome/service/cloud_print/print_system_win.cc +++ b/chrome/service/cloud_print/print_system_win.cc @@ -68,7 +68,7 @@ class PrintSystemWatcherWin : public base::win::ObjectWatcher::Delegate { printer_change_.Set(FindFirstPrinterChangeNotification( printer_.Get(), PRINTER_CHANGE_PRINTER|PRINTER_CHANGE_JOB, 0, NULL)); if (printer_change_.IsValid()) { - ret = watcher_.StartWatching(printer_change_.Get(), this); + ret = watcher_.StartWatchingOnce(printer_change_.Get(), this); } } if (!ret) { @@ -106,7 +106,7 @@ class PrintSystemWatcherWin : public base::win::ObjectWatcher::Delegate { delegate_->OnJobChanged(); } } - watcher_.StartWatching(printer_change_.Get(), this); + watcher_.StartWatchingOnce(printer_change_.Get(), this); } bool GetCurrentPrinterInfo(printing::PrinterBasicInfo* printer_info) { @@ -361,7 +361,8 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { delegate_->OnJobSpoolSucceeded(job_status.jobId); } else { job_progress_watcher_.StopWatching(); - job_progress_watcher_.StartWatching(job_progress_event_.Get(), this); + job_progress_watcher_.StartWatchingOnce( + job_progress_event_.Get(), this); } } @@ -483,7 +484,8 @@ class JobSpoolerWin : public PrintSystem::JobSpooler { if (FAILED(doc_stream->Close())) return false; - job_progress_watcher_.StartWatching(job_progress_event_.Get(), this); + job_progress_watcher_.StartWatchingOnce( + job_progress_event_.Get(), this); job_canceler.reset(); return true; } diff --git a/components/policy/core/common/policy_loader_win.cc b/components/policy/core/common/policy_loader_win.cc index 279a936..0ed6714 100644 --- a/components/policy/core/common/policy_loader_win.cc +++ b/components/policy/core/common/policy_loader_win.cc @@ -674,14 +674,14 @@ void PolicyLoaderWin::SetupWatches() { DCHECK(is_initialized_); if (!user_policy_watcher_failed_ && !user_policy_watcher_.GetWatchedObject() && - !user_policy_watcher_.StartWatching( + !user_policy_watcher_.StartWatchingOnce( user_policy_changed_event_.handle(), this)) { DLOG(WARNING) << "Failed to start watch for user policy change event"; user_policy_watcher_failed_ = true; } if (!machine_policy_watcher_failed_ && !machine_policy_watcher_.GetWatchedObject() && - !machine_policy_watcher_.StartWatching( + !machine_policy_watcher_.StartWatchingOnce( machine_policy_changed_event_.handle(), this)) { DLOG(WARNING) << "Failed to start watch for machine policy change event"; machine_policy_watcher_failed_ = true; diff --git a/content/browser/browser_child_process_host_impl.cc b/content/browser/browser_child_process_host_impl.cc index d88d5de..f15b4fc 100644 --- a/content/browser/browser_child_process_host_impl.cc +++ b/content/browser/browser_child_process_host_impl.cc @@ -378,7 +378,7 @@ void BrowserChildProcessHostImpl::OnProcessLaunched() { // connected and the exit of the child process is detecter by an error on the // IPC channel thereafter. DCHECK(!early_exit_watcher_.GetWatchedObject()); - early_exit_watcher_.StartWatching(process.Handle(), this); + early_exit_watcher_.StartWatchingOnce(process.Handle(), this); #endif // TODO(rvargas) crbug.com/417532: Don't store a handle. diff --git a/device/hid/hid_connection_win.cc b/device/hid/hid_connection_win.cc index 2e5eab2..827416d 100644 --- a/device/hid/hid_connection_win.cc +++ b/device/hid/hid_connection_win.cc @@ -81,7 +81,7 @@ void PendingHidTransfer::TakeResultFromWindowsAPI(BOOL result) { } else if (GetLastError() == ERROR_IO_PENDING) { base::MessageLoop::current()->AddDestructionObserver(this); AddRef(); - watcher_.StartWatching(event_.Get(), this); + watcher_.StartWatchingOnce(event_.Get(), this); } else { HID_PLOG(EVENT) << "HID transfer failed"; callback_.Run(this, false); diff --git a/net/base/network_change_notifier_win.cc b/net/base/network_change_notifier_win.cc index 27f230f..e768352 100644 --- a/net/base/network_change_notifier_win.cc +++ b/net/base/network_change_notifier_win.cc @@ -296,7 +296,7 @@ bool NetworkChangeNotifierWin::WatchForAddressChangeInternal() { if (ret != ERROR_IO_PENDING) return false; - addr_watcher_.StartWatching(addr_overlapped_.hEvent, this); + addr_watcher_.StartWatchingOnce(addr_overlapped_.hEvent, this); return true; } diff --git a/net/socket/tcp_socket_win.cc b/net/socket/tcp_socket_win.cc index fc7da41..b14475c 100644 --- a/net/socket/tcp_socket_win.cc +++ b/net/socket/tcp_socket_win.cc @@ -235,14 +235,14 @@ void TCPSocketWin::Core::WatchForRead() { // We grab an extra reference because there is an IO operation in progress. // Balanced in ReadDelegate::OnObjectSignaled(). AddRef(); - read_watcher_.StartWatching(read_overlapped_.hEvent, &reader_); + read_watcher_.StartWatchingOnce(read_overlapped_.hEvent, &reader_); } void TCPSocketWin::Core::WatchForWrite() { // We grab an extra reference because there is an IO operation in progress. // Balanced in WriteDelegate::OnObjectSignaled(). AddRef(); - write_watcher_.StartWatching(write_overlapped_.hEvent, &writer_); + write_watcher_.StartWatchingOnce(write_overlapped_.hEvent, &writer_); } void TCPSocketWin::Core::ReadDelegate::OnObjectSignaled(HANDLE object) { @@ -402,7 +402,7 @@ int TCPSocketWin::Accept(scoped_ptr<TCPSocketWin>* socket, if (result == ERR_IO_PENDING) { // Start watching. WSAEventSelect(socket_, accept_event_, FD_ACCEPT); - accept_watcher_.StartWatching(accept_event_, this); + accept_watcher_.StartWatchingOnce(accept_event_, this); accept_socket_ = socket; accept_address_ = address; @@ -772,7 +772,7 @@ void TCPSocketWin::OnObjectSignaled(HANDLE object) { // Start watching the next FD_ACCEPT event. WSAEventSelect(socket_, accept_event_, FD_ACCEPT); - accept_watcher_.StartWatching(accept_event_, this); + accept_watcher_.StartWatchingOnce(accept_event_, this); } } diff --git a/net/test/embedded_test_server/stream_listen_socket.cc b/net/test/embedded_test_server/stream_listen_socket.cc index 1056983..897b23b 100644 --- a/net/test/embedded_test_server/stream_listen_socket.cc +++ b/net/test/embedded_test_server/stream_listen_socket.cc @@ -228,7 +228,7 @@ void StreamListenSocket::CloseSocket() { void StreamListenSocket::WatchSocket(WaitState state) { #if defined(OS_WIN) WSAEventSelect(socket_, socket_event_, FD_ACCEPT | FD_CLOSE | FD_READ); - watcher_.StartWatching(socket_event_, this); + watcher_.StartWatchingOnce(socket_event_, this); #elif defined(OS_POSIX) // Implicitly calls StartWatchingFileDescriptor(). base::MessageLoopForIO::current()->WatchFileDescriptor( @@ -264,7 +264,7 @@ void StreamListenSocket::OnObjectSignaled(HANDLE object) { return; } // The object was reset by WSAEnumNetworkEvents. Watch for the next signal. - watcher_.StartWatching(object, this); + watcher_.StartWatchingOnce(object, this); if (ev.lNetworkEvents == 0) { // Occasionally the event is set even though there is no new data. diff --git a/net/udp/udp_socket_win.cc b/net/udp/udp_socket_win.cc index 65c6d19..f9c1d20 100644 --- a/net/udp/udp_socket_win.cc +++ b/net/udp/udp_socket_win.cc @@ -133,14 +133,14 @@ void UDPSocketWin::Core::WatchForRead() { // We grab an extra reference because there is an IO operation in progress. // Balanced in ReadDelegate::OnObjectSignaled(). AddRef(); - read_watcher_.StartWatching(read_overlapped_.hEvent, &reader_); + read_watcher_.StartWatchingOnce(read_overlapped_.hEvent, &reader_); } void UDPSocketWin::Core::WatchForWrite() { // We grab an extra reference because there is an IO operation in progress. // Balanced in WriteDelegate::OnObjectSignaled(). AddRef(); - write_watcher_.StartWatching(write_overlapped_.hEvent, &writer_); + write_watcher_.StartWatchingOnce(write_overlapped_.hEvent, &writer_); } void UDPSocketWin::Core::ReadDelegate::OnObjectSignaled(HANDLE object) { @@ -669,7 +669,7 @@ void UDPSocketWin::WatchForReadWrite() { if (read_write_watcher_.IsWatching()) return; bool watched = - read_write_watcher_.StartWatching(read_write_event_.Get(), this); + read_write_watcher_.StartWatchingOnce(read_write_event_.Get(), this); DCHECK(watched); } diff --git a/remoting/host/win/worker_process_launcher.cc b/remoting/host/win/worker_process_launcher.cc index 144be97..6daf02f 100644 --- a/remoting/host/win/worker_process_launcher.cc +++ b/remoting/host/win/worker_process_launcher.cc @@ -113,7 +113,7 @@ void WorkerProcessLauncher::OnProcessLaunched( DCHECK(!process_watcher_.GetWatchedObject()); DCHECK(!worker_process_.IsValid()); - if (!process_watcher_.StartWatching(worker_process.Get(), this)) { + if (!process_watcher_.StartWatchingOnce(worker_process.Get(), this)) { StopWorker(); return; } |