Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2212)

Unified Diff: base/synchronization/waitable_event_watcher_win.cc

Issue 2839213002: [Synchronization] Fix a crash in WaitableEventWatcher (Closed)
Patch Set: Fix grammar in comments Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/synchronization/waitable_event_watcher_unittest.cc ('k') | base/win/object_watcher.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/synchronization/waitable_event_watcher_win.cc
diff --git a/base/synchronization/waitable_event_watcher_win.cc b/base/synchronization/waitable_event_watcher_win.cc
index f3e114e3966149c610d5579ec69fddaf32555c5f..d28b6a765743cc2cc41d49790be1ca1d0afd58ab 100644
--- a/base/synchronization/waitable_event_watcher_win.cc
+++ b/base/synchronization/waitable_event_watcher_win.cc
@@ -12,26 +12,43 @@ namespace base {
WaitableEventWatcher::WaitableEventWatcher() = default;
-WaitableEventWatcher::~WaitableEventWatcher() {
-}
+WaitableEventWatcher::~WaitableEventWatcher() {}
bool WaitableEventWatcher::StartWatching(WaitableEvent* event,
EventCallback callback) {
+ DCHECK(event);
callback_ = std::move(callback);
event_ = event;
- return watcher_.StartWatchingOnce(event->handle(), this);
+
+ // Duplicate and hold the event handle until a callback is returned or
+ // waiting is stopped.
+ HANDLE handle = nullptr;
+ if (!::DuplicateHandle(::GetCurrentProcess(), // hSourceProcessHandle
+ event->handle(),
+ ::GetCurrentProcess(), // hTargetProcessHandle
+ &handle,
+ 0, // dwDesiredAccess ignored due to SAME_ACCESS
+ FALSE, // !bInheritHandle
+ DUPLICATE_SAME_ACCESS)) {
+ return false;
+ }
+ duplicated_event_handle_.Set(handle);
+ return watcher_.StartWatchingOnce(handle, this);
}
void WaitableEventWatcher::StopWatching() {
callback_.Reset();
event_ = NULL;
watcher_.StopWatching();
+ duplicated_event_handle_.Close();
}
void WaitableEventWatcher::OnObjectSignaled(HANDLE h) {
+ DCHECK_EQ(duplicated_event_handle_.Get(), h);
WaitableEvent* event = event_;
EventCallback callback = std::move(callback_);
event_ = NULL;
+ duplicated_event_handle_.Close();
DCHECK(event);
std::move(callback).Run(event);
« no previous file with comments | « base/synchronization/waitable_event_watcher_unittest.cc ('k') | base/win/object_watcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698