Yield in ticket lock

This commit is contained in:
Adam Ierymenko 2019-08-28 07:34:24 -07:00
parent 9d1207b339
commit 46db37e06c
No known key found for this signature in database
GPG Key ID: C8877CF2D7A5D7F3

View File

@ -26,7 +26,7 @@ namespace ZeroTier {
#if defined(__GNUC__) && (defined(__amd64) || defined(__amd64__) || defined(__x86_64) || defined(__x86_64__) || defined(__AMD64) || defined(__AMD64__) || defined(_M_X64))
// Inline ticket lock on x64 systems with GCC and CLANG (Mac, Linux) -- this is really fast as long as contention is LOW
// Inline ticket lock with yield for x64 systems, provides much better performance when there is no contention.
class Mutex
{
public:
@ -36,6 +36,7 @@ public:
{
const uint16_t myTicket = __sync_fetch_and_add(&(const_cast<Mutex *>(this)->nextTicket),1);
while (nowServing != myTicket) {
pthread_yield_np();
__asm__ __volatile__("rep;nop"::);
__asm__ __volatile__("":::"memory");
}