Panda3D
conditionVarWin32Impl.I
1 // Filename: conditionVarWin32Impl.I
2 // Created by: drose (07Feb06)
3 //
4 ////////////////////////////////////////////////////////////////////
5 //
6 // PANDA 3D SOFTWARE
7 // Copyright (c) Carnegie Mellon University. All rights reserved.
8 //
9 // All use of this software is subject to the terms of the revised BSD
10 // license. You should have received a copy of this license along
11 // with this source code in a file named "LICENSE."
12 //
13 ////////////////////////////////////////////////////////////////////
14 
15 
16 ////////////////////////////////////////////////////////////////////
17 // Function: ConditionVarWin32Impl::Constructor
18 // Access: Public
19 // Description:
20 ////////////////////////////////////////////////////////////////////
21 INLINE ConditionVarWin32Impl::
22 ConditionVarWin32Impl(MutexWin32Impl &mutex) {
23  _external_mutex = &mutex._lock;
24 
25  // Create an auto-reset event.
26  _event_signal = CreateEvent(NULL, false, false, NULL);
27 }
28 
29 ////////////////////////////////////////////////////////////////////
30 // Function: ConditionVarWin32Impl::Destructor
31 // Access: Public
32 // Description:
33 ////////////////////////////////////////////////////////////////////
34 INLINE ConditionVarWin32Impl::
35 ~ConditionVarWin32Impl() {
36  CloseHandle(_event_signal);
37 }
38 
39 ////////////////////////////////////////////////////////////////////
40 // Function: ConditionVarWin32Impl::wait
41 // Access: Public
42 // Description:
43 ////////////////////////////////////////////////////////////////////
44 INLINE void ConditionVarWin32Impl::
45 wait() {
46  LeaveCriticalSection(_external_mutex);
47 
48  DWORD result = WaitForSingleObject(_event_signal, INFINITE);
49  nassertv(result == WAIT_OBJECT_0);
50 
51  EnterCriticalSection(_external_mutex);
52 }
53 
54 ////////////////////////////////////////////////////////////////////
55 // Function: ConditionVarWin32Impl::wait
56 // Access: Public
57 // Description:
58 ////////////////////////////////////////////////////////////////////
59 INLINE void ConditionVarWin32Impl::
60 wait(double timeout) {
61  LeaveCriticalSection(_external_mutex);
62 
63  DWORD result = WaitForSingleObject(_event_signal, (DWORD)(timeout * 1000.0));
64  nassertv(result == WAIT_OBJECT_0 || result == WAIT_TIMEOUT);
65 
66  EnterCriticalSection(_external_mutex);
67 }
68 
69 ////////////////////////////////////////////////////////////////////
70 // Function: ConditionVarWin32Impl::notify
71 // Access: Public
72 // Description:
73 ////////////////////////////////////////////////////////////////////
74 INLINE void ConditionVarWin32Impl::
75 notify() {
76  SetEvent(_event_signal);
77 }