Ensure the C lock implementation behaves the same as the ASM
Former-commit-id: b5ddc11c46d2eabd28fae4c69927c356dd18bf6e
This commit is contained in:
parent
7c700f1987
commit
8ce03686ed
@ -356,28 +356,34 @@ 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 (;;) {
|
||||||
|
__atomic_load(&lock->m_ticket.u, &ticketT.u, __ATOMIC_ACQUIRE);
|
||||||
|
if ((ticketT.u & 0xffff) == myticket)
|
||||||
|
break;
|
||||||
|
if (!worker())
|
||||||
|
goto LNormalLoop;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LNormalLoop:
|
||||||
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 != 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
lock->m_depth = 1;
|
lock->m_depth = 1;
|
||||||
__atomic_store(&lock->m_pidOwner, &tid, __ATOMIC_RELEASE);
|
__atomic_store(&lock->m_pidOwner, &tid, __ATOMIC_RELEASE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user