149#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
162 struct SharedContext final {
164 SharedContext ()
noexcept =
default;
165 SharedContext (
const SharedContext&) =
delete;
166 SharedContext& operator= (
const SharedContext&) =
delete;
170 atomic_uint_fast32_t fFullLocks_{0};
171 thread::id fThreadWithFullLock_;
176 static constexpr size_t kInlineSharedLockBufSize_ = 2;
181 array<thread::id, kInlineSharedLockBufSize_> fInitialThreads_;
182 uint8_t fInitialThreadsSize_{0};
183 forward_list<thread::id> fOverflowThreads_;
187 bool GetSharedLockEmpty_ ()
const;
188 pair<size_t, size_t> CountSharedLockThreads_ ()
const;
189 size_t GetSharedLockThreadsCount_ ()
const;
190 size_t CountOfIInSharedLockThreads_ (thread::id i)
const;
191 void AddSharedLock_ (thread::id i);
192 void RemoveSharedLock_ (thread::id i);
209#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
229#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
231 nonvirtual shared_ptr<SharedContext> GetSharedContext ()
const;
240 nonvirtual
void SetAssertExternallySynchronizedMutexContext (
const shared_ptr<SharedContext>& sharedContext);
251 nonvirtual
void lock () noexcept;
257 nonvirtual
bool try_lock () noexcept;
265 nonvirtual
void unlock () noexcept;
325#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
327 nonvirtual
void lock_ () noexcept;
328 nonvirtual
bool try_lock_ () noexcept;
329 nonvirtual
void unlock_ () noexcept;
330 nonvirtual
void lock_shared_ () const noexcept;
331 nonvirtual
void unlock_shared_ () const noexcept;
334 shared_ptr<SharedContext> fSharedContext_;
337 static mutex& GetSharedLockMutexThreads_ ();