[project @ 2005-05-10 13:25:41 by simonmar]
[ghc-hetmet.git] / ghc / includes / SMP.h
1 /* ----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 2005
4  *
5  * Macros for SMP support
6  *
7  * -------------------------------------------------------------------------- */
8
9 #ifndef SMP_H
10 #define SMP_H
11
12 /* SMP is currently not compatible with the following options:
13  *
14  *      INTERPRETER
15  *      PROFILING
16  *      TICKY_TICKY
17  *      and unregisterised builds.
18  */
19
20 #if defined(SMP)
21
22 #if  defined(PROFILING)  || defined(TICKY_TICKY)
23 #error Build options incompatible with SMP.
24 #endif
25
26 /* 
27  * XCHG - the atomic exchange instruction.  Used for locking closures
28  * during updates (see LOCK_CLOSURE below) and the MVar primops.
29  */
30 INLINE_HEADER StgWord
31 xchg(StgPtr p, StgWord w)
32 {
33     StgWord result;
34     result = w;
35     __asm__ __volatile__ (
36           "xchgl %1,%0"
37           :"+r" (result), "+m" (*p)
38           : /* no input-only operands */
39         );
40     return result;
41 }
42
43 INLINE_HEADER StgInfoTable *
44 lockClosure(StgClosure *p)
45 {
46     StgWord info;
47 #if 0
48     do {
49         info = xchg((P_)&p->header.info, (W_)&stg_WHITEHOLE_info);
50         if (info != (W_)&stg_WHITEHOLE_info) return (StgInfoTable *)info;
51         yieldThread();
52     } while (1);
53 #else
54     info = p->header.info;
55 #endif
56 }
57
58 #endif /* SMP */
59
60 #endif /* SMP_H */