| | |
| | | namespace bhome_shm |
| | | { |
| | | |
| | | bool MutexWithTimeLimit::try_lock() |
| | | { |
| | | if (mutex_.try_lock()) { |
| | | auto old_time = last_lock_time_.load(); |
| | | if (Now() - old_time > limit_) { |
| | | return last_lock_time_.compare_exchange_strong(old_time, Now()); |
| | | } else { |
| | | last_lock_time_.store(Now()); |
| | | return true; |
| | | } |
| | | } else { |
| | | auto old_time = last_lock_time_.load(); |
| | | if (Now() - old_time > limit_) { |
| | | return last_lock_time_.compare_exchange_strong(old_time, Now()); |
| | | } else { |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | void MutexWithTimeLimit::lock() |
| | | { |
| | | while (!try_lock()) { |
| | | std::this_thread::yield(); |
| | | } |
| | | } |
| | | void MutexWithTimeLimit::unlock() |
| | | { |
| | | auto old_time = last_lock_time_.load(); |
| | | if (Now() - old_time > limit_) { |
| | | } else { |
| | | if (last_lock_time_.compare_exchange_strong(old_time, Now())) { |
| | | mutex_.unlock(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | SharedMemory::SharedMemory(const std::string &name, const uint64_t size) : |
| | | mshm_t(open_or_create, name.c_str(), size, 0, AllowAll()), |
| | | name_(name) |