diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-06 01:21:30 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-06 01:21:30 +0000 |
commit | 05f007c22ee94c9143d730910bd26efed7a663b8 (patch) | |
tree | c4d8d1c36c19a2db88fd86c6d35d5b134ef4837e | |
parent | b7688d7ddfb50980c80faa5b47f236f24d061f98 (diff) | |
download | chromium_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.h | 3 | ||||
-rw-r--r-- | base/waitable_event_win.cc | 6 | ||||
-rw-r--r-- | chrome/common/child_process_host.cc | 4 |
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(); } } |