From 8ce03686edafbbdae47e7f451211c53542f6649b Mon Sep 17 00:00:00 2001 From: John Sully Date: Wed, 27 Jan 2021 05:05:05 +0000 Subject: [PATCH] Ensure the C lock implementation behaves the same as the ASM Former-commit-id: b5ddc11c46d2eabd28fae4c69927c356dd18bf6e --- src/fastlock.cpp | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/fastlock.cpp b/src/fastlock.cpp index 8c1c5f6e4..6e6b6e4d2 100644 --- a/src/fastlock.cpp +++ b/src/fastlock.cpp @@ -356,26 +356,32 @@ extern "C" void fastlock_lock(struct fastlock *lock, spin_worker worker) __atomic_load(&g_fHighCpuPressure, &fHighPressure, __ATOMIC_RELAXED); unsigned loopLimit = fHighPressure ? 0x10000 : 0x100000; - // WARNING:::: THIS DOESN"T MATCH ASM - for (;;) - { - __atomic_load(&lock->m_ticket.u, &ticketT.u, __ATOMIC_ACQUIRE); - if ((ticketT.u & 0xffff) == myticket) - break; + if (worker != nullptr) { + for (;;) { + __atomic_load(&lock->m_ticket.u, &ticketT.u, __ATOMIC_ACQUIRE); + if ((ticketT.u & 0xffff) == myticket) + break; + if (!worker()) + goto LNormalLoop; + } + } else { +LNormalLoop: + for (;;) + { + __atomic_load(&lock->m_ticket.u, &ticketT.u, __ATOMIC_ACQUIRE); + if ((ticketT.u & 0xffff) == myticket) + break; - if (worker != nullptr) { - worker(); - } else { #if defined(__i386__) || defined(__amd64__) __asm__ __volatile__ ("pause"); #elif defined(__aarch64__) __asm__ __volatile__ ("yield"); #endif - } - if ((++cloops % loopLimit) == 0) - { - fastlock_sleep(lock, tid, ticketT.u, myticket); + if ((++cloops % loopLimit) == 0) + { + fastlock_sleep(lock, tid, ticketT.u, myticket); + } } }