1#ifndef JEMALLOC_INTERNAL_SPIN_H 2#define JEMALLOC_INTERNAL_SPIN_H 3 4#define SPIN_INITIALIZER {0U} 5 6typedef struct { 7 unsigned iteration; 8} spin_t; 9 10static inline void 11spin_cpu_spinwait(void) { 12# if HAVE_CPU_SPINWAIT 13 CPU_SPINWAIT; 14# else 15 volatile int x = 0; 16 x = x; 17# endif 18} 19 20static inline void 21spin_adaptive(spin_t *spin) { 22 volatile uint32_t i; 23 24 if (spin->iteration < 5) { 25 for (i = 0; i < (1U << spin->iteration); i++) { 26 spin_cpu_spinwait(); 27 } 28 spin->iteration++; 29 } else { 30#ifdef _WIN32 31 SwitchToThread(); 32#else 33 sched_yield(); 34#endif 35 } 36} 37 38#undef SPIN_INLINE 39 40#endif /* JEMALLOC_INTERNAL_SPIN_H */ 41