projects
/
ghc-hetmet.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
fac738e
)
rename StgSync to SpinLock
author
Simon Marlow
<simonmarhaskell@gmail.com>
Wed, 16 Apr 2008 21:11:52 +0000
(21:11 +0000)
committer
Simon Marlow
<simonmarhaskell@gmail.com>
Wed, 16 Apr 2008 21:11:52 +0000
(21:11 +0000)
includes/SpinLock.h
patch
|
blob
|
history
diff --git
a/includes/SpinLock.h
b/includes/SpinLock.h
index
de08ca1
..
8684030
100644
(file)
--- a/
includes/SpinLock.h
+++ b/
includes/SpinLock.h
@@
-19,49
+19,44
@@
#if defined(THREADED_RTS)
#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
{
StgWord32 lock;
StgWord64 spin; // DEBUG version counts how much it spins
-} StgSync;
+} SpinLock;
#else
#else
-typedef StgWord StgSync;
+typedef StgWord SpinLock;
#endif
#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
// acquire spin lock
-INLINE_HEADER void ACQUIRE_SPIN_LOCK(StgSync * p)
+INLINE_HEADER void ACQUIRE_SPIN_LOCK(SpinLock * p)
{
StgWord32 r = 0;
{
StgWord32 r = 0;
- do {
+spin:
+ r = cas((StgVolatilePtr)&(p->lock), 1, 0);
+ if (r == 0) {
p->spin++;
p->spin++;
- r = cas((StgVolatilePtr)&(p->lock), 1, 0);
- } while(r == 0);
- p->spin--;
+ goto spin;
+ }
}
// release spin lock
}
// 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
{
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;
{
write_barrier();
p->lock = 1;
@@
-71,7
+66,7
@@
INLINE_HEADER void initSpinLock(StgSync * p)
#else
// acquire spin lock
#else
// acquire spin lock
-INLINE_HEADER void ACQUIRE_SPIN_LOCK(StgSync * p)
+INLINE_HEADER void ACQUIRE_SPIN_LOCK(SpinLock * p)
{
StgWord32 r = 0;
do {
{
StgWord32 r = 0;
do {
@@
-80,20
+75,20
@@
INLINE_HEADER void ACQUIRE_SPIN_LOCK(StgSync * p)
}
// release spin lock
}
// 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
{
write_barrier();
(*p) = 1;
}
// init spin lock
-INLINE_HEADER void initSpinLock(StgSync * p)
+INLINE_HEADER void initSpinLock(SpinLock * p)
{
write_barrier();
(*p) = 1;
}
{
write_barrier();
(*p) = 1;
}
-#endif /* DEBUG */
+#endif /* PROF_SPIN */
#else /* !THREADED_RTS */
#else /* !THREADED_RTS */