148#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
161 struct SharedContext final {
163 SharedContext ()
noexcept =
default;
164 SharedContext (
const SharedContext&) =
delete;
165 SharedContext& operator= (
const SharedContext&) =
delete;
169 atomic_uint_fast32_t fFullLocks_{0};
170 thread::id fThreadWithFullLock_;
175 static constexpr size_t kInlineSharedLockBufSize_ = 2;
180 array<thread::id, kInlineSharedLockBufSize_> fInitialThreads_;
181 uint8_t fInitialThreadsSize_{0};
182 forward_list<thread::id> fOverflowThreads_;
186 bool GetSharedLockEmpty_ ()
const;
187 pair<size_t, size_t> CountSharedLockThreads_ ()
const;
188 size_t GetSharedLockThreadsCount_ ()
const;
189 size_t CountOfIInSharedLockThreads_ (thread::id i)
const;
190 void AddSharedLock_ (thread::id i);
191 void RemoveSharedLock_ (thread::id i);
208#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
228#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
230 nonvirtual shared_ptr<SharedContext> GetSharedContext ()
const;
239 nonvirtual
void SetAssertExternallySynchronizedMutexContext (
const shared_ptr<SharedContext>& sharedContext);
250 nonvirtual
void lock () noexcept;
256 nonvirtual
bool try_lock () noexcept;
264 nonvirtual
void unlock () noexcept;
324#if qStroika_Foundation_Debug_AssertExternallySynchronizedMutex_Enabled
326 nonvirtual
void lock_ () noexcept;
327 nonvirtual
bool try_lock_ () noexcept;
328 nonvirtual
void unlock_ () noexcept;
329 nonvirtual
void lock_shared_ () const noexcept;
330 nonvirtual
void unlock_shared_ () const noexcept;
333 shared_ptr<SharedContext> fSharedContext_;
336 static mutex& GetSharedLockMutexThreads_ ();