00001
00004 #ifndef RAZORBACK_LOCK_H
00005 #define RAZORBACK_LOCK_H
00006
00007 #include <razorback/visibility.h>
00008 #include <razorback/types.h>
00009
00010 #ifdef _MSC_VER
00011 #else //_MSC_VER
00012 #include <pthread.h>
00013 #include <semaphore.h>
00014 #endif //_MSC_VER
00015
00016 #ifdef __cplusplus
00017 extern "C" {
00018 #endif
00019
00020 #define MUTEX_MODE_NORMAL 0 ///< None recursively lockable mutex
00021 #define MUTEX_MODE_RECURSIVE 1 ///< Recursively lockable mutex
00022
00025 struct Mutex
00026 {
00027 #ifdef _MSC_VER
00028 HANDLE recursiveLock;
00029 CRITICAL_SECTION cs;
00030 #else
00031 pthread_mutex_t lock;
00032 pthread_mutexattr_t attrs;
00033 #endif
00034 int mode;
00035 };
00036
00039 struct Semaphore
00040 {
00041 #ifdef _MSC_VER
00042 HANDLE sem;
00043 #else
00044 sem_t sem;
00045 #endif
00046 };
00047
00048
00053 SO_PUBLIC extern struct Mutex * Mutex_Create(int mode);
00054
00059 SO_PUBLIC extern bool Mutex_Lock(struct Mutex *mutex);
00060
00065 SO_PUBLIC extern bool Mutex_Unlock(struct Mutex *mutex);
00066
00070 SO_PUBLIC extern void Mutex_Destroy(struct Mutex *mutex);
00071
00077 SO_PUBLIC extern struct Semaphore * Semaphore_Create(bool shared, unsigned int value);
00078
00083 SO_PUBLIC extern bool Semaphore_Post(struct Semaphore *sem);
00088 SO_PUBLIC extern bool Semaphore_Wait(struct Semaphore *sem);
00089 SO_PUBLIC extern bool Semaphore_TimedWait(struct Semaphore *sem);
00090
00094 SO_PUBLIC extern void Semaphore_Destroy(struct Semaphore *sem);
00095
00096 #ifdef __cplusplus
00097 }
00098 #endif
00099 #endif //RAZORBACK_LOCK_H