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

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