-/*
+/* $Id$
+
This file is part of libmspcore
Copyright © 2006 Mikko Rasa, Mikkosoft Productions
Distributed under the LGPL
*/
-#ifndef MSP_FRAMEWORK_SEMAPHORE_H_
-#define MSP_FRAMEWORK_SEMAPHORE_H_
+#ifndef MSP_CORE_SEMAPHORE_H_
+#define MSP_CORE_SEMAPHORE_H_
#include "mutex.h"
#include "types.h"
class Semaphore
{
public:
-#ifndef WIN32
- Semaphore() { pthread_cond_init(&sem, 0); }
- int signal() { MutexLock l(mutex); return pthread_cond_signal(&sem); }
- int broadcast() { MutexLock l(mutex); return pthread_cond_broadcast(&sem); }
- int wait() { MutexLock l(mutex); return pthread_cond_wait(&sem, &mutex.mutex); }
+ Semaphore();
+ Semaphore(Mutex &);
+ int signal();
+ int broadcast();
+ int wait();
int wait(const Time::TimeDelta &);
- ~Semaphore() { pthread_cond_destroy(&sem); }
-#else
- Semaphore() { sem=CreateSemaphore(0, 0, 32, 0); }
- int signal() { return !ReleaseSemaphore(sem, 1, 0); }
- int broadcast() { return !ReleaseSemaphore(sem, 32, 0); }
- int wait() { return WaitForSingleObject(sem, INFINITE)==WAIT_OBJECT_0; }
- int wait(const Time::TimeDelta &);
- ~Semaphore() { CloseHandle(sem); }
-#endif
+ Mutex &get_mutex() { return *mutex; }
+ ~Semaphore();
private:
-#ifndef WIN32
- Mutex mutex;
-#endif
+ Mutex *mutex;
+ bool own_mutex;
SemaphoreHandle sem;
+#ifdef WIN32
+ unsigned count;
+#endif
+
+ void init();
};
+#ifndef WIN32
+inline int Semaphore::signal()
+{ return pthread_cond_signal(&sem); }
+
+inline int Semaphore::broadcast()
+{ return pthread_cond_broadcast(&sem); }
+
+inline int Semaphore::wait()
+{ return pthread_cond_wait(&sem, &mutex->mutex); }
+#endif
+
}
#endif