Use polling instead of boost's broken semaphore on OSX
This commit is contained in:
parent
c59abe2589
commit
5456ef3092
40
src/util.h
40
src/util.h
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user