class CMutexRW
{
protected :
HANDLE m_semReaders;
HANDLE m_semWriters;
int m_nReaders;
public :
CMutexRW( ) :
m_semReaders( NULL ) ,
m_semWriters( NULL ) ,
m_nReaders( 0 )
{
// initialize the Readers & Writers variables
m_semReaders = :: CreateSemaphore ( NULL , 1 , 1 , NULL ) ;
m_semWriters = :: CreateSemaphore ( NULL , 1 , 1 , NULL ) ;
m_nReaders = 0 ;
if ( m_semReaders == NULL || m_semWriters == NULL )
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL ,
GetLastError( ) ,
MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT) ,
( LPTSTR) & lpMsgBuf,
0 ,
NULL
) ;
TRACE( "***** ERROR: CreateSemaphore: %s\n " , ( LPCTSTR) lpMsgBuf ) ;
LocalFree( lpMsgBuf ) ;
}
} ;
virtual ~CMutexRW( )
{
if ( m_semWriters)
VERIFY( :: CloseHandle ( m_semWriters) ) ;
m_semWriters = NULL ;
if ( m_semReaders)
VERIFY( :: CloseHandle ( m_semReaders) ) ;
m_semReaders = NULL ;
}
inline void Lock_DataRead( ) {
DWORD dwEvent = WAIT_TIMEOUT;
// P( semReaders )
dwEvent = :: WaitForSingleObject ( m_semReaders, INFINITE ) ;
ASSERT( dwEvent == WAIT_OBJECT_0) ;
m_nReaders++ ;
if ( m_nReaders == 1 )
{
// P( semWriters )
dwEvent = :: WaitForSingleObject ( m_semWriters, INFINITE ) ;
ASSERT( dwEvent == WAIT_OBJECT_0) ;
}
// V( semReaders )
VERIFY( :: ReleaseSemaphore ( m_semReaders, 1 , NULL ) ) ;
} ;
inline void Unlock_DataRead( ) {
DWORD dwEvent = WAIT_TIMEOUT;
// P( semReaders )
dwEvent = :: WaitForSingleObject ( m_semReaders, INFINITE ) ;
ASSERT( dwEvent == WAIT_OBJECT_0) ;
m_nReaders-- ;
if ( m_nReaders == 0 )
{
// V( semWriters )
VERIFY( :: ReleaseSemaphore ( m_semWriters, 1 , NULL ) ) ;
}
// V( semReaders )
VERIFY( :: ReleaseSemaphore ( m_semReaders, 1 , NULL ) ) ;
} ;
inline void Lock_DataWrite( ) {
DWORD dwEvent = WAIT_TIMEOUT;
// P( semWriters )
dwEvent = :: WaitForSingleObject ( m_semWriters, INFINITE ) ;
ASSERT( dwEvent == WAIT_OBJECT_0) ;
}
inline void Unlock_DataWrite( ) {
// V( semWriters )
VERIFY( :: ReleaseSemaphore ( m_semWriters, 1 , NULL ) ) ;
} ;
} ;
class CReadLock
{
protected :
CMutexRW* m_pMutexRW;
bool m_bIsLocked;
public :
CReadLock( CMutexRW* pMutexRW, const bool bInitialLock = false ) :
m_pMutexRW( pMutexRW) , m_bIsLocked( false )
{
ASSERT( m_pMutexRW) ;
if ( bInitialLock) {
m_pMutexRW- > Lock_DataRead( ) ;
m_bIsLocked = true ;
}
} ;
inline const bool & IsLocked( ) const {
return m_bIsLocked;
} ;
CmNsYXNzIENNdXRleFJXCnsKcHJvdGVjdGVkOgogICAgSEFORExFICAgICAgICBtX3NlbVJlYWRlcnM7CiAgICBIQU5ETEUgICAgICAgIG1fc2VtV3JpdGVyczsKICAgIGludCAgICAgICAgbV9uUmVhZGVyczsKcHVibGljOgogICAgQ011dGV4UlcoKSA6CiAgICAgICAgbV9zZW1SZWFkZXJzKE5VTEwpLAogICAgICAgIG1fc2VtV3JpdGVycyhOVUxMKSwKICAgICAgICBtX25SZWFkZXJzKDApCiAgICB7CiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgUmVhZGVycyAmIFdyaXRlcnMgdmFyaWFibGVzCiAgICAgICAgbV9zZW1SZWFkZXJzICAgID0gOjpDcmVhdGVTZW1hcGhvcmUoTlVMTCwgMSwgMSwgTlVMTCk7CiAgICAgICAgbV9zZW1Xcml0ZXJzICAgID0gOjpDcmVhdGVTZW1hcGhvcmUoTlVMTCwgMSwgMSwgTlVMTCk7CiAgICAgICAgbV9uUmVhZGVycyAgICA9IDA7CgogICAgICAgIGlmIChtX3NlbVJlYWRlcnMgPT0gTlVMTCB8fCBtX3NlbVdyaXRlcnMgPT0gTlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIExQVk9JRCBscE1zZ0J1ZjsKICAgICAgICAgICAgRm9ybWF0TWVzc2FnZSggCiAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCAKICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwgCiAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKICAgICAgICAgICAgICAgIE5VTEwsCiAgICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSwKICAgICAgICAgICAgICAgIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAogICAgICAgICAgICAgICAgKExQVFNUUikgJmxwTXNnQnVmLAogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIE5VTEwgCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICBUUkFDRSggIioqKioqIEVSUk9SOiBDcmVhdGVTZW1hcGhvcmU6ICVzXG4iLCAoTFBDVFNUUilscE1zZ0J1ZiApOwogICAgICAgICAgICBMb2NhbEZyZWUoIGxwTXNnQnVmICk7ICAgICAgICAgICAgCiAgICAgICAgfQogICAgfTsKCiAgICB2aXJ0dWFsIH5DTXV0ZXhSVygpCiAgICB7CiAgICAgICAgaWYgKG1fc2VtV3JpdGVycykKICAgICAgICAgICAgVkVSSUZZKCA6OkNsb3NlSGFuZGxlKG1fc2VtV3JpdGVycykgKTsgICAgCgogICAgICAgIG1fc2VtV3JpdGVycyA9IE5VTEw7CiAgICAgICAgaWYgKG1fc2VtUmVhZGVycykKICAgICAgICAgICAgVkVSSUZZKCA6OkNsb3NlSGFuZGxlKG1fc2VtUmVhZGVycykgKTsgICAgCiAgICAgICAgbV9zZW1SZWFkZXJzID0gTlVMTDsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBMb2NrX0RhdGFSZWFkKCl7CiAgICAgICAgRFdPUkQgZHdFdmVudCA9IFdBSVRfVElNRU9VVDsKCiAgICAgICAgLy8gUCggc2VtUmVhZGVycyApCiAgICAgICAgZHdFdmVudCA9IDo6V2FpdEZvclNpbmdsZU9iamVjdCggbV9zZW1SZWFkZXJzLCBJTkZJTklURSApOwogICAgICAgIEFTU0VSVChkd0V2ZW50ID09IFdBSVRfT0JKRUNUXzApOwoKICAgICAgICBtX25SZWFkZXJzKys7CgogICAgICAgIGlmIChtX25SZWFkZXJzID09IDEpCiAgICAgICAgewogICAgICAgICAgICAvLyBQKCBzZW1Xcml0ZXJzICkKICAgICAgICAgICAgZHdFdmVudCA9IDo6V2FpdEZvclNpbmdsZU9iamVjdCggbV9zZW1Xcml0ZXJzLCBJTkZJTklURSApOwogICAgICAgICAgICBBU1NFUlQoZHdFdmVudCA9PSBXQUlUX09CSkVDVF8wKTsKICAgICAgICB9CiAgICAgICAgLy8gViggc2VtUmVhZGVycyApCiAgICAgICAgVkVSSUZZKCA6OlJlbGVhc2VTZW1hcGhvcmUoIG1fc2VtUmVhZGVycywgMSwgTlVMTCApICk7CiAgICB9OwoKICAgIGlubGluZSB2b2lkIFVubG9ja19EYXRhUmVhZCgpewogICAgICAgIERXT1JEIGR3RXZlbnQgPSBXQUlUX1RJTUVPVVQ7CiAgICAgICAgLy8gUCggc2VtUmVhZGVycyApCiAgICAgICAgZHdFdmVudCA9IDo6V2FpdEZvclNpbmdsZU9iamVjdCggbV9zZW1SZWFkZXJzLCBJTkZJTklURSApOwogICAgICAgIEFTU0VSVChkd0V2ZW50ID09IFdBSVRfT0JKRUNUXzApOwoKICAgICAgICBtX25SZWFkZXJzLS07CgogICAgICAgIGlmIChtX25SZWFkZXJzID09IDApCiAgICAgICAgewogICAgICAgICAgICAvLyBWKCBzZW1Xcml0ZXJzICkKICAgICAgICAgICAgVkVSSUZZKCA6OlJlbGVhc2VTZW1hcGhvcmUobV9zZW1Xcml0ZXJzLCAxLCBOVUxMKSApOwogICAgICAgIH0KICAgICAgICAvLyBWKCBzZW1SZWFkZXJzICkKICAgICAgICBWRVJJRlkoIDo6UmVsZWFzZVNlbWFwaG9yZSggbV9zZW1SZWFkZXJzLCAxLCBOVUxMICkgKTsKICAgIH07CgogICAgaW5saW5lIHZvaWQgTG9ja19EYXRhV3JpdGUoKXsKICAgICAgICBEV09SRCBkd0V2ZW50ID0gV0FJVF9USU1FT1VUOwoKICAgICAgICAvLyBQKCBzZW1Xcml0ZXJzICkKICAgICAgICBkd0V2ZW50ID0gOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KCBtX3NlbVdyaXRlcnMsIElORklOSVRFICk7CiAgICAgICAgQVNTRVJUKGR3RXZlbnQgPT0gV0FJVF9PQkpFQ1RfMCk7CiAgICB9CgogICAgaW5saW5lIHZvaWQgVW5sb2NrX0RhdGFXcml0ZSgpewogICAgICAgIC8vIFYoIHNlbVdyaXRlcnMgKQogICAgICAgIFZFUklGWSggOjpSZWxlYXNlU2VtYXBob3JlKG1fc2VtV3JpdGVycywgMSwgTlVMTCkgKTsKICAgIH07Cgp9OwoKCmNsYXNzIENSZWFkTG9jawp7CnByb3RlY3RlZDoKICAgIENNdXRleFJXKiBtX3BNdXRleFJXOwogICAgYm9vbCAgICAgIG1fYklzTG9ja2VkOwpwdWJsaWM6CiAgICBDUmVhZExvY2soQ011dGV4UlcqIHBNdXRleFJXLCBjb25zdCBib29sIGJJbml0aWFsTG9jayA9IGZhbHNlKSA6CiAgICAgICAgbV9wTXV0ZXhSVyhwTXV0ZXhSVyksIG1fYklzTG9ja2VkKGZhbHNlKQogICAgewogICAgICAgIEFTU0VSVChtX3BNdXRleFJXKTsKICAgICAgICBpZiAoYkluaXRpYWxMb2NrKXsKICAgICAgICAgICAgbV9wTXV0ZXhSVy0+TG9ja19EYXRhUmVhZCgpOwogICAgICAgICAgICBtX2JJc0xvY2tlZCA9IHRydWU7CiAgICAgICAgfQogICAgfTsKCiAgICBpbmxpbmUgY29uc3QgYm9vbCYgSXNMb2NrZWQoKSBjb25zdHsKICAgICAgICByZXR1cm4gbV9iSXNMb2NrZWQ7CiAgICB9Ow==
compilation info
prog.cpp:5:5: error: unknown type name 'HANDLE'
HANDLE m_semReaders;
^
prog.cpp:6:5: error: unknown type name 'HANDLE'
HANDLE m_semWriters;
^
prog.cpp:10:22: error: use of undeclared identifier 'NULL'
m_semReaders(NULL),
^
prog.cpp:11:22: error: use of undeclared identifier 'NULL'
m_semWriters(NULL),
^
prog.cpp:15:29: error: no member named 'CreateSemaphore' in the global namespace
m_semReaders = ::CreateSemaphore(NULL, 1, 1, NULL);
~~^
prog.cpp:15:45: error: use of undeclared identifier 'NULL'
m_semReaders = ::CreateSemaphore(NULL, 1, 1, NULL);
^
prog.cpp:15:57: error: use of undeclared identifier 'NULL'
m_semReaders = ::CreateSemaphore(NULL, 1, 1, NULL);
^
prog.cpp:16:29: error: no member named 'CreateSemaphore' in the global namespace
m_semWriters = ::CreateSemaphore(NULL, 1, 1, NULL);
~~^
prog.cpp:16:45: error: use of undeclared identifier 'NULL'
m_semWriters = ::CreateSemaphore(NULL, 1, 1, NULL);
^
prog.cpp:16:57: error: use of undeclared identifier 'NULL'
m_semWriters = ::CreateSemaphore(NULL, 1, 1, NULL);
^
prog.cpp:19:29: error: use of undeclared identifier 'NULL'
if (m_semReaders == NULL || m_semWriters == NULL)
^
prog.cpp:19:53: error: use of undeclared identifier 'NULL'
if (m_semReaders == NULL || m_semWriters == NULL)
^
prog.cpp:21:13: error: unknown type name 'LPVOID'
LPVOID lpMsgBuf;
^
prog.cpp:27:17: error: use of undeclared identifier 'GetLastError'
GetLastError(),
^
prog.cpp:29:18: error: use of undeclared identifier 'LPTSTR'
(LPTSTR) &lpMsgBuf,
^
prog.cpp:23:17: error: use of undeclared identifier 'FORMAT_MESSAGE_ALLOCATE_BUFFER'
FORMAT_MESSAGE_ALLOCATE_BUFFER |
^
prog.cpp:24:17: error: use of undeclared identifier 'FORMAT_MESSAGE_FROM_SYSTEM'
FORMAT_MESSAGE_FROM_SYSTEM |
^
prog.cpp:25:17: error: use of undeclared identifier 'FORMAT_MESSAGE_IGNORE_INSERTS'
FORMAT_MESSAGE_IGNORE_INSERTS,
^
prog.cpp:26:17: error: use of undeclared identifier 'NULL'
NULL,
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
stdout