From: Pieter Wuille Date: Thu, 10 May 2012 18:45:35 +0000 (+0200) Subject: Use polling instead of boost's broken semaphore on OSX X-Git-Tag: v0.4.0-unstable~129^2~19^2 X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=commitdiff_plain;h=f0f1b3775e5e0c7939c1131f831ce0334348ac72 Use polling instead of boost's broken semaphore on OSX --- diff --git a/src/util.h b/src/util.h index f90b95b..15ccf82 100644 --- a/src/util.h +++ b/src/util.h @@ -287,7 +287,47 @@ typedef CMutexLock 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 inline std::string i64tostr(int64 n) {