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