mb.h revision 7427525c28d58c423a68930160e3b0fe577fe953
1ce99120084f549a523213064648662a704e8b789Chris Lattner/******************************************************************************/
2ce99120084f549a523213064648662a704e8b789Chris Lattner#ifdef JEMALLOC_H_TYPES
3ce99120084f549a523213064648662a704e8b789Chris Lattner
4ce99120084f549a523213064648662a704e8b789Chris Lattner#endif /* JEMALLOC_H_TYPES */
5ce99120084f549a523213064648662a704e8b789Chris Lattner/******************************************************************************/
6ce99120084f549a523213064648662a704e8b789Chris Lattner#ifdef JEMALLOC_H_STRUCTS
7ce99120084f549a523213064648662a704e8b789Chris Lattner
8ce99120084f549a523213064648662a704e8b789Chris Lattner#endif /* JEMALLOC_H_STRUCTS */
9ce99120084f549a523213064648662a704e8b789Chris Lattner/******************************************************************************/
10ce99120084f549a523213064648662a704e8b789Chris Lattner#ifdef JEMALLOC_H_EXTERNS
11ce99120084f549a523213064648662a704e8b789Chris Lattner
12ce99120084f549a523213064648662a704e8b789Chris Lattner#endif /* JEMALLOC_H_EXTERNS */
13ce99120084f549a523213064648662a704e8b789Chris Lattner/******************************************************************************/
149d434dbff3eb0501efc3457acec2401afdffef2fEli Friedman#ifdef JEMALLOC_H_INLINES
15ce99120084f549a523213064648662a704e8b789Chris Lattner
16ce99120084f549a523213064648662a704e8b789Chris Lattner#ifndef JEMALLOC_ENABLE_INLINE
17ce99120084f549a523213064648662a704e8b789Chris Lattnervoid	mb_write(void);
18ce99120084f549a523213064648662a704e8b789Chris Lattner#endif
19ce99120084f549a523213064648662a704e8b789Chris Lattner
20ce99120084f549a523213064648662a704e8b789Chris Lattner#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_MB_C_))
218ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier#ifdef __i386__
228ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier/*
238ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier * According to the Intel Architecture Software Developer's Manual, current
248ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier * processors execute instructions in order from the perspective of other
258ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier * processors in a multiprocessor system, but 1) Intel reserves the right to
268ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier * change that, and 2) the compiler's optimizer could re-order instructions if
278ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier * there weren't some form of barrier.  Therefore, even if running on an
288ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier * architecture that does not need memory barriers (everything through at least
298ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier * i686), an "optimizer barrier" is necessary.
308ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier */
318ff4115ef0bcad0a46750bb2bd4376a61b346362Chad RosierJEMALLOC_INLINE void
328ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosiermb_write(void)
338ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier{
348ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier
358ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier#  if 0
368ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	/* This is a true memory barrier. */
378ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	asm volatile ("pusha;"
388ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    "xor  %%eax,%%eax;"
3932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier	    "cpuid;"
4032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier	    "popa;"
4132b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier	    : /* Outputs. */
4232b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier	    : /* Inputs. */
4332b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier	    : "memory" /* Clobbers. */
4432b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier	    );
458ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier#else
468ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	/*
478ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	 * This is hopefully enough to keep the compiler from reordering
488ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	 * instructions around this one.
498ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	 */
508ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	asm volatile ("nop;"
518ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : /* Outputs. */
528ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : /* Inputs. */
538ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : "memory" /* Clobbers. */
548ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    );
558ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier#endif
568ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier}
578ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier#elif (defined(__amd64_) || defined(__x86_64__))
588ff4115ef0bcad0a46750bb2bd4376a61b346362Chad RosierJEMALLOC_INLINE void
598ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosiermb_write(void)
608ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier{
618ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier
628ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	asm volatile ("sfence"
638ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : /* Outputs. */
648ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : /* Inputs. */
658ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : "memory" /* Clobbers. */
668ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    );
678ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier}
688ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier#elif defined(__powerpc__)
698ff4115ef0bcad0a46750bb2bd4376a61b346362Chad RosierJEMALLOC_INLINE void
708ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosiermb_write(void)
718ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier{
728ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier
738ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	asm volatile ("eieio"
748ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : /* Outputs. */
758ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : /* Inputs. */
768ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : "memory" /* Clobbers. */
778ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    );
788ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier}
798ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier#elif defined(__sparc64__)
808ff4115ef0bcad0a46750bb2bd4376a61b346362Chad RosierJEMALLOC_INLINE void
818ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosiermb_write(void)
828ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier{
838ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier
848ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	asm volatile ("membar #StoreStore"
858ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : /* Outputs. */
868ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : /* Inputs. */
878ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    : "memory" /* Clobbers. */
888ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier	    );
898ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier}
908ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier#else
918ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier/*
928ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier * This is much slower than a simple memory barrier, but the semantics of mutex
93683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier * unlock make this work.
94683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier */
9532b6c59ad068d2bb2466dd33bc17d8c865760215Chad RosierJEMALLOC_INLINE void
9632b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosiermb_write(void)
9732b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier{
9832b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier	malloc_mutex_t mtx;
9932b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier
10032b6c59ad068d2bb2466dd33bc17d8c865760215Chad Rosier	malloc_mutex_init(&mtx);
101683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier	malloc_mutex_lock(&mtx);
102683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier	malloc_mutex_unlock(&mtx);
103683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier}
104683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier#endif
105683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier#endif
106683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier
107683e47b1dd8672b0b026a45022cf91f4faf7df9bChad Rosier#endif /* JEMALLOC_H_INLINES */
1088ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier/******************************************************************************/
1098ff4115ef0bcad0a46750bb2bd4376a61b346362Chad Rosier