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