Blame jemalloc/include/jemalloc/internal/spin.h

Packit 345191
#ifndef JEMALLOC_INTERNAL_SPIN_H
Packit 345191
#define JEMALLOC_INTERNAL_SPIN_H
Packit 345191
Packit 345191
#define SPIN_INITIALIZER {0U}
Packit 345191
Packit 345191
typedef struct {
Packit 345191
	unsigned iteration;
Packit 345191
} spin_t;
Packit 345191
Packit 345191
static inline void
Packit 345191
spin_cpu_spinwait() {
Packit 345191
#  if HAVE_CPU_SPINWAIT
Packit 345191
	CPU_SPINWAIT;
Packit 345191
#  else
Packit 345191
	volatile int x = 0;
Packit 345191
	x = x;
Packit 345191
#  endif
Packit 345191
}
Packit 345191
Packit 345191
static inline void
Packit 345191
spin_adaptive(spin_t *spin) {
Packit 345191
	volatile uint32_t i;
Packit 345191
Packit 345191
	if (spin->iteration < 5) {
Packit 345191
		for (i = 0; i < (1U << spin->iteration); i++) {
Packit 345191
			spin_cpu_spinwait();
Packit 345191
		}
Packit 345191
		spin->iteration++;
Packit 345191
	} else {
Packit 345191
#ifdef _WIN32
Packit 345191
		SwitchToThread();
Packit 345191
#else
Packit 345191
		sched_yield();
Packit 345191
#endif
Packit 345191
	}
Packit 345191
}
Packit 345191
Packit 345191
#undef SPIN_INLINE
Packit 345191
Packit 345191
#endif /* JEMALLOC_INTERNAL_SPIN_H */