X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2Fstg%2FSMP.h;h=b302f4886bdeaa234955519eaaed18cf0c3011b8;hb=0ee6cfbe62211121fc84a9d2e500f414f9e397f7;hp=5d9d80169b97fcb2e468756c1c7a744c34363d5e;hpb=a2a67cd520b9841114d69a87a423dabcb3b4368e;p=ghc-hetmet.git diff --git a/includes/stg/SMP.h b/includes/stg/SMP.h index 5d9d801..b302f48 100644 --- a/includes/stg/SMP.h +++ b/includes/stg/SMP.h @@ -1,9 +1,14 @@ /* ---------------------------------------------------------------------------- * - * (c) The GHC Team, 2005-2008 + * (c) The GHC Team, 2005-2009 * * Macros for multi-CPU support * + * Do not #include this file directly: #include "Rts.h" instead. + * + * To understand the structure of the RTS headers, see the wiki: + * http://hackage.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes + * * -------------------------------------------------------------------------- */ #ifndef SMP_H @@ -59,6 +64,13 @@ EXTERN_INLINE StgWord atomic_inc(StgVolatilePtr p); */ EXTERN_INLINE StgWord atomic_dec(StgVolatilePtr p); +/* + * Busy-wait nop: this is a hint to the CPU that we are currently in a + * busy-wait loop waiting for another CPU to change something. On a + * hypertreaded CPU it should yield to another thread, for example. + */ +EXTERN_INLINE void busy_wait_nop(void); + #endif // !IN_STG_CODE /* @@ -211,6 +223,17 @@ atomic_dec(StgVolatilePtr p) #endif } +EXTERN_INLINE void +busy_wait_nop(void) +{ +#if defined(i386_HOST_ARCH) || defined(x86_64_HOST_ARCH) + __asm__ __volatile__ ("rep; nop"); + // +#else + // nothing +#endif +} + #endif // !IN_STG_CODE /*