#pragma once 
 | 
#include "utils/NonCopyable.h" 
 | 
  
 | 
namespace il2cpp 
 | 
{ 
 | 
namespace os 
 | 
{ 
 | 
    class ReaderWriterLockImpl; 
 | 
  
 | 
    class ReaderWriterLock 
 | 
    { 
 | 
    public: 
 | 
        ReaderWriterLock(); 
 | 
        ~ReaderWriterLock(); 
 | 
  
 | 
        void LockExclusive(); 
 | 
        void LockShared(); 
 | 
        void ReleaseExclusive(); 
 | 
        void ReleaseShared(); 
 | 
  
 | 
        ReaderWriterLockImpl* GetImpl(); 
 | 
  
 | 
    private: 
 | 
        ReaderWriterLockImpl* m_Impl; 
 | 
    }; 
 | 
  
 | 
    struct ReaderWriterAutoLock : public il2cpp::utils::NonCopyable 
 | 
    { 
 | 
        ReaderWriterAutoLock(ReaderWriterLock* lock, bool exclusive = false) 
 | 
            : m_Lock(lock), m_Exclusive(exclusive) 
 | 
        { 
 | 
            if (m_Exclusive) 
 | 
                m_Lock->LockExclusive(); 
 | 
            else 
 | 
                m_Lock->LockShared(); 
 | 
        } 
 | 
  
 | 
        ~ReaderWriterAutoLock() 
 | 
        { 
 | 
            if (m_Exclusive) 
 | 
                m_Lock->ReleaseExclusive(); 
 | 
            else 
 | 
                m_Lock->ReleaseShared(); 
 | 
        } 
 | 
  
 | 
    private: 
 | 
        ReaderWriterLock* m_Lock; 
 | 
        bool m_Exclusive; 
 | 
    }; 
 | 
} 
 | 
} 
 |