* Unregisterised builds are ok, but only 1 CPU supported.
*/
+#ifdef CMINUSMINUS
+
+#define unlockClosure(ptr,info) \
+ prim %write_barrier() []; \
+ StgHeader_info(ptr) = info;
+
+#else
+
#if defined(THREADED_RTS)
#if defined(TICKY_TICKY)
"1: lwarx %0, 0, %2\n"
" stwcx. %1, 0, %2\n"
" bne- 1b"
- :"=r" (result)
+ :"=&r" (result)
:"r" (w), "r" (p)
);
#elif sparc_HOST_ARCH
{
#if i386_HOST_ARCH || x86_64_HOST_ARCH
__asm__ __volatile__ (
- "lock/cmpxchg %3,%1"
+ "lock\ncmpxchg %3,%1"
:"=a"(o), "=m" (*(volatile unsigned int *)p)
:"0" (o), "r" (n));
return o;
#define SPIN_COUNT 4000
-INLINE_HEADER StgInfoTable *
+#ifdef KEEP_LOCKCLOSURE
+// We want a callable copy of lockClosure() so that we can refer to it
+// from .cmm files compiled using the native codegen.
+extern StgInfoTable *lockClosure(StgClosure *p);
+INLINE_ME
+#else
+INLINE_HEADER
+#endif
+StgInfoTable *
lockClosure(StgClosure *p)
{
StgWord info;
// spin locks to check for contention.
// acquire spin lock
-INLINE_HEADER void acquireSpinLock(StgSync * p)
+INLINE_HEADER void ACQUIRE_SPIN_LOCK(StgSync * p)
{
StgWord32 r = 0;
do {
}
// release spin lock
-INLINE_HEADER void releaseSpinLock(StgSync * p)
+INLINE_HEADER void RELEASE_SPIN_LOCK(StgSync * p)
{
write_barrier();
p->lock = 1;
#else
// acquire spin lock
-INLINE_HEADER void acquireSpinLock(StgSync * p)
+INLINE_HEADER void ACQUIRE_SPIN_LOCK(StgSync * p)
{
StgWord32 r = 0;
do {
}
// release spin lock
-INLINE_HEADER void releaseSpinLock(StgSync * p)
+INLINE_HEADER void RELEASE_SPIN_LOCK(StgSync * p)
{
write_barrier();
(*p) = 1;
unlockClosure(StgClosure *p STG_UNUSED, StgInfoTable *info STG_UNUSED)
{ /* nothing */ }
-INLINE_HEADER void acquireSpinLock(void * p STG_UNUSED)
-{ /* nothing */ }
-
-INLINE_HEADER void releaseSpinLock(void * p STG_UNUSED)
-{ /* nothing */ }
+// Using macros here means we don't have to ensure the argument is in scope
+#define ACQUIRE_SPIN_LOCK(p) /* nothing */
+#define RELEASE_SPIN_LOCK(p) /* nothing */
INLINE_HEADER void initSpinLock(void * p STG_UNUSED)
{ /* nothing */ }
{ unlockClosure((StgClosure*)tso, (StgInfoTable*)&stg_TSO_info); }
#endif /* SMP_H */
+
+#endif /* CMINUSMINUS */