| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- //
- // RWLock.h
- //
- // $Id: //poco/1.4/Foundation/include/Poco/RWLock.h#3 $
- //
- // Library: Foundation
- // Package: Threading
- // Module: RWLock
- //
- // Definition of the RWLock class.
- //
- // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #ifndef Foundation_RWLock_INCLUDED
- #define Foundation_RWLock_INCLUDED
- #include "Poco/Foundation.h"
- #include "Poco/Exception.h"
- #if defined(POCO_OS_FAMILY_WINDOWS)
- #if defined(_WIN32_WCE)
- #include "Poco/RWLock_WINCE.h"
- #else
- #include "Poco/RWLock_WIN32.h"
- #endif
- #elif defined(POCO_ANDROID)
- #include "Poco/RWLock_Android.h"
- #elif defined(POCO_VXWORKS)
- #include "Poco/RWLock_VX.h"
- #else
- #include "Poco/RWLock_POSIX.h"
- #endif
- namespace Poco {
- class ScopedRWLock;
- class ScopedReadRWLock;
- class ScopedWriteRWLock;
- class Foundation_API RWLock: private RWLockImpl
- /// A reader writer lock allows multiple concurrent
- /// readers or one exclusive writer.
- {
- public:
- typedef ScopedRWLock ScopedLock;
- typedef ScopedReadRWLock ScopedReadLock;
- typedef ScopedWriteRWLock ScopedWriteLock;
- RWLock();
- /// Creates the Reader/Writer lock.
-
- ~RWLock();
- /// Destroys the Reader/Writer lock.
-
- void readLock();
- /// Acquires a read lock. If another thread currently holds a write lock,
- /// waits until the write lock is released.
- bool tryReadLock();
- /// Tries to acquire a read lock. Immediately returns true if successful, or
- /// false if another thread currently holds a write lock.
- void writeLock();
- /// Acquires a write lock. If one or more other threads currently hold
- /// locks, waits until all locks are released. The results are undefined
- /// if the same thread already holds a read or write lock
- bool tryWriteLock();
- /// Tries to acquire a write lock. Immediately returns true if successful,
- /// or false if one or more other threads currently hold
- /// locks. The result is undefined if the same thread already
- /// holds a read or write lock.
- void unlock();
- /// Releases the read or write lock.
- private:
- RWLock(const RWLock&);
- RWLock& operator = (const RWLock&);
- };
- class Foundation_API ScopedRWLock
- /// A variant of ScopedLock for reader/writer locks.
- {
- public:
- ScopedRWLock(RWLock& rwl, bool write = false);
- ~ScopedRWLock();
- private:
- RWLock& _rwl;
- ScopedRWLock();
- ScopedRWLock(const ScopedRWLock&);
- ScopedRWLock& operator = (const ScopedRWLock&);
- };
- class Foundation_API ScopedReadRWLock : public ScopedRWLock
- /// A variant of ScopedLock for reader locks.
- {
- public:
- ScopedReadRWLock(RWLock& rwl);
- ~ScopedReadRWLock();
- };
- class Foundation_API ScopedWriteRWLock : public ScopedRWLock
- /// A variant of ScopedLock for writer locks.
- {
- public:
- ScopedWriteRWLock(RWLock& rwl);
- ~ScopedWriteRWLock();
- };
- //
- // inlines
- //
- inline void RWLock::readLock()
- {
- readLockImpl();
- }
- inline bool RWLock::tryReadLock()
- {
- return tryReadLockImpl();
- }
- inline void RWLock::writeLock()
- {
- writeLockImpl();
- }
- inline bool RWLock::tryWriteLock()
- {
- return tryWriteLockImpl();
- }
- inline void RWLock::unlock()
- {
- unlockImpl();
- }
- inline ScopedRWLock::ScopedRWLock(RWLock& rwl, bool write): _rwl(rwl)
- {
- if (write)
- _rwl.writeLock();
- else
- _rwl.readLock();
- }
- inline ScopedRWLock::~ScopedRWLock()
- {
- try
- {
- _rwl.unlock();
- }
- catch (...)
- {
- poco_unexpected();
- }
- }
- inline ScopedReadRWLock::ScopedReadRWLock(RWLock& rwl): ScopedRWLock(rwl, false)
- {
- }
- inline ScopedReadRWLock::~ScopedReadRWLock()
- {
- }
- inline ScopedWriteRWLock::ScopedWriteRWLock(RWLock& rwl): ScopedRWLock(rwl, true)
- {
- }
- inline ScopedWriteRWLock::~ScopedWriteRWLock()
- {
- }
- } // namespace Poco
- #endif // Foundation_RWLock_INCLUDED
|