xref: /aosp_15_r20/external/jemalloc_new/include/jemalloc/internal/spin.h (revision 1208bc7e437ced7eb82efac44ba17e3beba411da)
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 Worker spin_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 Worker spin_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