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

Unified Diff: base/win/object_watcher.cc

Issue 1350023003: Add a Mojo EDK for Chrome that uses one OS pipe per message pipe. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 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
Index: base/win/object_watcher.cc
diff --git a/base/win/object_watcher.cc b/base/win/object_watcher.cc
index 5ebe1856d3182aec93dd97e08f712f761d5bbbf9..bd9efbf799fd72fecc8d00e6afa9890a98fc0da0 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),
+ wait_many_(false),
weak_factory_(this) {
}
@@ -23,16 +24,20 @@ ObjectWatcher::~ObjectWatcher() {
StopWatching();
}
-bool ObjectWatcher::StartWatching(HANDLE object, Delegate* delegate) {
+bool ObjectWatcher::StartWatching(HANDLE object, Delegate* delegate,
+ bool wait_many) {
CHECK(delegate);
if (wait_object_) {
NOTREACHED() << "Already watching an object";
return false;
}
+ wait_many_ = wait_many;
// 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;
+ DWORD wait_flags = WT_EXECUTEINWAITTHREAD;
+ if (!wait_many_)
+ wait_flags |= WT_EXECUTEONLYONCE;
// DoneWaiting can be synchronously called from RegisterWaitForSingleObject,
// so set up all state now.
@@ -93,7 +98,8 @@ 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->wait_many_)
+ that->callback_.Reset();
}
void ObjectWatcher::Signal(Delegate* delegate) {
@@ -101,7 +107,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 (!wait_many_)
+ StopWatching();
delegate->OnObjectSignaled(object);
}

Powered by Google App Engine
This is Rietveld 408576698