use the new "prim %write_barrier()" in .cmm instead of calls to wb()
[ghc-hetmet.git] / includes / SMP.h
index 5974c96..68f1690 100644 (file)
@@ -96,7 +96,7 @@ cas(StgVolatilePtr p, StgWord o, StgWord n)
  * that require it (not x86 or x86_64).
  */
 INLINE_HEADER void
-wb(void) {
+write_barrier(void) {
 #if i386_HOST_ARCH || x86_64_HOST_ARCH
     __asm__ __volatile__ ("" : : : "memory");
 #elif powerpc_HOST_ARCH
@@ -136,7 +136,7 @@ unlockClosure(StgClosure *p, StgInfoTable *info)
 {
 #if i386_HOST_ARCH || x86_64_HOST_ARCH || powerpc_HOST_ARCH
     // This is a strictly ordered write, so we need a wb():
-    wb();
+    write_barrier();
     p->header.info = info;
 #else
     RELEASE_SM_LOCK;
@@ -145,7 +145,7 @@ unlockClosure(StgClosure *p, StgInfoTable *info)
 
 #else /* !THREADED_RTS */
 
-#define wb() /* nothing */
+#define write_barrier() /* nothing */
 
 INLINE_HEADER StgWord
 xchg(StgPtr p, StgWord w)
@@ -155,6 +155,21 @@ xchg(StgPtr p, StgWord w)
     return old;
 }
 
+INLINE_HEADER StgInfoTable *
+lockClosure(StgClosure *p)
+{ return (StgInfoTable *)p->header.info; }
+
+INLINE_HEADER void
+unlockClosure(StgClosure *p STG_UNUSED, StgInfoTable *info STG_UNUSED)
+{ /* nothing */ }
+
 #endif /* !THREADED_RTS */
 
+// Handy specialised versions of lockClosure()/unlockClosure()
+INLINE_HEADER void lockTSO(StgTSO *tso)
+{ lockClosure((StgClosure *)tso); }
+
+INLINE_HEADER void unlockTSO(StgTSO *tso)
+{ unlockClosure((StgClosure*)tso, (StgInfoTable*)&stg_TSO_info); }
+
 #endif /* SMP_H */