Panda3D

conditionVarWin32Impl.I

00001 // Filename: conditionVarWin32Impl.I
00002 // Created by:  drose (07Feb06)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
00012 //
00013 ////////////////////////////////////////////////////////////////////
00014 
00015 
00016 ////////////////////////////////////////////////////////////////////
00017 //     Function: ConditionVarWin32Impl::Constructor
00018 //       Access: Public
00019 //  Description:
00020 ////////////////////////////////////////////////////////////////////
00021 INLINE ConditionVarWin32Impl::
00022 ConditionVarWin32Impl(MutexWin32Impl &mutex) {
00023   _external_mutex = &mutex._lock;
00024 
00025   // Create an auto-reset event.
00026   _event_signal = CreateEvent(NULL, false, false, NULL);
00027 }
00028 
00029 ////////////////////////////////////////////////////////////////////
00030 //     Function: ConditionVarWin32Impl::Destructor
00031 //       Access: Public
00032 //  Description:
00033 ////////////////////////////////////////////////////////////////////
00034 INLINE ConditionVarWin32Impl::
00035 ~ConditionVarWin32Impl() {
00036   CloseHandle(_event_signal);
00037 }
00038 
00039 ////////////////////////////////////////////////////////////////////
00040 //     Function: ConditionVarWin32Impl::wait
00041 //       Access: Public
00042 //  Description: 
00043 ////////////////////////////////////////////////////////////////////
00044 INLINE void ConditionVarWin32Impl::
00045 wait() {
00046   LeaveCriticalSection(_external_mutex);
00047 
00048   DWORD result = WaitForSingleObject(_event_signal, INFINITE);
00049   nassertv(result == WAIT_OBJECT_0);
00050 
00051   EnterCriticalSection(_external_mutex);
00052 }
00053 
00054 ////////////////////////////////////////////////////////////////////
00055 //     Function: ConditionVarWin32Impl::wait
00056 //       Access: Public
00057 //  Description: 
00058 ////////////////////////////////////////////////////////////////////
00059 INLINE void ConditionVarWin32Impl::
00060 wait(double timeout) {
00061   LeaveCriticalSection(_external_mutex);
00062 
00063   DWORD result = WaitForSingleObject(_event_signal, (DWORD)(timeout * 1000.0));
00064   nassertv(result == WAIT_OBJECT_0 || result == WAIT_TIMEOUT);
00065 
00066   EnterCriticalSection(_external_mutex);
00067 }
00068 
00069 ////////////////////////////////////////////////////////////////////
00070 //     Function: ConditionVarWin32Impl::notify
00071 //       Access: Public
00072 //  Description: 
00073 ////////////////////////////////////////////////////////////////////
00074 INLINE void ConditionVarWin32Impl::
00075 notify() {
00076   SetEvent(_event_signal);
00077 }
 All Classes Functions Variables Enumerations