From: Simon Marlow Date: Wed, 16 Apr 2008 21:11:52 +0000 (+0000) Subject: rename StgSync to SpinLock X-Git-Tag: Before_cabalised-GHC~237 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=29b3b0bdb952e9141e7b49753d8a72c8d31041ae rename StgSync to SpinLock --- diff --git a/includes/SpinLock.h b/includes/SpinLock.h index de08ca1..8684030 100644 --- a/includes/SpinLock.h +++ b/includes/SpinLock.h @@ -19,49 +19,44 @@ #if defined(THREADED_RTS) -#if defined(DEBUG) -typedef struct StgSync_ +#if defined(PROF_SPIN) +typedef struct SpinLock_ { StgWord32 lock; StgWord64 spin; // DEBUG version counts how much it spins -} StgSync; +} SpinLock; #else -typedef StgWord StgSync; +typedef StgWord SpinLock; #endif -typedef lnat StgSyncCount; +typedef lnat SpinLockCount; -#if defined(DEBUG) +#if defined(PROF_SPIN) -// Debug versions of spin locks maintain a spin count - -// How to use: -// To use the debug veriosn of the spin locks, a debug version of the program -// can be run under a deugger with a break point on stat_exit. At exit time -// of the program one can examine the state the spin count counts of various -// spin locks to check for contention. +// PROF_SPIN enables counting the number of times we spin on a lock // acquire spin lock -INLINE_HEADER void ACQUIRE_SPIN_LOCK(StgSync * p) +INLINE_HEADER void ACQUIRE_SPIN_LOCK(SpinLock * p) { StgWord32 r = 0; - do { +spin: + r = cas((StgVolatilePtr)&(p->lock), 1, 0); + if (r == 0) { p->spin++; - r = cas((StgVolatilePtr)&(p->lock), 1, 0); - } while(r == 0); - p->spin--; + goto spin; + } } // release spin lock -INLINE_HEADER void RELEASE_SPIN_LOCK(StgSync * p) +INLINE_HEADER void RELEASE_SPIN_LOCK(SpinLock * p) { write_barrier(); p->lock = 1; } // initialise spin lock -INLINE_HEADER void initSpinLock(StgSync * p) +INLINE_HEADER void initSpinLock(SpinLock * p) { write_barrier(); p->lock = 1; @@ -71,7 +66,7 @@ INLINE_HEADER void initSpinLock(StgSync * p) #else // acquire spin lock -INLINE_HEADER void ACQUIRE_SPIN_LOCK(StgSync * p) +INLINE_HEADER void ACQUIRE_SPIN_LOCK(SpinLock * p) { StgWord32 r = 0; do { @@ -80,20 +75,20 @@ INLINE_HEADER void ACQUIRE_SPIN_LOCK(StgSync * p) } // release spin lock -INLINE_HEADER void RELEASE_SPIN_LOCK(StgSync * p) +INLINE_HEADER void RELEASE_SPIN_LOCK(SpinLock * p) { write_barrier(); (*p) = 1; } // init spin lock -INLINE_HEADER void initSpinLock(StgSync * p) +INLINE_HEADER void initSpinLock(SpinLock * p) { write_barrier(); (*p) = 1; } -#endif /* DEBUG */ +#endif /* PROF_SPIN */ #else /* !THREADED_RTS */