142#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
155 struct SharedContext final {
157 SharedContext ()
noexcept =
default;
158 SharedContext (
const SharedContext&) =
delete;
159 SharedContext& operator= (
const SharedContext&) =
delete;
163 atomic_uint_fast32_t fFullLocks_{0};
164 thread::id fThreadWithFullLock_;
169 static constexpr size_t kInlineSharedLockBufSize_ = 2;
174 [[no_unique_address]] array<thread::id, kInlineSharedLockBufSize_> fInitialThreads_;
175 [[no_unique_address]] uint8_t fInitialThreadsSize_{0};
176 forward_list<thread::id> fOverflowThreads_;
180 bool GetSharedLockEmpty_ ()
const;
181 pair<size_t, size_t> CountSharedLockThreads_ ()
const;
182 size_t GetSharedLockThreadsCount_ ()
const;
183 size_t CountOfIInSharedLockThreads_ (thread::id i)
const;
184 void AddSharedLock_ (thread::id i);
185 void RemoveSharedLock_ (thread::id i);
202#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
222#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
224 nonvirtual shared_ptr<SharedContext> GetSharedContext ()
const;
233 nonvirtual
void SetAssertExternallySynchronizedMutexContext (
const shared_ptr<SharedContext>& sharedContext);
244 nonvirtual
void lock () noexcept;
252 nonvirtual
void unlock () noexcept;
312#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
314 nonvirtual
void lock_ () noexcept;
315 nonvirtual
void unlock_ () noexcept;
316 nonvirtual
void lock_shared_ () const noexcept;
317 nonvirtual
void unlock_shared_ () const noexcept;
320 shared_ptr<SharedContext> fSharedContext_;
323 static mutex& GetSharedLockMutexThreads_ ();