ReXGlue SDK
Loading...
Searching...
No Matches
lock_order.h
Go to the documentation of this file.
1
10
11#pragma once
12
13#include <mutex>
14#include <shared_mutex>
15
16#include <rex/platform.h>
17#include <rex/types.h>
18#include <rex/utility.h>
19
20namespace rex::platform {
21
26enum class LockRank : u8 {
27 kLeaf = 0xFF,
28};
29
36using LockOrderHandler = void (*)(LockRank held, LockRank acquiring);
37
45
48
49REX_API void PopLockRank(LockRank rank);
50
52class RankedMutex : public rex::NonCopyable {
53 public:
54 explicit RankedMutex(LockRank rank) : rank_(rank) {}
55
56 void lock() {
57 PushLockRank(rank_);
58 mutex_.lock();
59 }
60
61 bool try_lock() {
62 if (!mutex_.try_lock()) {
63 return false;
64 }
65 PushLockRank(rank_);
66 return true;
67 }
68
69 void unlock() {
70 PopLockRank(rank_);
71 mutex_.unlock();
72 }
73
74 private:
75 std::mutex mutex_;
76 LockRank rank_;
77};
78
80class RankedSharedMutex : public rex::NonCopyable {
81 public:
82 explicit RankedSharedMutex(LockRank rank) : rank_(rank) {}
83
84 void lock() {
85 PushLockRank(rank_);
86 mutex_.lock();
87 }
88
89 void unlock() {
90 PopLockRank(rank_);
91 mutex_.unlock();
92 }
93
94 void lock_shared() {
95 PushLockRank(rank_);
96 mutex_.lock_shared();
97 }
98
99 void unlock_shared() {
100 PopLockRank(rank_);
101 mutex_.unlock_shared();
102 }
103
104 private:
105 std::shared_mutex mutex_;
106 LockRank rank_;
107};
108
109} // namespace rex::platform
110
111namespace rex::platform::lock_rank {
112
114inline constexpr LockRank kInterruptState{1};
115
117inline constexpr LockRank kObjectIdentityMap{2};
118
120inline constexpr LockRank kObjectTable{3};
121
123inline constexpr LockRank kObjectNameMap{4};
124
126inline constexpr LockRank kThreadRegistry{5};
127
129inline constexpr LockRank kModuleRegistry{6};
130
132inline constexpr LockRank kObjectState{7};
133
135inline constexpr LockRank kDPC{8};
136
137} // namespace rex::platform::lock_rank
Definition utility.h:37
constexpr LockRank kObjectIdentityMap
Definition lock_order.h:117
constexpr LockRank kObjectState
Definition lock_order.h:132
constexpr LockRank kObjectTable
Definition lock_order.h:120
constexpr LockRank kDPC
Definition lock_order.h:135
constexpr LockRank kThreadRegistry
Definition lock_order.h:126
constexpr LockRank kObjectNameMap
Definition lock_order.h:123
constexpr LockRank kModuleRegistry
Definition lock_order.h:129
constexpr LockRank kInterruptState
Definition lock_order.h:114
Definition platform.h:345
LockOrderHandler SetLockOrderHandler(LockOrderHandler handler)
void PushLockRank(LockRank rank)
void(*)(LockRank held, LockRank acquiring) LockOrderHandler
Definition lock_order.h:36
LockRank
Definition lock_order.h:26
@ kLeaf
Definition lock_order.h:27
Platform flags, packing macros and export markers.
#define REX_API
Definition platform.h:177
Integer types, byte order wrappers and size literals.
Move only function, const propagating pointer and scope guard.