3 * This file is part of the libCEC(R) library.
5 * libCEC(R) is Copyright (C) 2011-2012 Pulse-Eight Limited. All rights reserved.
6 * libCEC(R) is an original work, containing original code.
8 * libCEC(R) is a trademark of Pulse-Eight Limited.
10 * This program is dual-licensed; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 * Alternatively, you can license this library under a commercial license,
26 * please contact Pulse-Eight Licensing for more information.
28 * For more information contact:
29 * Pulse-Eight Licensing <license@pulse-eight.com>
30 * http://www.pulse-eight.com/
31 * http://www.pulse-eight.net/
36 #define thread_t HANDLE
37 #define ThreadsWait(thread, retVal) (::WaitForSingleObject(thread, INFINITE) < 0)
38 #define ThreadsCreate(thread, func, arg) ((thread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, arg, 0, NULL)) == NULL ? false : true)
40 typedef CRITICAL_SECTION
* mutex_t
;
41 #define MutexCreate(mutex) ::InitializeCriticalSection(mutex = new CRITICAL_SECTION)
42 #define MutexDelete(mutex) ::DeleteCriticalSection(mutex); delete mutex
43 #define MutexLock(mutex) ::EnterCriticalSection(mutex)
44 #define MutexTryLock(mutex) (::TryEnterCriticalSection(mutex) != 0)
45 #define MutexUnlock(mutex) ::LeaveCriticalSection(mutex)
47 // windows vista+ conditions
48 typedef VOID (WINAPI
*ConditionArg
) (CONDITION_VARIABLE
*);
49 typedef BOOL (WINAPI
*ConditionMutexArg
)(CONDITION_VARIABLE
*, CRITICAL_SECTION
*, DWORD
);
50 static ConditionArg g_InitializeConditionVariable
;
51 static ConditionArg g_WakeConditionVariable
;
52 static ConditionArg g_WakeAllConditionVariable
;
53 static ConditionMutexArg g_SleepConditionVariableCS
;
55 // check whether vista+ conditions are available at runtime
56 static bool CheckVistaConditionFunctions(void)
58 static int iHasVistaConditionFunctions(-1);
59 if (iHasVistaConditionFunctions
== -1)
61 HMODULE handle
= GetModuleHandle("Kernel32");
64 iHasVistaConditionFunctions
= 0;
68 g_InitializeConditionVariable
= (ConditionArg
) GetProcAddress(handle
,"InitializeConditionVariable");
69 g_WakeConditionVariable
= (ConditionArg
) GetProcAddress(handle
,"WakeConditionVariable");
70 g_WakeAllConditionVariable
= (ConditionArg
) GetProcAddress(handle
,"WakeAllConditionVariable");
71 g_SleepConditionVariableCS
= (ConditionMutexArg
)GetProcAddress(handle
,"SleepConditionVariableCS");
73 // 1 when everything is resolved, 0 otherwise
74 iHasVistaConditionFunctions
= g_InitializeConditionVariable
&&
75 g_WakeConditionVariable
&&
76 g_WakeAllConditionVariable
&&
77 g_SleepConditionVariableCS
? 1 : 0;
80 return iHasVistaConditionFunctions
== 1;
88 m_bOnVista
= CheckVistaConditionFunctions();
90 (*g_InitializeConditionVariable
)(m_conditionVista
= new CONDITION_VARIABLE
);
92 m_conditionPreVista
= ::CreateEvent(NULL
, TRUE
, FALSE
, NULL
);
95 virtual ~CConditionImpl(void)
98 delete m_conditionVista
;
100 ::CloseHandle(m_conditionPreVista
);
106 (*g_WakeConditionVariable
)(m_conditionVista
);
108 ::SetEvent(m_conditionPreVista
);
114 (*g_WakeAllConditionVariable
)(m_conditionVista
);
116 ::SetEvent(m_conditionPreVista
);
119 bool Wait(mutex_t
&mutex
, uint32_t iTimeoutMs
)
123 return ((*g_SleepConditionVariableCS
)(m_conditionVista
, mutex
, iTimeoutMs
<= 0 ? INFINITE
: iTimeoutMs
) ? true : false);
127 ::ResetEvent(m_conditionPreVista
);
129 DWORD iWaitReturn
= ::WaitForSingleObject(m_conditionPreVista
, iTimeoutMs
<= 0 ? 1000 : iTimeoutMs
);
131 return (iWaitReturn
== 0);
136 CONDITION_VARIABLE
*m_conditionVista
;
137 HANDLE m_conditionPreVista
;