Remove unnecessary mfences

This commit is contained in:
John Sully 2019-02-22 15:49:22 -05:00
parent f4b060e0bd
commit b6735ac883

View File

@ -66,21 +66,18 @@ extern "C" void fastlock_lock(struct fastlock *lock)
return; return;
} }
unsigned myticket = __atomic_fetch_add(&lock->m_ticket.m_avail, 1, __ATOMIC_ACQ_REL); unsigned myticket = __atomic_fetch_add(&lock->m_ticket.m_avail, 1, __ATOMIC_RELEASE);
if (__atomic_load_2(&lock->m_ticket.m_active, __ATOMIC_ACQUIRE) != myticket) int cloops = 0;
while (__atomic_load_2(&lock->m_ticket.m_active, __ATOMIC_ACQUIRE) != myticket)
{ {
int cloops = 1; if ((++cloops % 1024*1024) == 0)
while (__atomic_load_2(&lock->m_ticket.m_active, __ATOMIC_ACQUIRE) != myticket) sched_yield();
{
if ((++cloops % 1024*1024) == 0)
sched_yield();
}
} }
lock->m_depth = 1; lock->m_depth = 1;
__atomic_store_4(&lock->m_pidOwner, gettid(), __ATOMIC_RELEASE); __atomic_store_4(&lock->m_pidOwner, gettid(), __ATOMIC_RELEASE);
__sync_synchronize(); std::atomic_thread_fence(std::memory_order_acquire);
} }
extern "C" int fastlock_trylock(struct fastlock *lock) extern "C" int fastlock_trylock(struct fastlock *lock)
@ -95,7 +92,7 @@ extern "C" int fastlock_trylock(struct fastlock *lock)
if (lock->m_ticket.m_active != lock->m_ticket.m_avail) if (lock->m_ticket.m_active != lock->m_ticket.m_avail)
return false; return false;
uint16_t active = __atomic_load_2(&lock->m_ticket.m_active, __ATOMIC_ACQUIRE); uint16_t active = __atomic_load_2(&lock->m_ticket.m_active, __ATOMIC_RELAXED);
uint16_t next = active + 1; uint16_t next = active + 1;
struct ticket ticket_expect { active, active }; struct ticket ticket_expect { active, active };
@ -104,7 +101,6 @@ extern "C" int fastlock_trylock(struct fastlock *lock)
{ {
lock->m_depth = 1; lock->m_depth = 1;
__atomic_store_4(&lock->m_pidOwner, gettid(), __ATOMIC_RELEASE); __atomic_store_4(&lock->m_pidOwner, gettid(), __ATOMIC_RELEASE);
__sync_synchronize();
return true; return true;
} }
return false; return false;
@ -116,7 +112,7 @@ extern "C" void fastlock_unlock(struct fastlock *lock)
if (lock->m_depth == 0) if (lock->m_depth == 0)
{ {
lock->m_pidOwner = -1; lock->m_pidOwner = -1;
__sync_synchronize(); std::atomic_thread_fence(std::memory_order_acquire);
__atomic_fetch_add(&lock->m_ticket.m_active, 1, __ATOMIC_ACQ_REL); __atomic_fetch_add(&lock->m_ticket.m_active, 1, __ATOMIC_ACQ_REL);
} }
} }