rlm@1: /* Threads.h -- multithreading library rlm@1: 2008-11-22 : Igor Pavlov : Public domain */ rlm@1: rlm@1: #ifndef __7Z_THRESDS_H rlm@1: #define __7Z_THRESDS_H rlm@1: rlm@1: #include "Types.h" rlm@1: rlm@1: typedef struct _CThread rlm@1: { rlm@1: HANDLE handle; rlm@1: } CThread; rlm@1: rlm@1: #define Thread_Construct(thread) (thread)->handle = NULL rlm@1: #define Thread_WasCreated(thread) ((thread)->handle != NULL) rlm@1: rlm@1: typedef unsigned THREAD_FUNC_RET_TYPE; rlm@1: #define THREAD_FUNC_CALL_TYPE MY_STD_CALL rlm@1: #define THREAD_FUNC_DECL THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE rlm@1: rlm@1: WRes Thread_Create(CThread *thread, THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE *startAddress)(void *), LPVOID parameter); rlm@1: WRes Thread_Wait(CThread *thread); rlm@1: WRes Thread_Close(CThread *thread); rlm@1: rlm@1: typedef struct _CEvent rlm@1: { rlm@1: HANDLE handle; rlm@1: } CEvent; rlm@1: rlm@1: typedef CEvent CAutoResetEvent; rlm@1: typedef CEvent CManualResetEvent; rlm@1: rlm@1: #define Event_Construct(event) (event)->handle = NULL rlm@1: #define Event_IsCreated(event) ((event)->handle != NULL) rlm@1: rlm@1: WRes ManualResetEvent_Create(CManualResetEvent *event, int initialSignaled); rlm@1: WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *event); rlm@1: WRes AutoResetEvent_Create(CAutoResetEvent *event, int initialSignaled); rlm@1: WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *event); rlm@1: WRes Event_Set(CEvent *event); rlm@1: WRes Event_Reset(CEvent *event); rlm@1: WRes Event_Wait(CEvent *event); rlm@1: WRes Event_Close(CEvent *event); rlm@1: rlm@1: rlm@1: typedef struct _CSemaphore rlm@1: { rlm@1: HANDLE handle; rlm@1: } CSemaphore; rlm@1: rlm@1: #define Semaphore_Construct(p) (p)->handle = NULL rlm@1: rlm@1: WRes Semaphore_Create(CSemaphore *p, UInt32 initiallyCount, UInt32 maxCount); rlm@1: WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num); rlm@1: WRes Semaphore_Release1(CSemaphore *p); rlm@1: WRes Semaphore_Wait(CSemaphore *p); rlm@1: WRes Semaphore_Close(CSemaphore *p); rlm@1: rlm@1: rlm@1: typedef CRITICAL_SECTION CCriticalSection; rlm@1: rlm@1: WRes CriticalSection_Init(CCriticalSection *p); rlm@1: #define CriticalSection_Delete(p) DeleteCriticalSection(p) rlm@1: #define CriticalSection_Enter(p) EnterCriticalSection(p) rlm@1: #define CriticalSection_Leave(p) LeaveCriticalSection(p) rlm@1: rlm@1: #endif rlm@1: