Changes to update Tomato RAF.
[tomato.git] / release / src / lzma / C / Threads.c
blob34f0ff10cffe6f986182e3063adbe5d01a3f4cd0
1 /* Threads.c */
3 #include "Threads.h"
4 #include <process.h>
6 HRes GetError()
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)
17 if (*h != NULL)
18 if (!CloseHandle(*h))
19 return GetError();
20 *h = NULL;
21 return SZ_OK;
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 */
27 thread->handle =
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)
42 return 1;
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 */
98 __try
100 InitializeCriticalSection(p);
101 /* InitializeCriticalSectionAndSpinCount(p, 0); */
103 __except (EXCEPTION_EXECUTE_HANDLER) { return SZE_OUTOFMEMORY; }
104 return SZ_OK;