Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Threads:
- (g): graphics thread
- (l): logic thread
- Stable states:
- (1): valid front, valid back
- (2): zero front, valid back; front held at (g)
- (3): valid front, zero back; back held at (l) or at (g)
- (4): zero front, zero back; both held at (g) or at (g) and (l)
- */
- MeshBuffer* MeshData::trylockfront()
- {
- // (1) -> (2), returns front
- // (2) -> (2), returns 0
- // (3) -> (4), returns front
- // (4) -> (4), returns 0
- MeshBuffer* mb = m_frontbuffer.exchange( 0, std::memory_order_acquire );
- return mb;
- }
- void MeshData::unlockfront( MeshBuffer* mb )
- {
- // (1) invalid
- // (2) -> (1), returns 0
- // (3) -> (3), returns front (which means mb is now back)
- // (4) -> (3), returns 0
- MeshBuffer* oldmb = m_frontbuffer.exchange( mb, std::memory_order_relaxed );
- if( oldmb )
- {
- // (3) -> (1)
- m_frontbuffer.store( oldmb, std::memory_order_relaxed );
- m_backbuffer.store( mb, std::memory_order_release ); // so (l) won't see front == back
- }
- }
- MeshBuffer* MeshData::trylockback()
- {
- // (1) -> (3), returns back
- // (2) -> (4), returns back
- // (3) -> (3), returns 0
- // (4) -> (4), returns 0
- MeshBuffer* mb = m_backbuffer.exchange( 0, std::memory_order_relaxed );
- return mb;
- }
- void MeshData::unlockback( MeshBuffer* mb )
- {
- // (1) invalid
- // (2) invalid
- // (3) -> (3), returns front
- // (4) -> (3), returns 0
- MeshBuffer* oldmb = m_frontbuffer.exchange( mb, std::memory_order_release );
- if( oldmb )
- {
- // (3) -> (1)
- m_backbuffer.store( oldmb, std::memory_order_relaxed );
- }
- m_dirty.store( true, std::memory_order_relaxed );
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement