summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-06 01:21:30 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-06 01:21:30 +0000
commit05f007c22ee94c9143d730910bd26efed7a663b8 (patch)
treec4d8d1c36c19a2db88fd86c6d35d5b134ef4837e
parentb7688d7ddfb50980c80faa5b47f236f24d061f98 (diff)
downloadchromium_src-05f007c22ee94c9143d730910bd26efed7a663b8.zip
chromium_src-05f007c22ee94c9143d730910bd26efed7a663b8.tar.gz
chromium_src-05f007c22ee94c9143d730910bd26efed7a663b8.tar.bz2
An assert was being hit because WaitableEvent's dtor was calling CloseHandle on a handle that we already closed.
BUG=8070 Review URL: http://codereview.chromium.org/40195 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@11078 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--base/waitable_event.h3
-rw-r--r--base/waitable_event_win.cc6
-rw-r--r--chrome/common/child_process_host.cc4
3 files changed, 13 insertions, 0 deletions
diff --git a/base/waitable_event.h b/base/waitable_event.h
index 022a88a..28c130b 100644
--- a/base/waitable_event.h
+++ b/base/waitable_event.h
@@ -56,6 +56,9 @@ class WaitableEvent {
// created. This objects takes ownership of the HANDLE and will close it when
// deleted.
explicit WaitableEvent(HANDLE event_handle);
+
+ // Releases ownership of the handle from this object.
+ HANDLE Release();
#endif
// WARNING: Destroying a WaitableEvent while threads are waiting on it is not
diff --git a/base/waitable_event_win.cc b/base/waitable_event_win.cc
index 001a5df..ac85c5c 100644
--- a/base/waitable_event_win.cc
+++ b/base/waitable_event_win.cc
@@ -28,6 +28,12 @@ WaitableEvent::~WaitableEvent() {
CloseHandle(handle_);
}
+HANDLE WaitableEvent::Release() {
+ HANDLE rv = handle_;
+ handle_ = INVALID_HANDLE_VALUE;
+ return rv;
+}
+
void WaitableEvent::Reset() {
ResetEvent(handle_);
}
diff --git a/chrome/common/child_process_host.cc b/chrome/common/child_process_host.cc
index 7839f44..a5058d2 100644
--- a/chrome/common/child_process_host.cc
+++ b/chrome/common/child_process_host.cc
@@ -55,6 +55,10 @@ ChildProcessHost::~ChildProcessHost() {
if (handle()) {
watcher_.StopWatching();
ProcessWatcher::EnsureProcessTerminated(handle());
+
+ // Above call took ownership, so don't want WaitableEvent to assert because
+ // the handle isn't valid anymore.
+ process_event_->Release();
}
}