mirror of
https://github.com/jemalloc/jemalloc.git
synced 2026-04-20 17:31:16 +03:00
Enhance spin_adaptive() to yield after several iterations.
This avoids worst case behavior if e.g. another thread is preempted while owning the resource the spinning thread is waiting for.
This commit is contained in:
parent
5f11830754
commit
de8a68e853
3 changed files with 28 additions and 6 deletions
|
|
@ -8,14 +8,19 @@ void spin_adaptive(spin_t *spin);
|
|||
#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_SPIN_C_))
|
||||
JEMALLOC_INLINE void
|
||||
spin_adaptive(spin_t *spin) {
|
||||
volatile uint64_t i;
|
||||
volatile uint32_t i;
|
||||
|
||||
for (i = 0; i < (KQU(1) << spin->iteration); i++) {
|
||||
CPU_SPINWAIT;
|
||||
}
|
||||
|
||||
if (spin->iteration < 63) {
|
||||
if (spin->iteration < 5) {
|
||||
for (i = 0; i < (1U << spin->iteration); i++) {
|
||||
CPU_SPINWAIT;
|
||||
}
|
||||
spin->iteration++;
|
||||
} else {
|
||||
#ifdef _WIN32
|
||||
SwitchToThread();
|
||||
#else
|
||||
sched_yield();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue