X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2Frts%2FSpinLock.h;h=8b337de73fd19ef89db5ab8793fff1ed73af26e5;hb=4bba92f93b88e15f0e0f23732d2cfa540acb737b;hp=3d0b56cfcbd6e2d98e88cde8159b1fbdee68e098;hpb=0ee6cfbe62211121fc84a9d2e500f414f9e397f7;p=ghc-hetmet.git diff --git a/includes/rts/SpinLock.h b/includes/rts/SpinLock.h index 3d0b56c..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,13 +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++; - busy_wait_nop(); - 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 @@ -75,10 +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); - busy_wait_nop(); - } 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