Use polling instead of boost's broken semaphore on OSX

This commit is contained in:
Pieter Wuille 2012-05-10 20:45:35 +02:00
parent c59abe2589
commit 5456ef3092

View File

@ -292,7 +292,47 @@ typedef CMutexLock<CCriticalSection> CCriticalBlock;
LeaveCritical(); \
}
#ifdef MAC_OSX
// boost::interprocess::interprocess_semaphore seems to spinlock on OSX; prefer polling instead
class CSemaphore
{
private:
CCriticalSection cs;
int val;
public:
CSemaphore(int init) : val(init) {}
void wait() {
do {
{
LOCK(cs);
if (val>0) {
val--;
return;
}
}
Sleep(100);
} while(1);
}
bool try_wait() {
LOCK(cs);
if (val>0) {
val--;
return true;
}
return false;
}
void post() {
LOCK(cs);
val++;
}
};
#else
typedef boost::interprocess::interprocess_semaphore CSemaphore;
#endif
/** RAII-style semaphore lock */
class CSemaphoreGrant