// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "lock.h" #include namespace easymedia { LockMutex::LockMutex() #ifndef NDEBUG : lock_times(0) #endif { } LockMutex::~LockMutex() { #ifndef NDEBUG assert(lock_times == 0 && "mutex lock/unlock mismatch"); #endif } void LockMutex::locktimeinc() { #ifndef NDEBUG lock_times++; #endif } void LockMutex::locktimedec() { #ifndef NDEBUG lock_times--; #endif } void ConditionLockMutex::lock() { mtx.lock(); locktimeinc(); } void ConditionLockMutex::unlock() { locktimedec(); mtx.unlock(); } void ConditionLockMutex::wait() { cond.wait(mtx); } void ConditionLockMutex::notify() { cond.notify_all(); } ReadWriteLockMutex::ReadWriteLockMutex() : valid(true) { int ret = pthread_rwlock_init(&rwlock, NULL); if (ret) { fprintf(stderr, "Fail to pthread_rwlock_init\n"); valid = false; } } ReadWriteLockMutex::~ReadWriteLockMutex() { if (valid) { pthread_rwlock_destroy(&rwlock); } } void ReadWriteLockMutex::lock() { // write lock if (valid) { pthread_rwlock_wrlock(&rwlock); } locktimeinc(); } void ReadWriteLockMutex::unlock() { locktimedec(); if (valid) { pthread_rwlock_unlock(&rwlock); } } void ReadWriteLockMutex::read_lock() { if (valid) { pthread_rwlock_rdlock(&rwlock); } locktimeinc(); } SpinLockMutex::SpinLockMutex() : flag(ATOMIC_FLAG_INIT) { } void SpinLockMutex::lock() { while (flag.test_and_set(std::memory_order_acquire)) ; locktimeinc(); } void SpinLockMutex::unlock() { locktimedec(); flag.clear(std::memory_order_release); } } // namespace easymedia