class SpinMutex unsigned waiters unsigned toggle eventsemaphore try_again SpinMutex() aiters(0), toggle(0) {} Request() { loop retries { if(lockedexchange(&toggle,1)==0) return; } LockedIncrement(&waiters); loop { if(LockedExchange(&toggle,1)==0) { LockedDecrement(&waiters); return; } try_again.Wait(); try_again.Reset(); } } Release() { if(waiters>0) { LockedDecrement(&toggle); try_again.Post(); } else LockedDecrement(&toggle); } class SpinEvent unsigned toggle eventsemaphore wakeup SpinMutex modify SpinEvent() : toggle(0) {} Post() { modify.Request(); if(LockedExchange(&toggle,1)==0) { wakeup.Post(); } modify.Release(); } Reset() { modify.Request(); if(LockedExchange(&toggle,0)==1) { wakeup.Reset(); } modify.Release(); } Wait() { loop retries { if(toggle) return; } wakeup.Wait(); } class SpinSemaphore unsigned count eventsemaphore notzero SpinMutex wait_mutex, change_mutex; SpinSemaphore(mc) : count(0), notzero(0) {} Signal() { change_mutex.Request(); LockedIncrement(&count); if(count==1) notzero.Post(); change_mutex.Release(); } Wait() { wait_mutex.Request(); loop retries { if(count>0) goto okeydokey } notzero.Wait(); okeydokey: change_mutex.Request(); LockedDecrement(&count); if(count==0) notzero.Reset(); change_mutex.Release(); wait_mutex.Release(); }