xref: /netbsd-src/external/bsd/jemalloc.old/include/jemalloc/internal/spin.h (revision 8e33eff89e26cf71871ead62f0d5063e1313c33a)
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