162#if qStroika_Foundation_Debug_AssertExternallySynchronizedChecker_Enabled
175 struct SharedContext final {
177 SharedContext ()
noexcept =
default;
178 SharedContext (
const SharedContext&) =
delete;
179 SharedContext& operator= (
const SharedContext&) =
delete;
183 atomic_uint_fast32_t fFullLocks_{0};
184 thread::id fThreadWithFullLock_;
189 static constexpr size_t kInlineSharedLockBufSize_ = 2;
194 array<thread::id, kInlineSharedLockBufSize_> fInitialThreads_;
195 uint8_t fInitialThreadsSize_{0};
196 forward_list<thread::id> fOverflowThreads_;
200 bool GetSharedLockEmpty_ ()
const;
201 pair<size_t, size_t> CountSharedLockThreads_ ()
const;
202 size_t GetSharedLockThreadsCount_ ()
const;
203 size_t CountOfIInSharedLockThreads_ (thread::id i)
const;
204 void AddSharedLock_ (thread::id i);
205 void RemoveSharedLock_ (thread::id i);
222#if qStroika_Foundation_Debug_AssertExternallySynchronizedChecker_Enabled
242#if qStroika_Foundation_Debug_AssertExternallySynchronizedChecker_Enabled
244 nonvirtual shared_ptr<SharedContext> GetSharedContext ()
const;
253 nonvirtual
void SetAssertExternallySynchronizedCheckerContext (
const shared_ptr<SharedContext>& sharedContext);
264 nonvirtual
void lock () noexcept;
270 nonvirtual
bool try_lock () noexcept;
278 nonvirtual
void unlock () noexcept;
338#if qStroika_Foundation_Debug_AssertExternallySynchronizedChecker_Enabled
340 nonvirtual
void lock_ () noexcept;
341 nonvirtual
bool try_lock_ () noexcept;
342 nonvirtual
void unlock_ () noexcept;
343 nonvirtual
void lock_shared_ () const noexcept;
344 nonvirtual
void unlock_shared_ () const noexcept;
347 shared_ptr<SharedContext> fSharedContext_;
350 static mutex& GetSharedLockMutexThreads_ ();