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