Files
Radio/module/radio/Toolbox_private/SpinLock.cpp
T
2026-06-16 13:38:08 +08:00

33 lines
953 B
C++

#include <chrono>
#include "SpinLock.h"
namespace Toolbox {
void SpinLock::lock() {
while (flag.test_and_set(std::memory_order_acquire)) {}
}
bool SpinLock::tryLock() {
return !flag.test_and_set(std::memory_order_acquire);
}
bool SpinLock::tryLock(int durationMillis) {
if (durationMillis == 0) {
return tryLock();
}
auto duration = std::chrono::milliseconds(durationMillis);
auto start = std::chrono::steady_clock::now();
while (std::chrono::steady_clock::now() - start < duration) {
if (tryLock()) {
return true;
}
}
return false;
}
void SpinLock::unlock() {
flag.clear(std::memory_order_release);
}
SpinLockGuard::~SpinLockGuard() {
if (mLock) mLock->unlock();
}
SpinLockGuard::SpinLockGuard(SpinLock *lock) : mLock(lock) {
if (mLock) mLock->lock();
}
}