Browse Source

Use polling instead of boost's broken semaphore on OSX

miguelfreitas
Pieter Wuille 13 years ago
parent
commit
5456ef3092
  1. 40
      src/util.h

40
src/util.h

@ -292,7 +292,47 @@ typedef CMutexLock<CCriticalSection> CCriticalBlock; @@ -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…
Cancel
Save