1 /* Threads.c -- multithreading library
2 2014-09-21 : Igor Pavlov : Public domain */
12 static WRes
GetError()
14 DWORD res
= GetLastError();
15 return (res
) ? (WRes
)(res
) : 1;
18 WRes
HandleToWRes(HANDLE h
) { return (h
!= 0) ? 0 : GetError(); }
19 WRes
BOOLToWRes(BOOL v
) { return v
? 0 : GetError(); }
21 WRes
HandlePtr_Close(HANDLE
*p
)
30 WRes
Handle_WaitObject(HANDLE h
) { return (WRes
)WaitForSingleObject(h
, INFINITE
); }
32 WRes
Thread_Create(CThread
*p
, THREAD_FUNC_TYPE func
, LPVOID param
)
34 /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */
39 *p
= CreateThread(0, 0, func
, param
, 0, &threadId
);
44 *p
= (HANDLE
)_beginthreadex(NULL
, 0, func
, param
, 0, &threadId
);
48 /* maybe we must use errno here, but probably GetLastError() is also OK. */
49 return HandleToWRes(*p
);
52 WRes
Event_Create(CEvent
*p
, BOOL manualReset
, int signaled
)
54 *p
= CreateEvent(NULL
, manualReset
, (signaled
? TRUE
: FALSE
), NULL
);
55 return HandleToWRes(*p
);
58 WRes
Event_Set(CEvent
*p
) { return BOOLToWRes(SetEvent(*p
)); }
59 WRes
Event_Reset(CEvent
*p
) { return BOOLToWRes(ResetEvent(*p
)); }
61 WRes
ManualResetEvent_Create(CManualResetEvent
*p
, int signaled
) { return Event_Create(p
, TRUE
, signaled
); }
62 WRes
AutoResetEvent_Create(CAutoResetEvent
*p
, int signaled
) { return Event_Create(p
, FALSE
, signaled
); }
63 WRes
ManualResetEvent_CreateNotSignaled(CManualResetEvent
*p
) { return ManualResetEvent_Create(p
, 0); }
64 WRes
AutoResetEvent_CreateNotSignaled(CAutoResetEvent
*p
) { return AutoResetEvent_Create(p
, 0); }
67 WRes
Semaphore_Create(CSemaphore
*p
, UInt32 initCount
, UInt32 maxCount
)
69 *p
= CreateSemaphore(NULL
, (LONG
)initCount
, (LONG
)maxCount
, NULL
);
70 return HandleToWRes(*p
);
73 static WRes
Semaphore_Release(CSemaphore
*p
, LONG releaseCount
, LONG
*previousCount
)
74 { return BOOLToWRes(ReleaseSemaphore(*p
, releaseCount
, previousCount
)); }
75 WRes
Semaphore_ReleaseN(CSemaphore
*p
, UInt32 num
)
76 { return Semaphore_Release(p
, (LONG
)num
, NULL
); }
77 WRes
Semaphore_Release1(CSemaphore
*p
) { return Semaphore_ReleaseN(p
, 1); }
79 WRes
CriticalSection_Init(CCriticalSection
*p
)
81 /* InitializeCriticalSection can raise only STATUS_NO_MEMORY exception */
86 InitializeCriticalSection(p
);
87 /* InitializeCriticalSectionAndSpinCount(p, 0); */
90 __except (EXCEPTION_EXECUTE_HANDLER
) { return 1; }