blob: 3a9ce9c80b6a154d74bf380eccbfa767f03560d8 [file] [log] [blame]
license.botf003cfe2008-08-24 09:55:55 +09001// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit3f4a7322008-07-27 06:49:38 +09004
5#include "base/shared_event.h"
6#include "base/logging.h"
7#include "base/time.h"
8
9SharedEvent::~SharedEvent() {
10 Close();
11}
12
13bool SharedEvent::Create(bool manual_reset, bool initial_state) {
14 DCHECK(!event_handle_);
15 event_handle_ = CreateEvent(NULL /* security attributes */, manual_reset,
16 initial_state, NULL /* name */);
17 DCHECK(event_handle_);
18 return !!event_handle_;
19}
20
21void SharedEvent::Close() {
22 if (event_handle_) {
23 BOOL rv = CloseHandle(event_handle_);
24 DCHECK(rv);
25 event_handle_ = NULL;
26 }
27}
28
29bool SharedEvent::SetSignaledState(bool signaled) {
30 DCHECK(event_handle_);
31 BOOL rv;
32 if (signaled) {
33 rv = SetEvent(event_handle_);
34 } else {
35 rv = ResetEvent(event_handle_);
36 }
37 return rv ? true : false;
38}
39
40bool SharedEvent::IsSignaled() {
41 DCHECK(event_handle_);
42 DWORD event_state = ::WaitForSingleObject(event_handle_, 0);
43 DCHECK(WAIT_OBJECT_0 == event_state || WAIT_TIMEOUT == event_state);
44 return event_state == WAIT_OBJECT_0;
45}
46
47bool SharedEvent::WaitUntilSignaled(const TimeDelta& timeout) {
48 DCHECK(event_handle_);
49 DWORD event_state = ::WaitForSingleObject(event_handle_,
50 static_cast<DWORD>(timeout.InMillisecondsF()));
51 return event_state == WAIT_OBJECT_0;
52}
53
54bool SharedEvent::WaitForeverUntilSignaled() {
55 DCHECK(event_handle_);
56 DWORD event_state = ::WaitForSingleObject(event_handle_,
57 INFINITE);
58 return event_state == WAIT_OBJECT_0;
59}
60
61bool SharedEvent::ShareToProcess(ProcessHandle process,
62 SharedEventHandle *new_handle) {
63 DCHECK(event_handle_);
64 HANDLE event_handle_copy;
65 BOOL rv = DuplicateHandle(GetCurrentProcess(), event_handle_, process,
66 &event_handle_copy, 0, FALSE, DUPLICATE_SAME_ACCESS);
67
68 if (rv)
69 *new_handle = event_handle_copy;
70 return rv ? true : false;
71}
72
73bool SharedEvent::GiveToProcess(ProcessHandle process,
74 SharedEventHandle *new_handle) {
75 bool rv = ShareToProcess(process, new_handle);
76 if (rv)
77 Close();
78 return rv;
79}
license.botf003cfe2008-08-24 09:55:55 +090080