1 /* ----------------------------------------------------------------------------
3 * (c) The GHC Team, 2005
5 * Macros for SMP support
7 * -------------------------------------------------------------------------- */
12 /* SMP is currently not compatible with the following options:
17 * and unregisterised builds.
22 #if defined(PROFILING) || defined(TICKY_TICKY)
23 #error Build options incompatible with SMP.
27 * XCHG - the atomic exchange instruction. Used for locking closures
28 * during updates (see LOCK_CLOSURE below) and the MVar primops.
30 * NB: the xchg instruction is implicitly locked, so we do not need
34 xchg(StgPtr p, StgWord w)
38 __asm__ __volatile__ (
40 :"+r" (result), "+m" (*p)
41 : /* no input-only operands */
47 * CMPXCHG - the single-word atomic compare-and-exchange instruction. Used
48 * in the STM implementation.
51 cas(StgVolatilePtr p, StgWord o, StgWord n)
53 __asm__ __volatile__ (
55 :"=a"(o), "=m" (*(volatile unsigned int *)p)
60 INLINE_HEADER StgInfoTable *
61 lockClosure(StgClosure *p)
63 #if i386_HOST_ARCH || x86_64_HOST_ARCH
66 info = xchg((P_)&p->header.info, (W_)&stg_WHITEHOLE_info);
67 if (info != (W_)&stg_WHITEHOLE_info) return (StgInfoTable *)info;
76 unlockClosure(StgClosure *p, StgInfoTable *info)
78 #if i386_HOST_ARCH || x86_64_HOST_ARCH
79 // This is safe enough, because lockClosure() does the memory barrier:
80 p->header.info = info;