bool RWLockImpl::tryWriteLockImpl() { addWriter(); HANDLE h[2]; h[0] = _mutex; h[1] = _writeEvent; switch (WaitForMultipleObjects(2, h, TRUE, 1)) { case WAIT_OBJECT_0: case WAIT_OBJECT_0 + 1: --_writersWaiting; ++_readers; ++_writers; ResetEvent(_readEvent); ResetEvent(_writeEvent); ReleaseMutex(_mutex); poco_assert_dbg(_writers == 1); return true; case WAIT_TIMEOUT: removeWriter(); return false; default: removeWriter(); throw SystemException("cannot lock reader/writer lock"); } }
bool RWLockImpl::tryWriteLockImpl() { addWriter(); HANDLE h[2]; h[0] = _mutex; h[1] = _writeEvent; switch (WaitForMultipleObjects(2, h, TRUE, 1)) { case WAIT_OBJECT_0: case WAIT_OBJECT_0 + 1: --_writersWaiting; ++_readers; ++_writers; ResetEvent(_readEvent); ResetEvent(_writeEvent); ReleaseMutex(_mutex); ASSERT(_writers == 1); return true; case WAIT_TIMEOUT: removeWriter(); return false; default: removeWriter(); NIT_THROW_FMT(EX_SYSTEM, "cannot lock reader/writer lock"); } }
void RWLockImpl::writeLockImpl() { addWriter(); HANDLE h[2]; h[0] = _mutex; h[1] = _writeEvent; switch (WaitForMultipleObjects(2, h, TRUE, INFINITE)) { case WAIT_OBJECT_0: case WAIT_OBJECT_0 + 1: --_writers; ++_readers; ResetEvent(_readEvent); ResetEvent(_writeEvent); ReleaseMutex(_mutex); break; default: removeWriter(); throw SystemException("cannot lock reader/writer lock"); } }
~InputProxyPort() { removeWriter(); port->disconnect(); }