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 */
|