-
Notifications
You must be signed in to change notification settings - Fork 0
/
SFBUnfairLock.hpp
101 lines (78 loc) · 2.18 KB
/
SFBUnfairLock.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//
// Copyright (c) 2020 - 2024 Stephen F. Booth <me@sbooth.org>
// Part of https://github.com/sbooth/CXXAudioUtilities
// MIT license
//
#pragma once
#import <os/lock.h>
namespace SFB {
/// A wrapper around @c os_unfair_lock implementing C++ @c Lockable
///
/// This class may be used with @c std::lock_guard for a scope-based lock.
///
/// @code
/// SFB::UnfairLock _lock;
/// // Later
/// std::lock_guard<SFB::UnfairLock> lock(_lock);
/// @endcode
class UnfairLock
{
public:
#pragma mark Creation and Destruction
/// Creates a new @c UnfairLock
inline UnfairLock() noexcept
: mLock{OS_UNFAIR_LOCK_INIT}
{}
// This class is non-copyable
UnfairLock(const UnfairLock& rhs) = delete;
// This class is non-assignable
UnfairLock& operator=(const UnfairLock& rhs) = delete;
// Destructor
~UnfairLock() = default;
// This class is non-movable
UnfairLock(const UnfairLock&& rhs) = delete;
// This class is non-move assignable
UnfairLock& operator=(const UnfairLock&& rhs) = delete;
#pragma mark Lockable
/// Locks the lock
inline void lock() noexcept
{
os_unfair_lock_lock(&mLock);
}
/// Unlocks the lock
inline void unlock() noexcept
{
os_unfair_lock_unlock(&mLock);
}
/// Attempts to lock the lock
/// @return @c true if the lock was successfully locked, @c false on error
inline bool try_lock() noexcept
{
return os_unfair_lock_trylock(&mLock);
}
#pragma mark Ownership
/// Asserts that the calling thread is the current owner of the lock.
///
/// If the lock is currently owned by the calling thread, this function returns.
///
/// If the lock is unlocked or owned by a different thread, this function
/// asserts and terminates the process.
inline void assert_owner() noexcept
{
os_unfair_lock_assert_owner(&mLock);
}
/// Asserts that the calling thread is not the current owner of the lock.
///
/// If the lock is unlocked or owned by a different thread, this function returns.
///
/// If the lock is currently owned by the current thread, this function asserts
/// and terminates the process.
inline void assert_not_owner() noexcept
{
os_unfair_lock_assert_not_owner(&mLock);
}
private:
/// The primitive lock
os_unfair_lock mLock;
};
} // namespace SFB