Remove unnecessary mfences
This commit is contained in:
parent
f4b060e0bd
commit
b6735ac883
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user