1 /* Threads.c -- multithreading library
11 DWORD res
= GetLastError();
12 return (res
) ? (WRes
)(res
) : 1;
15 WRes
HandleToWRes(HANDLE h
) { return (h
!= 0) ? 0 : GetError(); }
16 WRes
BOOLToWRes(BOOL v
) { return v
? 0 : GetError(); }
18 static WRes
MyCloseHandle(HANDLE
*h
)
27 WRes
Thread_Create(CThread
*thread
, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE
*startAddress
)(void *), LPVOID parameter
)
29 unsigned threadId
; /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */
31 /* CreateThread(0, 0, startAddress, parameter, 0, &threadId); */
32 (HANDLE
)_beginthreadex(NULL
, 0, startAddress
, parameter
, 0, &threadId
);
33 /* maybe we must use errno here, but probably GetLastError() is also OK. */
34 return HandleToWRes(thread
->handle
);
37 WRes
WaitObject(HANDLE h
)
39 return (WRes
)WaitForSingleObject(h
, INFINITE
);
42 WRes
Thread_Wait(CThread
*thread
)
44 if (thread
->handle
== NULL
)
46 return WaitObject(thread
->handle
);
49 WRes
Thread_Close(CThread
*thread
)
51 return MyCloseHandle(&thread
->handle
);
54 WRes
Event_Create(CEvent
*p
, BOOL manualReset
, int initialSignaled
)
56 p
->handle
= CreateEvent(NULL
, manualReset
, (initialSignaled
? TRUE
: FALSE
), NULL
);
57 return HandleToWRes(p
->handle
);
60 WRes
ManualResetEvent_Create(CManualResetEvent
*p
, int initialSignaled
)
61 { return Event_Create(p
, TRUE
, initialSignaled
); }
62 WRes
ManualResetEvent_CreateNotSignaled(CManualResetEvent
*p
)
63 { return ManualResetEvent_Create(p
, 0); }
65 WRes
AutoResetEvent_Create(CAutoResetEvent
*p
, int initialSignaled
)
66 { return Event_Create(p
, FALSE
, initialSignaled
); }
67 WRes
AutoResetEvent_CreateNotSignaled(CAutoResetEvent
*p
)
68 { return AutoResetEvent_Create(p
, 0); }
70 WRes
Event_Set(CEvent
*p
) { return BOOLToWRes(SetEvent(p
->handle
)); }
71 WRes
Event_Reset(CEvent
*p
) { return BOOLToWRes(ResetEvent(p
->handle
)); }
72 WRes
Event_Wait(CEvent
*p
) { return WaitObject(p
->handle
); }
73 WRes
Event_Close(CEvent
*p
) { return MyCloseHandle(&p
->handle
); }
76 WRes
Semaphore_Create(CSemaphore
*p
, UInt32 initiallyCount
, UInt32 maxCount
)
78 p
->handle
= CreateSemaphore(NULL
, (LONG
)initiallyCount
, (LONG
)maxCount
, NULL
);
79 return HandleToWRes(p
->handle
);
82 WRes
Semaphore_Release(CSemaphore
*p
, LONG releaseCount
, LONG
*previousCount
)
84 return BOOLToWRes(ReleaseSemaphore(p
->handle
, releaseCount
, previousCount
));
86 WRes
Semaphore_ReleaseN(CSemaphore
*p
, UInt32 releaseCount
)
88 return Semaphore_Release(p
, (LONG
)releaseCount
, NULL
);
90 WRes
Semaphore_Release1(CSemaphore
*p
)
92 return Semaphore_ReleaseN(p
, 1);
95 WRes
Semaphore_Wait(CSemaphore
*p
) { return WaitObject(p
->handle
); }
96 WRes
Semaphore_Close(CSemaphore
*p
) { return MyCloseHandle(&p
->handle
); }
98 WRes
CriticalSection_Init(CCriticalSection
*p
)
100 /* InitializeCriticalSection can raise only STATUS_NO_MEMORY exception */
103 InitializeCriticalSection(p
);
104 /* InitializeCriticalSectionAndSpinCount(p, 0); */
106 __except (EXCEPTION_EXECUTE_HANDLER
) { return 1; }