Ensure the C lock implementation behaves the same as the ASM

Former-commit-id: b5ddc11c46d2eabd28fae4c69927c356dd18bf6e
This commit is contained in:
John Sully 2021-01-27 05:05:05 +00:00
parent 7c700f1987
commit 8ce03686ed

View File

@ -356,26 +356,32 @@ extern "C" void fastlock_lock(struct fastlock *lock, spin_worker worker)
__atomic_load(&g_fHighCpuPressure, &fHighPressure, __ATOMIC_RELAXED); __atomic_load(&g_fHighCpuPressure, &fHighPressure, __ATOMIC_RELAXED);
unsigned loopLimit = fHighPressure ? 0x10000 : 0x100000; unsigned loopLimit = fHighPressure ? 0x10000 : 0x100000;
// WARNING:::: THIS DOESN"T MATCH ASM if (worker != nullptr) {
for (;;) for (;;) {
{ __atomic_load(&lock->m_ticket.u, &ticketT.u, __ATOMIC_ACQUIRE);
__atomic_load(&lock->m_ticket.u, &ticketT.u, __ATOMIC_ACQUIRE); if ((ticketT.u & 0xffff) == myticket)
if ((ticketT.u & 0xffff) == myticket) break;
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__) #if defined(__i386__) || defined(__amd64__)
__asm__ __volatile__ ("pause"); __asm__ __volatile__ ("pause");
#elif defined(__aarch64__) #elif defined(__aarch64__)
__asm__ __volatile__ ("yield"); __asm__ __volatile__ ("yield");
#endif #endif
}
if ((++cloops % loopLimit) == 0) if ((++cloops % loopLimit) == 0)
{ {
fastlock_sleep(lock, tid, ticketT.u, myticket); fastlock_sleep(lock, tid, ticketT.u, myticket);
}
} }
} }