+ pthread_cond_init(&priv->cond, 0);
+ priv->limit = limit;
+ priv->count = 0;
+#endif
+}
+
+Semaphore::~Semaphore()
+{
+#ifdef WIN32
+ CloseHandle(priv->handle);
+#else
+ pthread_cond_destroy(&priv->cond);
+#endif
+ delete priv;
+}
+
+void Semaphore::signal()
+{
+#ifdef WIN32
+ if(!ReleaseSemaphore(priv->handle, 1, 0))
+ throw system_error("Semaphore::signal");
+#else
+ MutexLock mlock(priv->mutex);
+ if(priv->count<priv->limit)
+ ++priv->count;
+ if(int err = pthread_cond_signal(&priv->cond))
+ throw system_error("Semaphore::signal", err);
+#endif
+}
+
+void Semaphore::wait()
+{
+#ifdef WIN32
+ DWORD ret = WaitForSingleObject(priv->handle, INFINITE);
+ if(ret==WAIT_FAILED)
+ throw system_error("Semaphore::wait");
+#else
+ MutexLock mlock(priv->mutex);
+ while(!priv->count)
+ if(int err = pthread_cond_wait(&priv->cond, &priv->mutex.priv->mutex))
+ throw system_error("Semaphore::wait", err);
+ --priv->count;
+#endif
+}
+
+bool Semaphore::wait(const Time::TimeDelta &d)
+{
+#ifdef WIN32
+ DWORD ret = WaitForSingleObject(priv->handle, (DWORD)(d/Time::usec));
+ if(ret==WAIT_FAILED)
+ throw system_error("Semaphore::wait");
+ return ret==WAIT_OBJECT_0;
+#else
+ timespec timeout = Time::rawtime_to_timespec((Time::now()+d).raw());
+
+ int err = pthread_cond_timedwait(&priv->cond, &priv->mutex.priv->mutex, &timeout);
+ if(err && err!=ETIMEDOUT)
+ throw system_error("Semaphore::wait", err);
+ return err==0;