summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--base/files/file_path_watcher_win.cc4
-rw-r--r--base/process/kill_win.cc2
-rw-r--r--base/synchronization/waitable_event_watcher_win.cc2
-rw-r--r--base/win/object_watcher.cc78
-rw-r--r--base/win/object_watcher.h28
-rw-r--r--base/win/object_watcher_unittest.cc57
-rw-r--r--base/win/registry.cc2
-rw-r--r--chrome/common/service_process_util_win.cc2
-rw-r--r--chrome/service/cloud_print/print_system_win.cc10
-rw-r--r--components/policy/core/common/policy_loader_win.cc4
-rw-r--r--content/browser/browser_child_process_host_impl.cc2
-rw-r--r--device/hid/hid_connection_win.cc2
-rw-r--r--net/base/network_change_notifier_win.cc2
-rw-r--r--net/socket/tcp_socket_win.cc8
-rw-r--r--net/test/embedded_test_server/stream_listen_socket.cc4
-rw-r--r--net/udp/udp_socket_win.cc6
-rw-r--r--remoting/host/win/worker_process_launcher.cc2
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;
}