aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/poco/Foundation/include/Poco/Mutex.h
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/Foundation/include/Poco/Mutex.h
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/Foundation/include/Poco/Mutex.h')
-rw-r--r--contrib/libs/poco/Foundation/include/Poco/Mutex.h270
1 files changed, 270 insertions, 0 deletions
diff --git a/contrib/libs/poco/Foundation/include/Poco/Mutex.h b/contrib/libs/poco/Foundation/include/Poco/Mutex.h
new file mode 100644
index 0000000000..64d0efc06d
--- /dev/null
+++ b/contrib/libs/poco/Foundation/include/Poco/Mutex.h
@@ -0,0 +1,270 @@
+//
+// Mutex.h
+//
+// Library: Foundation
+// Package: Threading
+// Module: Mutex
+//
+// Definition of the Mutex and FastMutex classes.
+//
+// Copyright (c) 2004-2008, Applied Informatics Software Engineering GmbH.
+// and Contributors.
+//
+// SPDX-License-Identifier: BSL-1.0
+//
+
+
+#ifndef Foundation_Mutex_INCLUDED
+#define Foundation_Mutex_INCLUDED
+
+
+#include "Poco/Foundation.h"
+#include "Poco/Exception.h"
+#include "Poco/ScopedLock.h"
+
+
+#if defined(POCO_OS_FAMILY_WINDOWS)
+#if defined(_WIN32_WCE)
+#include "Poco/Mutex_WINCE.h"
+#else
+#include "Poco/Mutex_WIN32.h"
+#endif
+#elif defined(POCO_VXWORKS)
+#include "Poco/Mutex_VX.h"
+#else
+#include "Poco/Mutex_POSIX.h"
+#endif
+
+
+namespace Poco {
+
+
+class Foundation_API Mutex: private MutexImpl
+ /// A Mutex (mutual exclusion) is a synchronization
+ /// mechanism used to control access to a shared resource
+ /// in a concurrent (multithreaded) scenario.
+ /// Mutexes are recursive, that is, the same mutex can be
+ /// locked multiple times by the same thread (but, of course,
+ /// not by other threads).
+ /// Using the ScopedLock class is the preferred way to automatically
+ /// lock and unlock a mutex.
+{
+public:
+ typedef Poco::ScopedLock<Mutex> ScopedLock;
+
+ Mutex();
+ /// creates the Mutex.
+
+ ~Mutex();
+ /// destroys the Mutex.
+
+ void lock();
+ /// Locks the mutex. Blocks if the mutex
+ /// is held by another thread.
+
+ void lock(long milliseconds);
+ /// Locks the mutex. Blocks up to the given number of milliseconds
+ /// if the mutex is held by another thread. Throws a TimeoutException
+ /// if the mutex can not be locked within the given timeout.
+ ///
+ /// Performance Note: On most platforms (including Windows), this member function is
+ /// implemented using a loop calling (the equivalent of) tryLock() and Thread::sleep().
+ /// On POSIX platforms that support pthread_mutex_timedlock(), this is used.
+
+ bool tryLock();
+ /// Tries to lock the mutex. Returns false immediately
+ /// if the mutex is already held by another thread.
+ /// Returns true if the mutex was successfully locked.
+
+ bool tryLock(long milliseconds);
+ /// Locks the mutex. Blocks up to the given number of milliseconds
+ /// if the mutex is held by another thread.
+ /// Returns true if the mutex was successfully locked.
+ ///
+ /// Performance Note: On most platforms (including Windows), this member function is
+ /// implemented using a loop calling (the equivalent of) tryLock() and Thread::sleep().
+ /// On POSIX platforms that support pthread_mutex_timedlock(), this is used.
+
+ void unlock();
+ /// Unlocks the mutex so that it can be acquired by
+ /// other threads.
+
+private:
+ Mutex(const Mutex&);
+ Mutex& operator = (const Mutex&);
+};
+
+
+class Foundation_API FastMutex: private FastMutexImpl
+ /// A FastMutex (mutual exclusion) is similar to a Mutex.
+ /// Unlike a Mutex, however, a FastMutex is not recursive,
+ /// which means that a deadlock will occur if the same
+ /// thread tries to lock a mutex it has already locked again.
+ /// Locking a FastMutex is faster than locking a recursive Mutex.
+ /// Using the ScopedLock class is the preferred way to automatically
+ /// lock and unlock a mutex.
+{
+public:
+ typedef Poco::ScopedLock<FastMutex> ScopedLock;
+
+ FastMutex();
+ /// creates the Mutex.
+
+ ~FastMutex();
+ /// destroys the Mutex.
+
+ void lock();
+ /// Locks the mutex. Blocks if the mutex
+ /// is held by another thread.
+
+ void lock(long milliseconds);
+ /// Locks the mutex. Blocks up to the given number of milliseconds
+ /// if the mutex is held by another thread. Throws a TimeoutException
+ /// if the mutex can not be locked within the given timeout.
+ ///
+ /// Performance Note: On most platforms (including Windows), this member function is
+ /// implemented using a loop calling (the equivalent of) tryLock() and Thread::sleep().
+ /// On POSIX platforms that support pthread_mutex_timedlock(), this is used.
+
+ bool tryLock();
+ /// Tries to lock the mutex. Returns false immediately
+ /// if the mutex is already held by another thread.
+ /// Returns true if the mutex was successfully locked.
+
+ bool tryLock(long milliseconds);
+ /// Locks the mutex. Blocks up to the given number of milliseconds
+ /// if the mutex is held by another thread.
+ /// Returns true if the mutex was successfully locked.
+ ///
+ /// Performance Note: On most platforms (including Windows), this member function is
+ /// implemented using a loop calling (the equivalent of) tryLock() and Thread::sleep().
+ /// On POSIX platforms that support pthread_mutex_timedlock(), this is used.
+
+ void unlock();
+ /// Unlocks the mutex so that it can be acquired by
+ /// other threads.
+
+private:
+ FastMutex(const FastMutex&);
+ FastMutex& operator = (const FastMutex&);
+};
+
+
+class Foundation_API NullMutex
+ /// A NullMutex is an empty mutex implementation
+ /// which performs no locking at all. Useful in policy driven design
+ /// where the type of mutex used can be now a template parameter allowing the user to switch
+ /// between thread-safe and not thread-safe depending on his need
+ /// Works with the ScopedLock class
+{
+public:
+ typedef Poco::ScopedLock<NullMutex> ScopedLock;
+
+ NullMutex()
+ /// Creates the NullMutex.
+ {
+ }
+
+ ~NullMutex()
+ /// Destroys the NullMutex.
+ {
+ }
+
+ void lock()
+ /// Does nothing.
+ {
+ }
+
+ void lock(long)
+ /// Does nothing.
+ {
+ }
+
+ bool tryLock()
+ /// Does nothing and always returns true.
+ {
+ return true;
+ }
+
+ bool tryLock(long)
+ /// Does nothing and always returns true.
+ {
+ return true;
+ }
+
+ void unlock()
+ /// Does nothing.
+ {
+ }
+};
+
+
+//
+// inlines
+//
+inline void Mutex::lock()
+{
+ lockImpl();
+}
+
+
+inline void Mutex::lock(long milliseconds)
+{
+ if (!tryLockImpl(milliseconds))
+ throw TimeoutException();
+}
+
+
+inline bool Mutex::tryLock()
+{
+ return tryLockImpl();
+}
+
+
+inline bool Mutex::tryLock(long milliseconds)
+{
+ return tryLockImpl(milliseconds);
+}
+
+
+inline void Mutex::unlock()
+{
+ unlockImpl();
+}
+
+
+inline void FastMutex::lock()
+{
+ lockImpl();
+}
+
+
+inline void FastMutex::lock(long milliseconds)
+{
+ if (!tryLockImpl(milliseconds))
+ throw TimeoutException();
+}
+
+
+inline bool FastMutex::tryLock()
+{
+ return tryLockImpl();
+}
+
+
+inline bool FastMutex::tryLock(long milliseconds)
+{
+ return tryLockImpl(milliseconds);
+}
+
+
+inline void FastMutex::unlock()
+{
+ unlockImpl();
+}
+
+
+} // namespace Poco
+
+
+#endif // Foundation_Mutex_INCLUDED