| 605 | } |
| 606 | |
| 607 | void Unlock() |
| 608 | { |
| 609 | Y_ASSERT_NOBT(LockVar != LF_LOCK_FREE); |
| 610 | if (DoCas(&LockVar, LF_LOCK_FREE, LF_LOCK_LOCKED) != LF_LOCK_LOCKED) { |
| 611 | Y_ASSERT_NOBT(LockVar == LF_LOCK_FUTEX_WAIT && LFHasFutex); |
| 612 | LockVar = LF_LOCK_FREE; |
| 613 | #ifdef _win_ |
| 614 | WakeByAddressAll((PVOID)&LockVar); |
| 615 | #elif defined(_linux_) |
| 616 | syscall(SYS_futex, &LockVar, FUTEX_WAKE_PRIVATE, INT_MAX, 0, 0, 0); |
| 617 | #endif |
| 618 | } |
| 619 | } |
| 620 | }; |
| 621 | |
| 622 | static TLFLockData LFGlobalLock; |