projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Comments only. Haddockify parts of TcRnTypes.
[ghc-hetmet.git]
/
includes
/
SMP.h
diff --git
a/includes/SMP.h
b/includes/SMP.h
index
0e6322d
..
bf23e08
100644
(file)
--- a/
includes/SMP.h
+++ b/
includes/SMP.h
@@
-16,14
+16,6
@@
* Unregisterised builds are ok, but only 1 CPU supported.
*/
* 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)
#if defined(THREADED_RTS)
#if defined(TICKY_TICKY)
@@
-34,6
+26,12
@@
Atomic operations
------------------------------------------------------------------------- */
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.
/*
* The atomic exchange operation: xchg(p,w) exchanges the value
* pointed to by p with the value w, returning the old value.
@@
-41,7
+39,7
@@
* Used for locking closures during updates (see lockClosure() below)
* and the MVar primops.
*/
* Used for locking closures during updates (see lockClosure() below)
* and the MVar primops.
*/
-INLINE_HEADER StgWord xchg(StgPtr p, StgWord w);
+EXTERN_INLINE StgWord xchg(StgPtr p, StgWord w);
/*
* Compare-and-swap. Atomically does this:
/*
* Compare-and-swap. Atomically does this:
@@
-52,22
+50,27
@@
INLINE_HEADER StgWord xchg(StgPtr p, StgWord w);
* return r;
* }
*/
* return r;
* }
*/
-INLINE_HEADER StgWord cas(StgVolatilePtr p, StgWord o, StgWord n);
+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.
*/
/*
* Prevents write operations from moving across this call in either
* direction.
*/
-INLINE_HEADER void write_barrier(void);
+EXTERN_INLINE void write_barrier(void);
/* ----------------------------------------------------------------------------
Implementations
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------------
Implementations
------------------------------------------------------------------------- */
+
+#if !IN_STG_CODE
+
/*
* NB: the xchg instruction is implicitly locked, so we do not need
* a lock prefix here.
*/
/*
* NB: the xchg instruction is implicitly locked, so we do not need
* a lock prefix here.
*/
-INLINE_HEADER StgWord
+EXTERN_INLINE StgWord
xchg(StgPtr p, StgWord w)
{
StgWord result;
xchg(StgPtr p, StgWord w)
{
StgWord result;
@@
-106,7
+109,7
@@
xchg(StgPtr p, StgWord w)
* CMPXCHG - the single-word atomic compare-and-exchange instruction. Used
* in the STM implementation.
*/
* CMPXCHG - the single-word atomic compare-and-exchange instruction. Used
* in the STM implementation.
*/
-INLINE_HEADER StgWord
+EXTERN_INLINE StgWord
cas(StgVolatilePtr p, StgWord o, StgWord n)
{
#if i386_HOST_ARCH || x86_64_HOST_ARCH
cas(StgVolatilePtr p, StgWord o, StgWord n)
{
#if i386_HOST_ARCH || x86_64_HOST_ARCH
@@
-149,6
+152,8
@@
cas(StgVolatilePtr p, StgWord o, StgWord n)
#endif
}
#endif
}
+#endif // !IN_STG_CODE
+
/*
* Write barrier - ensure that all preceding writes have happened
* before all following writes.
/*
* Write barrier - ensure that all preceding writes have happened
* before all following writes.
@@
-159,7
+164,7
@@
cas(StgVolatilePtr p, StgWord o, StgWord n)
* control in C, and optionally a memory barrier instruction on CPUs
* that require it (not x86 or x86_64).
*/
* control in C, and optionally a memory barrier instruction on CPUs
* that require it (not x86 or x86_64).
*/
-INLINE_HEADER void
+EXTERN_INLINE void
write_barrier(void) {
#if i386_HOST_ARCH || x86_64_HOST_ARCH
__asm__ __volatile__ ("" : : : "memory");
write_barrier(void) {
#if i386_HOST_ARCH || x86_64_HOST_ARCH
__asm__ __volatile__ ("" : : : "memory");
@@
-190,6
+195,4
@@
xchg(StgPtr p, StgWord w)
#endif /* !THREADED_RTS */
#endif /* !THREADED_RTS */
-#endif /* CMINUSMINUS */
-
#endif /* SMP_H */
#endif /* SMP_H */