@@ -24,7 +24,9 @@ when defined(windows):
2424 LockSemaphore : int
2525 SpinCount : int
2626
27- SysCond = Handle
27+ RTL_CONDITION_VARIABLE {.importc : " RTL_CONDITION_VARIABLE" , header : " synchapi.h" .} = object
28+ thePtr {.importc : " ptr" .} : Handle
29+ SysCond = RTL_CONDITION_VARIABLE
2830
2931 proc initSysLock (L: var SysLock ) {.importc : " InitializeCriticalSection" ,
3032 header : " <windows.h>" .}
@@ -48,30 +50,29 @@ when defined(windows):
4850 proc deinitSys (L: var SysLock ) {.importc : " DeleteCriticalSection" ,
4951 header : " <windows.h>" .}
5052
51- proc createEvent (lpEventAttributes: pointer ,
52- bManualReset, bInitialState: int32 ,
53- lpName: cstring ): SysCond {.stdcall , noSideEffect ,
54- dynlib : " kernel32" , importc : " CreateEventA" .}
53+ proc initializeConditionVariable (
54+ conditionVariable: var SysCond
55+ ) {.stdcall , noSideEffect , dynlib : " kernel32" , importc : " InitializeConditionVariable" .}
5556
56- proc closeHandle (hObject: Handle ) {.stdcall , noSideEffect ,
57- dynlib : " kernel32" , importc : " CloseHandle" .}
58- proc waitForSingleObject (hHandle: Handle , dwMilliseconds: int32 ): int32 {.
59- stdcall , dynlib : " kernel32" , importc : " WaitForSingleObject" , noSideEffect .}
57+ proc sleepConditionVariableCS (
58+ conditionVariable: var SysCond ,
59+ PCRITICAL_SECTION: var SysLock ,
60+ dwMilliseconds: int
61+ ): int32 {.stdcall , noSideEffect , dynlib : " kernel32" , importc : " SleepConditionVariableCS" .}
6062
61- proc signalSysCond (hEvent: SysCond ) {.stdcall , noSideEffect ,
62- dynlib : " kernel32" , importc : " SetEvent" .}
63+
64+ proc signalSysCond (hEvent: var SysCond ) {.stdcall , noSideEffect ,
65+ dynlib : " kernel32" , importc : " WakeConditionVariable" .}
66+
67+ proc broadcastSysCond (hEvent: var SysCond ) {.stdcall , noSideEffect ,
68+ dynlib : " kernel32" , importc : " WakeAllConditionVariable" .}
6369
6470 proc initSysCond (cond: var SysCond ) {.inline .} =
65- cond = createEvent ( nil , 0 'i32 , 0 'i32 , nil )
71+ initializeConditionVariable (cond )
6672 proc deinitSysCond (cond: var SysCond ) {.inline .} =
67- closeHandle (cond)
73+ discard
6874 proc waitSysCond (cond: var SysCond , lock: var SysLock ) =
69- releaseSys (lock)
70- discard waitForSingleObject (cond, - 1 'i32 )
71- acquireSys (lock)
72-
73- proc waitSysCondWindows (cond: var SysCond ) =
74- discard waitForSingleObject (cond, - 1 'i32 )
75+ discard sleepConditionVariableCS (cond, lock, - 1 'i32 )
7576
7677elif defined (genode):
7778 const
@@ -94,6 +95,8 @@ elif defined(genode):
9495 noSideEffect , importcpp .}
9596 proc signalSysCond (cond: var SysCond ) {.
9697 noSideEffect , importcpp .}
98+ proc broadcastSysCond (cond: var SysCond ) {.
99+ noSideEffect , importcpp .}
97100
98101else :
99102 type
@@ -181,7 +184,7 @@ else:
181184 releaseSysAux (L)
182185
183186 when insideRLocksModule:
184- let SysLockType_Reentrant{.importc : " PTHREAD_MUTEX_RECURSIVE" ,
187+ let SysLockType_Reentrant {.importc : " PTHREAD_MUTEX_RECURSIVE" ,
185188 header : " <pthread.h>" .}: SysLockType
186189 proc initSysLockAttr (a: var SysLockAttr ) {.
187190 importc : " pthread_mutexattr_init" , header : " <pthread.h>" , noSideEffect .}
@@ -194,10 +197,12 @@ else:
194197 proc deinitSysCondAux (cond: var SysCondObj ) {.noSideEffect ,
195198 importc : " pthread_cond_destroy" , header : " <pthread.h>" .}
196199
197- proc waitSysCondAux (cond: var SysCondObj , lock: var SysLockObj ) {.
200+ proc waitSysCondAux (cond: var SysCondObj , lock: var SysLockObj ): cint {.
198201 importc : " pthread_cond_wait" , header : " <pthread.h>" , noSideEffect .}
199202 proc signalSysCondAux (cond: var SysCondObj ) {.
200203 importc : " pthread_cond_signal" , header : " <pthread.h>" , noSideEffect .}
204+ proc broadcastSysCondAux (cond: var SysCondObj ) {.
205+ importc : " pthread_cond_broadcast" , header : " <pthread.h>" , noSideEffect .}
201206
202207 when defined (ios):
203208 proc initSysCond (cond: var SysCond , cond_attr: ptr SysCondAttr = nil ) =
@@ -209,18 +214,22 @@ else:
209214 c_free (cond)
210215
211216 template waitSysCond (cond: var SysCond , lock: var SysLock ) =
212- waitSysCondAux (cond[], lock[])
217+ discard waitSysCondAux (cond[], lock[])
213218 template signalSysCond (cond: var SysCond ) =
214219 signalSysCondAux (cond[])
220+ template broadcastSysCond (cond: var SysCond ) =
221+ broadcastSysCondAux (cond[])
215222 else :
216223 template initSysCond (cond: var SysCond , cond_attr: ptr SysCondAttr = nil ) =
217224 initSysCondAux (cond, cond_attr)
218225 template deinitSysCond (cond: var SysCond ) =
219226 deinitSysCondAux (cond)
220227
221228 template waitSysCond (cond: var SysCond , lock: var SysLock ) =
222- waitSysCondAux (cond, lock)
229+ discard waitSysCondAux (cond, lock)
223230 template signalSysCond (cond: var SysCond ) =
224231 signalSysCondAux (cond)
232+ template broadcastSysCond (cond: var SysCond ) =
233+ broadcastSysCondAux (cond)
225234
226235{.pop .}
0 commit comments