| 1619 | } |
| 1620 | |
| 1621 | int ticket_spinlock::lock() { |
| 1622 | const auto ticket = next.fetch_add(1, std::memory_order_relaxed); |
| 1623 | while (serv.load(std::memory_order_acquire) != ticket) { |
| 1624 | #ifdef __aarch64__ |
| 1625 | asm volatile("isb" : : : "memory"); |
| 1626 | #else |
| 1627 | _mm_pause(); |
| 1628 | #endif |
| 1629 | } |
| 1630 | return 0; |
| 1631 | } |
| 1632 | |
| 1633 | void ticket_spinlock::unlock() { |
| 1634 | const auto successor = serv.load(std::memory_order_relaxed) + 1; |