1 #ifndef __TRACYLOCK_HPP__
2 #define __TRACYLOCK_HPP__
7 #include "../common/TracySystem.hpp"
8 #include "../common/TracyAlign.hpp"
27 MemWrite( &item->hdr.type, QueueType::LockAnnounce );
31 MemWrite( &item->lockAnnounce.type, LockType::Lockable );
32 #ifdef TRACY_ON_DEMAND
44 MemWrite( &item->hdr.type, QueueType::LockTerminate );
47 #ifdef TRACY_ON_DEMAND
55 #ifdef TRACY_ON_DEMAND
57 const auto locks = m_lockCount.fetch_add( 1, std::memory_order_relaxed );
58 const auto active = m_active.load( std::memory_order_relaxed );
59 if( locks == 0 || active )
62 if( active != connected ) m_active.store( connected, std::memory_order_relaxed );
63 if( connected ) queue =
true;
65 if( !queue )
return false;
69 MemWrite( &item->hdr.type, QueueType::LockWait );
80 MemWrite( &item->hdr.type, QueueType::LockObtain );
89 #ifdef TRACY_ON_DEMAND
90 m_lockCount.fetch_sub( 1, std::memory_order_relaxed );
91 if( !m_active.load( std::memory_order_relaxed ) )
return;
94 m_active.store(
false, std::memory_order_relaxed );
100 MemWrite( &item->hdr.type, QueueType::LockRelease );
109 #ifdef TRACY_ON_DEMAND
110 if( !acquired )
return;
113 const auto locks = m_lockCount.fetch_add( 1, std::memory_order_relaxed );
114 const auto active = m_active.load( std::memory_order_relaxed );
115 if( locks == 0 || active )
118 if( active != connected ) m_active.store( connected, std::memory_order_relaxed );
119 if( connected ) queue =
true;
127 MemWrite( &item->hdr.type, QueueType::LockObtain );
137 #ifdef TRACY_ON_DEMAND
138 const auto active = m_active.load( std::memory_order_relaxed );
139 if( !active )
return;
143 if( active ) m_active.store(
false, std::memory_order_relaxed );
160 memcpy( ptr, name, size );
162 MemWrite( &item->hdr.type, QueueType::LockName );
166 #ifdef TRACY_ON_DEMAND
175 #ifdef TRACY_ON_DEMAND
176 std::atomic<uint32_t> m_lockCount;
177 std::atomic<bool> m_active;
242 MemWrite( &item->hdr.type, QueueType::LockAnnounce );
246 MemWrite( &item->lockAnnounce.type, LockType::SharedLockable );
247 #ifdef TRACY_ON_DEMAND
259 MemWrite( &item->hdr.type, QueueType::LockTerminate );
262 #ifdef TRACY_ON_DEMAND
270 #ifdef TRACY_ON_DEMAND
272 const auto locks = m_lockCount.fetch_add( 1, std::memory_order_relaxed );
273 const auto active = m_active.load( std::memory_order_relaxed );
274 if( locks == 0 || active )
277 if( active != connected ) m_active.store( connected, std::memory_order_relaxed );
278 if( connected ) queue =
true;
280 if( !queue )
return false;
284 MemWrite( &item->hdr.type, QueueType::LockWait );
295 MemWrite( &item->hdr.type, QueueType::LockObtain );
304 #ifdef TRACY_ON_DEMAND
305 m_lockCount.fetch_sub( 1, std::memory_order_relaxed );
306 if( !m_active.load( std::memory_order_relaxed ) )
return;
309 m_active.store(
false, std::memory_order_relaxed );
315 MemWrite( &item->hdr.type, QueueType::LockRelease );
324 #ifdef TRACY_ON_DEMAND
325 if( !acquired )
return;
328 const auto locks = m_lockCount.fetch_add( 1, std::memory_order_relaxed );
329 const auto active = m_active.load( std::memory_order_relaxed );
330 if( locks == 0 || active )
333 if( active != connected ) m_active.store( connected, std::memory_order_relaxed );
334 if( connected ) queue =
true;
342 MemWrite( &item->hdr.type, QueueType::LockObtain );
352 #ifdef TRACY_ON_DEMAND
354 const auto locks = m_lockCount.fetch_add( 1, std::memory_order_relaxed );
355 const auto active = m_active.load( std::memory_order_relaxed );
356 if( locks == 0 || active )
359 if( active != connected ) m_active.store( connected, std::memory_order_relaxed );
360 if( connected ) queue =
true;
362 if( !queue )
return false;
366 MemWrite( &item->hdr.type, QueueType::LockSharedWait );
377 MemWrite( &item->hdr.type, QueueType::LockSharedObtain );
386 #ifdef TRACY_ON_DEMAND
387 m_lockCount.fetch_sub( 1, std::memory_order_relaxed );
388 if( !m_active.load( std::memory_order_relaxed ) )
return;
391 m_active.store(
false, std::memory_order_relaxed );
397 MemWrite( &item->hdr.type, QueueType::LockSharedRelease );
406 #ifdef TRACY_ON_DEMAND
407 if( !acquired )
return;
410 const auto locks = m_lockCount.fetch_add( 1, std::memory_order_relaxed );
411 const auto active = m_active.load( std::memory_order_relaxed );
412 if( locks == 0 || active )
415 if( active != connected ) m_active.store( connected, std::memory_order_relaxed );
416 if( connected ) queue =
true;
424 MemWrite( &item->hdr.type, QueueType::LockSharedObtain );
434 #ifdef TRACY_ON_DEMAND
435 const auto active = m_active.load( std::memory_order_relaxed );
436 if( !active )
return;
440 if( active ) m_active.store(
false, std::memory_order_relaxed );
457 memcpy( ptr, name, size );
459 MemWrite( &item->hdr.type, QueueType::LockName );
463 #ifdef TRACY_ON_DEMAND
472 #ifdef TRACY_ON_DEMAND
473 std::atomic<uint32_t> m_lockCount;
474 std::atomic<bool> m_active;
525 const auto acquired =
m_lockable.try_lock_shared();