8 DWORD res
= GetLastError();
9 return (res
) ? (HRes
)(res
) : SZE_FAIL
;
12 HRes
BoolToHRes(int v
) { return v
? SZ_OK
: GetError(); }
13 HRes
BOOLToHRes(BOOL v
) { return v
? SZ_OK
: GetError(); }
15 HRes
MyCloseHandle(HANDLE
*h
)
24 HRes
Thread_Create(CThread
*thread
, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE
*startAddress
)(void *), LPVOID parameter
)
26 unsigned threadId
; /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */
28 /* CreateThread(0, 0, startAddress, parameter, 0, &threadId); */
29 (HANDLE
)_beginthreadex(NULL
, 0, startAddress
, parameter
, 0, &threadId
);
30 /* maybe we must use errno here, but probably GetLastError() is also OK. */
31 return BoolToHRes(thread
->handle
!= 0);
34 HRes
WaitObject(HANDLE h
)
36 return (HRes
)WaitForSingleObject(h
, INFINITE
);
39 HRes
Thread_Wait(CThread
*thread
)
41 if (thread
->handle
== NULL
)
43 return WaitObject(thread
->handle
);
46 HRes
Thread_Close(CThread
*thread
)
48 return MyCloseHandle(&thread
->handle
);
51 HRes
Event_Create(CEvent
*p
, BOOL manualReset
, int initialSignaled
)
53 p
->handle
= CreateEvent(NULL
, manualReset
, (initialSignaled
? TRUE
: FALSE
), NULL
);
54 return BoolToHRes(p
->handle
!= 0);
57 HRes
ManualResetEvent_Create(CManualResetEvent
*p
, int initialSignaled
)
58 { return Event_Create(p
, TRUE
, initialSignaled
); }
59 HRes
ManualResetEvent_CreateNotSignaled(CManualResetEvent
*p
)
60 { return ManualResetEvent_Create(p
, 0); }
62 HRes
AutoResetEvent_Create(CAutoResetEvent
*p
, int initialSignaled
)
63 { return Event_Create(p
, FALSE
, initialSignaled
); }
64 HRes
AutoResetEvent_CreateNotSignaled(CAutoResetEvent
*p
)
65 { return AutoResetEvent_Create(p
, 0); }
67 HRes
Event_Set(CEvent
*p
) { return BOOLToHRes(SetEvent(p
->handle
)); }
68 HRes
Event_Reset(CEvent
*p
) { return BOOLToHRes(ResetEvent(p
->handle
)); }
69 HRes
Event_Wait(CEvent
*p
) { return WaitObject(p
->handle
); }
70 HRes
Event_Close(CEvent
*p
) { return MyCloseHandle(&p
->handle
); }
73 HRes
Semaphore_Create(CSemaphore
*p
, UInt32 initiallyCount
, UInt32 maxCount
)
75 p
->handle
= CreateSemaphore(NULL
, (LONG
)initiallyCount
, (LONG
)maxCount
, NULL
);
76 return BoolToHRes(p
->handle
!= 0);
79 HRes
Semaphore_Release(CSemaphore
*p
, LONG releaseCount
, LONG
*previousCount
)
81 return BOOLToHRes(ReleaseSemaphore(p
->handle
, releaseCount
, previousCount
));
83 HRes
Semaphore_ReleaseN(CSemaphore
*p
, UInt32 releaseCount
)
85 return Semaphore_Release(p
, (LONG
)releaseCount
, NULL
);
87 HRes
Semaphore_Release1(CSemaphore
*p
)
89 return Semaphore_ReleaseN(p
, 1);
92 HRes
Semaphore_Wait(CSemaphore
*p
) { return WaitObject(p
->handle
); }
93 HRes
Semaphore_Close(CSemaphore
*p
) { return MyCloseHandle(&p
->handle
); }
95 HRes
CriticalSection_Init(CCriticalSection
*p
)
97 /* InitializeCriticalSection can raise only STATUS_NO_MEMORY exception */
100 InitializeCriticalSection(p
);
101 /* InitializeCriticalSectionAndSpinCount(p, 0); */
103 __except (EXCEPTION_EXECUTE_HANDLER
) { return SZE_OUTOFMEMORY
; }