diff options
author | orivej <orivej@yandex-team.ru> | 2022-02-10 16:44:49 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:44:49 +0300 |
commit | 718c552901d703c502ccbefdfc3c9028d608b947 (patch) | |
tree | 46534a98bbefcd7b1f3faa5b52c138ab27db75b7 /contrib/libs/poco/Foundation/src/RWLock_WINCE.cpp | |
parent | e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (diff) | |
download | ydb-718c552901d703c502ccbefdfc3c9028d608b947.tar.gz |
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/libs/poco/Foundation/src/RWLock_WINCE.cpp')
-rw-r--r-- | contrib/libs/poco/Foundation/src/RWLock_WINCE.cpp | 342 |
1 files changed, 171 insertions, 171 deletions
diff --git a/contrib/libs/poco/Foundation/src/RWLock_WINCE.cpp b/contrib/libs/poco/Foundation/src/RWLock_WINCE.cpp index f383a9da5d..9e1e150cf6 100644 --- a/contrib/libs/poco/Foundation/src/RWLock_WINCE.cpp +++ b/contrib/libs/poco/Foundation/src/RWLock_WINCE.cpp @@ -1,174 +1,174 @@ -// -// RWLock_WINCE.cpp -// -// Library: Foundation -// Package: Threading -// Module: RWLock -// -// Copyright (c) 2009-2010, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/RWLock_WINCE.h" -#include "Poco/Thread.h" - - -namespace Poco { - - -RWLockImpl::RWLockImpl(): - _readerCount(0), - _readerWaiting(0), - _writerCount(0), - _writerWaiting(0), - _writeLock(false) - -{ - InitializeCriticalSection(&_cs); - _readerGreen = CreateEventW(NULL, FALSE, TRUE, NULL); - if (!_readerGreen) throw SystemException("Cannot create RWLock"); - _writerGreen = CreateEventW(NULL, FALSE, TRUE, NULL); - if (!_writerGreen) - { - CloseHandle(_readerGreen); - throw SystemException("Cannot create RWLock"); - } -} - - -RWLockImpl::~RWLockImpl() -{ - CloseHandle(_readerGreen); - CloseHandle(_writerGreen); - DeleteCriticalSection(&_cs); -} - - -void RWLockImpl::readLockImpl() -{ - tryReadLockImpl(INFINITE); -} - - -bool RWLockImpl::tryReadLockImpl(DWORD timeout) -{ - bool wait = false; - do - { - EnterCriticalSection(&_cs); - if (!_writerCount && !_writerWaiting) - { - if (wait) - { - _readerWaiting--; - wait = false; - } - _readerCount++; - } - else - { - if (!wait) - { - _readerWaiting++; - wait = true; - } - ResetEvent(_readerGreen); - } +// +// RWLock_WINCE.cpp +// +// Library: Foundation +// Package: Threading +// Module: RWLock +// +// Copyright (c) 2009-2010, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/RWLock_WINCE.h" +#include "Poco/Thread.h" + + +namespace Poco { + + +RWLockImpl::RWLockImpl(): + _readerCount(0), + _readerWaiting(0), + _writerCount(0), + _writerWaiting(0), + _writeLock(false) + +{ + InitializeCriticalSection(&_cs); + _readerGreen = CreateEventW(NULL, FALSE, TRUE, NULL); + if (!_readerGreen) throw SystemException("Cannot create RWLock"); + _writerGreen = CreateEventW(NULL, FALSE, TRUE, NULL); + if (!_writerGreen) + { + CloseHandle(_readerGreen); + throw SystemException("Cannot create RWLock"); + } +} + + +RWLockImpl::~RWLockImpl() +{ + CloseHandle(_readerGreen); + CloseHandle(_writerGreen); + DeleteCriticalSection(&_cs); +} + + +void RWLockImpl::readLockImpl() +{ + tryReadLockImpl(INFINITE); +} + + +bool RWLockImpl::tryReadLockImpl(DWORD timeout) +{ + bool wait = false; + do + { + EnterCriticalSection(&_cs); + if (!_writerCount && !_writerWaiting) + { + if (wait) + { + _readerWaiting--; + wait = false; + } + _readerCount++; + } + else + { + if (!wait) + { + _readerWaiting++; + wait = true; + } + ResetEvent(_readerGreen); + } + LeaveCriticalSection(&_cs); + if (wait) + { + if (WaitForSingleObject(_readerGreen, timeout) != WAIT_OBJECT_0) + { + EnterCriticalSection(&_cs); + _readerWaiting--; + SetEvent(_readerGreen); + SetEvent(_writerGreen); + LeaveCriticalSection(&_cs); + return false; + } + } + } + while (wait); + + return true; +} + + +void RWLockImpl::writeLockImpl() +{ + tryWriteLockImpl(INFINITE); +} + + +bool RWLockImpl::tryWriteLockImpl(DWORD timeout) +{ + bool wait = false; + + do + { + EnterCriticalSection(&_cs); + if (!_readerCount && !_writerCount) + { + if (wait) + { + _writerWaiting--; + wait = false; + } + _writerCount++; + } + else + { + if (!wait) + { + _writerWaiting++; + wait = true; + } + ResetEvent(_writerGreen); + } LeaveCriticalSection(&_cs); - if (wait) - { - if (WaitForSingleObject(_readerGreen, timeout) != WAIT_OBJECT_0) - { - EnterCriticalSection(&_cs); - _readerWaiting--; + if (wait) + { + if (WaitForSingleObject(_writerGreen, timeout) != WAIT_OBJECT_0) + { + EnterCriticalSection(&_cs); + _writerWaiting--; SetEvent(_readerGreen); - SetEvent(_writerGreen); - LeaveCriticalSection(&_cs); - return false; - } - } + SetEvent(_writerGreen); + LeaveCriticalSection(&_cs); + return false; + } + } } - while (wait); - - return true; -} - - -void RWLockImpl::writeLockImpl() -{ - tryWriteLockImpl(INFINITE); -} - - -bool RWLockImpl::tryWriteLockImpl(DWORD timeout) -{ - bool wait = false; - - do - { - EnterCriticalSection(&_cs); - if (!_readerCount && !_writerCount) - { - if (wait) - { - _writerWaiting--; - wait = false; - } - _writerCount++; - } - else - { - if (!wait) - { - _writerWaiting++; - wait = true; - } - ResetEvent(_writerGreen); - } - LeaveCriticalSection(&_cs); - if (wait) - { - if (WaitForSingleObject(_writerGreen, timeout) != WAIT_OBJECT_0) - { - EnterCriticalSection(&_cs); - _writerWaiting--; - SetEvent(_readerGreen); - SetEvent(_writerGreen); - LeaveCriticalSection(&_cs); - return false; - } - } - } - while (wait); - - _writeLock = true; - return true; -} - - -void RWLockImpl::unlockImpl() -{ - EnterCriticalSection(&_cs); - - if (_writeLock) - { - _writeLock = false; - _writerCount--; - } - else - { - _readerCount--; - } - if (_writerWaiting) - SetEvent(_writerGreen); - else if (_readerWaiting) - SetEvent(_readerGreen); - - LeaveCriticalSection(&_cs); -} - - -} // namespace Poco + while (wait); + + _writeLock = true; + return true; +} + + +void RWLockImpl::unlockImpl() +{ + EnterCriticalSection(&_cs); + + if (_writeLock) + { + _writeLock = false; + _writerCount--; + } + else + { + _readerCount--; + } + if (_writerWaiting) + SetEvent(_writerGreen); + else if (_readerWaiting) + SetEvent(_readerGreen); + + LeaveCriticalSection(&_cs); +} + + +} // namespace Poco |