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/Mutex_POSIX.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/Mutex_POSIX.cpp')
-rw-r--r-- | contrib/libs/poco/Foundation/src/Mutex_POSIX.cpp | 350 |
1 files changed, 175 insertions, 175 deletions
diff --git a/contrib/libs/poco/Foundation/src/Mutex_POSIX.cpp b/contrib/libs/poco/Foundation/src/Mutex_POSIX.cpp index 56132ef5d5..f0bb875167 100644 --- a/contrib/libs/poco/Foundation/src/Mutex_POSIX.cpp +++ b/contrib/libs/poco/Foundation/src/Mutex_POSIX.cpp @@ -1,175 +1,175 @@ -// -// Mutex_POSIX.cpp -// -// Library: Foundation -// Package: Threading -// Module: Mutex -// -// Copyright (c) 2004-2008, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#include "Poco/Mutex_POSIX.h" -#include "Poco/Timestamp.h" -#if !defined(POCO_NO_SYS_SELECT_H) -#include <sys/select.h> -#endif -#include <unistd.h> -#if defined(POCO_VXWORKS) -#include <timers.h> -#include <cstring> -#else -#include <sys/time.h> -#endif - - -#if defined(_POSIX_TIMEOUTS) && (_POSIX_TIMEOUTS - 200112L) >= 0L - #if defined(_POSIX_THREADS) && (_POSIX_THREADS - 200112L) >= 0L - #define POCO_HAVE_MUTEX_TIMEOUT - #endif -#endif - - -#ifndef POCO_HAVE_CLOCK_GETTIME - #if (defined(_POSIX_TIMERS) && defined(CLOCK_REALTIME)) || defined(POCO_VXWORKS) || defined(__QNX__) - #ifndef __APPLE__ // See GitHub issue #1453 - not available before Mac OS 10.12/iOS 10 - #define POCO_HAVE_CLOCK_GETTIME - #endif - #endif -#endif - - -namespace Poco { - - -MutexImpl::MutexImpl() -{ -#if defined(POCO_VXWORKS) - // This workaround is for VxWorks 5.x where - // pthread_mutex_init() won't properly initialize the mutex - // resulting in a subsequent freeze in pthread_mutex_destroy() - // if the mutex has never been used. - std::memset(&_mutex, 0, sizeof(_mutex)); -#endif - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); -#if defined(PTHREAD_MUTEX_RECURSIVE_NP) - pthread_mutexattr_settype_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP); -#elif !defined(POCO_VXWORKS) - pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); -#endif - if (pthread_mutex_init(&_mutex, &attr)) - { - pthread_mutexattr_destroy(&attr); - throw SystemException("cannot create mutex"); - } - pthread_mutexattr_destroy(&attr); -} - - -MutexImpl::MutexImpl(bool fast) -{ -#if defined(POCO_VXWORKS) - // This workaround is for VxWorks 5.x where - // pthread_mutex_init() won't properly initialize the mutex - // resulting in a subsequent freeze in pthread_mutex_destroy() - // if the mutex has never been used. - std::memset(&_mutex, 0, sizeof(_mutex)); -#endif - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); -#if defined(PTHREAD_MUTEX_RECURSIVE_NP) - pthread_mutexattr_settype_np(&attr, fast ? PTHREAD_MUTEX_NORMAL_NP : PTHREAD_MUTEX_RECURSIVE_NP); -#elif !defined(POCO_VXWORKS) - pthread_mutexattr_settype(&attr, fast ? PTHREAD_MUTEX_NORMAL : PTHREAD_MUTEX_RECURSIVE); -#endif - if (pthread_mutex_init(&_mutex, &attr)) - { - pthread_mutexattr_destroy(&attr); - throw SystemException("cannot create mutex"); - } - pthread_mutexattr_destroy(&attr); -} - - -MutexImpl::~MutexImpl() -{ - pthread_mutex_destroy(&_mutex); -} - - -bool MutexImpl::tryLockImpl(long milliseconds) -{ -#if defined(POCO_HAVE_MUTEX_TIMEOUT) - struct timespec abstime; -#if defined(POCO_HAVE_CLOCK_GETTIME) - clock_gettime(CLOCK_REALTIME, &abstime); - abstime.tv_sec += milliseconds / 1000; - abstime.tv_nsec += (milliseconds % 1000)*1000000; - if (abstime.tv_nsec >= 1000000000) - { - abstime.tv_nsec -= 1000000000; - abstime.tv_sec++; - } -#else - struct timeval tv; - gettimeofday(&tv, NULL); - abstime.tv_sec = tv.tv_sec + milliseconds / 1000; - abstime.tv_nsec = tv.tv_usec*1000 + (milliseconds % 1000)*1000000; - if (abstime.tv_nsec >= 1000000000) - { - abstime.tv_nsec -= 1000000000; - abstime.tv_sec++; - } -#endif - int rc = pthread_mutex_timedlock(&_mutex, &abstime); - if (rc == 0) - return true; - else if (rc == ETIMEDOUT) - return false; - else - throw SystemException("cannot lock mutex"); -#else - const int sleepMillis = 5; - Timestamp now; - Timestamp::TimeDiff diff(Timestamp::TimeDiff(milliseconds)*1000); - do - { - int rc = pthread_mutex_trylock(&_mutex); - if (rc == 0) - return true; - else if (rc != EBUSY) - throw SystemException("cannot lock mutex"); -#if defined(POCO_VXWORKS) - struct timespec ts; - ts.tv_sec = 0; - ts.tv_nsec = sleepMillis*1000000; - nanosleep(&ts, NULL); - -#else - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = sleepMillis * 1000; - select(0, NULL, NULL, NULL, &tv); -#endif - } - while (!now.isElapsed(diff)); - return false; -#endif -} - - -FastMutexImpl::FastMutexImpl(): MutexImpl(true) -{ -} - - -FastMutexImpl::~FastMutexImpl() -{ -} - - -} // namespace Poco +// +// Mutex_POSIX.cpp +// +// Library: Foundation +// Package: Threading +// Module: Mutex +// +// Copyright (c) 2004-2008, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#include "Poco/Mutex_POSIX.h" +#include "Poco/Timestamp.h" +#if !defined(POCO_NO_SYS_SELECT_H) +#include <sys/select.h> +#endif +#include <unistd.h> +#if defined(POCO_VXWORKS) +#include <timers.h> +#include <cstring> +#else +#include <sys/time.h> +#endif + + +#if defined(_POSIX_TIMEOUTS) && (_POSIX_TIMEOUTS - 200112L) >= 0L + #if defined(_POSIX_THREADS) && (_POSIX_THREADS - 200112L) >= 0L + #define POCO_HAVE_MUTEX_TIMEOUT + #endif +#endif + + +#ifndef POCO_HAVE_CLOCK_GETTIME + #if (defined(_POSIX_TIMERS) && defined(CLOCK_REALTIME)) || defined(POCO_VXWORKS) || defined(__QNX__) + #ifndef __APPLE__ // See GitHub issue #1453 - not available before Mac OS 10.12/iOS 10 + #define POCO_HAVE_CLOCK_GETTIME + #endif + #endif +#endif + + +namespace Poco { + + +MutexImpl::MutexImpl() +{ +#if defined(POCO_VXWORKS) + // This workaround is for VxWorks 5.x where + // pthread_mutex_init() won't properly initialize the mutex + // resulting in a subsequent freeze in pthread_mutex_destroy() + // if the mutex has never been used. + std::memset(&_mutex, 0, sizeof(_mutex)); +#endif + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); +#if defined(PTHREAD_MUTEX_RECURSIVE_NP) + pthread_mutexattr_settype_np(&attr, PTHREAD_MUTEX_RECURSIVE_NP); +#elif !defined(POCO_VXWORKS) + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); +#endif + if (pthread_mutex_init(&_mutex, &attr)) + { + pthread_mutexattr_destroy(&attr); + throw SystemException("cannot create mutex"); + } + pthread_mutexattr_destroy(&attr); +} + + +MutexImpl::MutexImpl(bool fast) +{ +#if defined(POCO_VXWORKS) + // This workaround is for VxWorks 5.x where + // pthread_mutex_init() won't properly initialize the mutex + // resulting in a subsequent freeze in pthread_mutex_destroy() + // if the mutex has never been used. + std::memset(&_mutex, 0, sizeof(_mutex)); +#endif + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); +#if defined(PTHREAD_MUTEX_RECURSIVE_NP) + pthread_mutexattr_settype_np(&attr, fast ? PTHREAD_MUTEX_NORMAL_NP : PTHREAD_MUTEX_RECURSIVE_NP); +#elif !defined(POCO_VXWORKS) + pthread_mutexattr_settype(&attr, fast ? PTHREAD_MUTEX_NORMAL : PTHREAD_MUTEX_RECURSIVE); +#endif + if (pthread_mutex_init(&_mutex, &attr)) + { + pthread_mutexattr_destroy(&attr); + throw SystemException("cannot create mutex"); + } + pthread_mutexattr_destroy(&attr); +} + + +MutexImpl::~MutexImpl() +{ + pthread_mutex_destroy(&_mutex); +} + + +bool MutexImpl::tryLockImpl(long milliseconds) +{ +#if defined(POCO_HAVE_MUTEX_TIMEOUT) + struct timespec abstime; +#if defined(POCO_HAVE_CLOCK_GETTIME) + clock_gettime(CLOCK_REALTIME, &abstime); + abstime.tv_sec += milliseconds / 1000; + abstime.tv_nsec += (milliseconds % 1000)*1000000; + if (abstime.tv_nsec >= 1000000000) + { + abstime.tv_nsec -= 1000000000; + abstime.tv_sec++; + } +#else + struct timeval tv; + gettimeofday(&tv, NULL); + abstime.tv_sec = tv.tv_sec + milliseconds / 1000; + abstime.tv_nsec = tv.tv_usec*1000 + (milliseconds % 1000)*1000000; + if (abstime.tv_nsec >= 1000000000) + { + abstime.tv_nsec -= 1000000000; + abstime.tv_sec++; + } +#endif + int rc = pthread_mutex_timedlock(&_mutex, &abstime); + if (rc == 0) + return true; + else if (rc == ETIMEDOUT) + return false; + else + throw SystemException("cannot lock mutex"); +#else + const int sleepMillis = 5; + Timestamp now; + Timestamp::TimeDiff diff(Timestamp::TimeDiff(milliseconds)*1000); + do + { + int rc = pthread_mutex_trylock(&_mutex); + if (rc == 0) + return true; + else if (rc != EBUSY) + throw SystemException("cannot lock mutex"); +#if defined(POCO_VXWORKS) + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = sleepMillis*1000000; + nanosleep(&ts, NULL); + +#else + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = sleepMillis * 1000; + select(0, NULL, NULL, NULL, &tv); +#endif + } + while (!now.isElapsed(diff)); + return false; +#endif +} + + +FastMutexImpl::FastMutexImpl(): MutexImpl(true) +{ +} + + +FastMutexImpl::~FastMutexImpl() +{ +} + + +} // namespace Poco |