| 452 | #ifdef __linux__ |
| 453 | #define ROL32(v, shift) ((v << shift) | (v >> (32-shift))) |
| 454 | extern "C" void unlock_futex(struct fastlock *lock, uint16_t ifutex) |
| 455 | { |
| 456 | unsigned mask = (1U << (ifutex % 32)); |
| 457 | unsigned futexT; |
| 458 | |
| 459 | for (;;) |
| 460 | { |
| 461 | __atomic_load(&lock->futex, &futexT, __ATOMIC_ACQUIRE); |
| 462 | futexT &= mask; |
| 463 | if (!futexT) |
| 464 | break; |
| 465 | |
| 466 | if (futex(&lock->m_ticket.u, FUTEX_WAKE_BITSET_PRIVATE, INT_MAX, nullptr, mask) == 1) |
| 467 | break; |
| 468 | } |
| 469 | } |
| 470 | #endif |
| 471 | |
| 472 | extern "C" void fastlock_free(struct fastlock *lock) |
no test coverage detected