123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- #ifndef CXXUTIL_SPIN_LOCK_H_
- #define CXXUTIL_SPIN_LOCK_H_
- #include <pthread.h>
- #include <atomic>
- #include "cxxutil/noncopy.h"
- namespace edk {
- class SpinLock : public NonCopyable {
- public:
-
- SpinLock() { pthread_spin_init(&lock_, PTHREAD_PROCESS_PRIVATE); }
-
- ~SpinLock() { pthread_spin_destroy(&lock_); }
-
- void Lock() { pthread_spin_lock(&lock_); }
-
- void Unlock() { pthread_spin_unlock(&lock_); }
- private:
- pthread_spinlock_t lock_;
- };
- class SpinLockGuard {
- public:
-
- explicit SpinLockGuard(SpinLock &lock) : lock_(lock) {
- lock_.Lock();
- is_locked.store(true, std::memory_order_release);
- }
-
- void Lock() {
- if (!is_locked.load(std::memory_order_consume)) {
- lock_.Lock();
- is_locked.store(true, std::memory_order_release);
- }
- }
-
- void Unlock() {
- if (is_locked.load(std::memory_order_consume)) {
- lock_.Unlock();
- is_locked.store(false, std::memory_order_release);
- }
- }
-
- ~SpinLockGuard() {
- if (is_locked.load(std::memory_order_consume)) {
- lock_.Unlock();
- }
- }
- private:
- SpinLock &lock_;
- std::atomic<bool> is_locked{false};
- };
- }
- #endif
|