Advertisement
Delfigamer

graphics-d3d/meshdata.cpp (excerpt)

Sep 20th, 2015
348
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. /*
  2.     Threads:
  3.         (g): graphics thread
  4.         (l): logic thread
  5.     Stable states:
  6.         (1): valid front, valid back
  7.         (2):  zero front, valid back; front held at (g)
  8.         (3): valid front,  zero back; back held at (l) or at (g)
  9.         (4):  zero front,  zero back; both held at (g) or at (g) and (l)
  10. */
  11.  
  12.     MeshBuffer* MeshData::trylockfront()
  13.     {
  14.         // (1) -> (2), returns front
  15.         // (2) -> (2), returns 0
  16.         // (3) -> (4), returns front
  17.         // (4) -> (4), returns 0
  18.         MeshBuffer* mb = m_frontbuffer.exchange( 0, std::memory_order_acquire );
  19.         return mb;
  20.     }
  21.  
  22.     void MeshData::unlockfront( MeshBuffer* mb )
  23.     {
  24.         // (1) invalid
  25.         // (2) -> (1), returns 0
  26.         // (3) -> (3), returns front (which means mb is now back)
  27.         // (4) -> (3), returns 0
  28.         MeshBuffer* oldmb = m_frontbuffer.exchange( mb, std::memory_order_relaxed );
  29.         if( oldmb )
  30.         {
  31.             // (3) -> (1)
  32.             m_frontbuffer.store( oldmb, std::memory_order_relaxed );
  33.             m_backbuffer.store( mb, std::memory_order_release ); // so (l) won't see front == back
  34.         }
  35.     }
  36.  
  37.     MeshBuffer* MeshData::trylockback()
  38.     {
  39.         // (1) -> (3), returns back
  40.         // (2) -> (4), returns back
  41.         // (3) -> (3), returns 0
  42.         // (4) -> (4), returns 0
  43.         MeshBuffer* mb = m_backbuffer.exchange( 0, std::memory_order_relaxed );
  44.         return mb;
  45.     }
  46.  
  47.     void MeshData::unlockback( MeshBuffer* mb )
  48.     {
  49.         // (1) invalid
  50.         // (2) invalid
  51.         // (3) -> (3), returns front
  52.         // (4) -> (3), returns 0
  53.         MeshBuffer* oldmb = m_frontbuffer.exchange( mb, std::memory_order_release );
  54.         if( oldmb )
  55.         {
  56.             // (3) -> (1)
  57.             m_backbuffer.store( oldmb, std::memory_order_relaxed );
  58.         }
  59.         m_dirty.store( true, std::memory_order_relaxed );
  60.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement