X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2Frts%2FSpinLock.h;h=8b337de73fd19ef89db5ab8793fff1ed73af26e5;hb=98ad599b6f333d8d13fc9571e24fbb8587f12a94;hp=9bfb35bbac9fa95cea1434430f0cd5178636e8bd;hpb=d20d32d788e2d6c088e6b03776c428df5bb004d3;p=ghc-hetmet.git diff --git a/includes/rts/SpinLock.h b/includes/rts/SpinLock.h index 9bfb35b..8b337de 100644 --- a/includes/rts/SpinLock.h +++ b/includes/rts/SpinLock.h @@ -36,7 +36,6 @@ typedef StgWord SpinLock; typedef lnat SpinLockCount; - #if defined(PROF_SPIN) // PROF_SPIN enables counting the number of times we spin on a lock @@ -45,12 +44,16 @@ typedef lnat SpinLockCount; INLINE_HEADER void ACQUIRE_SPIN_LOCK(SpinLock * p) { StgWord32 r = 0; -spin: - r = cas((StgVolatilePtr)&(p->lock), 1, 0); - if (r == 0) { - p->spin++; - goto spin; - } + nat i; + do { + for (i = 0; i < SPIN_COUNT; i++) { + r = cas((StgVolatilePtr)&(p->lock), 1, 0); + if (r != 0) return; + p->spin++; + busy_wait_nop(); + } + yieldThread(); + } while (1); } // release spin lock @@ -74,9 +77,15 @@ INLINE_HEADER void initSpinLock(SpinLock * p) INLINE_HEADER void ACQUIRE_SPIN_LOCK(SpinLock * p) { StgWord32 r = 0; + nat i; do { - r = cas((StgVolatilePtr)p, 1, 0); - } while(r == 0); + for (i = 0; i < SPIN_COUNT; i++) { + r = cas((StgVolatilePtr)p, 1, 0); + if (r != 0) return; + busy_wait_nop(); + } + yieldThread(); + } while (1); } // release spin lock