summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/SMP.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/includes/SMP.h b/includes/SMP.h
index eaac770107..e3b4cd54a2 100644
--- a/includes/SMP.h
+++ b/includes/SMP.h
@@ -34,6 +34,12 @@
Atomic operations
------------------------------------------------------------------------- */
+#if !IN_STG_CODE
+// We only want write_barrier() declared in .hc files. Defining the
+// other inline functions here causes type mismatch errors from gcc,
+// because the generated C code is assuming that there are no
+// prototypes in scope.
+
/*
* The atomic exchange operation: xchg(p,w) exchanges the value
* pointed to by p with the value w, returning the old value.
@@ -54,6 +60,8 @@ EXTERN_INLINE StgWord xchg(StgPtr p, StgWord w);
*/
EXTERN_INLINE StgWord cas(StgVolatilePtr p, StgWord o, StgWord n);
+#endif // !IN_STG_CODE
+
/*
* Prevents write operations from moving across this call in either
* direction.
@@ -63,6 +71,9 @@ EXTERN_INLINE void write_barrier(void);
/* ----------------------------------------------------------------------------
Implementations
------------------------------------------------------------------------- */
+
+#if !IN_STG_CODE
+
/*
* NB: the xchg instruction is implicitly locked, so we do not need
* a lock prefix here.
@@ -149,6 +160,8 @@ cas(StgVolatilePtr p, StgWord o, StgWord n)
#endif
}
+#endif // !IN_STG_CODE
+
/*
* Write barrier - ensure that all preceding writes have happened
* before all following writes.