diff options
author | Pierre Ossman <ossman@cendio.se> | 2015-11-12 12:16:08 +0100 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2015-11-27 11:05:03 +0100 |
commit | 687d52c9afa5b2d7c0b677eb3a27b2a550742d11 (patch) | |
tree | 1470b44932475f64763e1d0152699163a9236774 /common/os/Mutex.cxx | |
parent | 1cc323df534c521fe17bf58d1a8501b4ecf8f185 (diff) | |
download | tigervnc-687d52c9afa5b2d7c0b677eb3a27b2a550742d11.tar.gz tigervnc-687d52c9afa5b2d7c0b677eb3a27b2a550742d11.zip |
Add abstraction classes for system thread primitives
Diffstat (limited to 'common/os/Mutex.cxx')
-rw-r--r-- | common/os/Mutex.cxx | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/common/os/Mutex.cxx b/common/os/Mutex.cxx new file mode 100644 index 00000000..fcbd0ac7 --- /dev/null +++ b/common/os/Mutex.cxx @@ -0,0 +1,162 @@ +/* Copyright 2015 Pierre Ossman for Cendio AB + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#ifdef WIN32 +#include <windows.h> +#else +#include <pthread.h> +#endif + +#include <rdr/Exception.h> + +#include <os/Mutex.h> + +using namespace os; + +Mutex::Mutex() +{ +#ifdef WIN32 + systemMutex = new CRITICAL_SECTION; + InitializeCriticalSection((CRITICAL_SECTION*)systemMutex); +#else + int ret; + + systemMutex = new pthread_mutex_t; + ret = pthread_mutex_init((pthread_mutex_t*)systemMutex, NULL); + if (ret != 0) + throw rdr::SystemException("Failed to create mutex", ret); +#endif +} + +Mutex::~Mutex() +{ +#ifdef WIN32 + DeleteCriticalSection((CRITICAL_SECTION*)systemMutex); + delete (CRITICAL_SECTION*)systemMutex; +#else + int ret; + + ret = pthread_mutex_destroy((pthread_mutex_t*)systemMutex); + delete (pthread_mutex_t*)systemMutex; + if (ret != 0) + throw rdr::SystemException("Failed to destroy mutex", ret); +#endif +} + +void Mutex::lock() +{ +#ifdef WIN32 + EnterCriticalSection((CRITICAL_SECTION*)systemMutex); +#else + int ret; + + ret = pthread_mutex_lock((pthread_mutex_t*)systemMutex); + if (ret != 0) + throw rdr::SystemException("Failed to lock mutex", ret); +#endif +} + +void Mutex::unlock() +{ +#ifdef WIN32 + LeaveCriticalSection((CRITICAL_SECTION*)systemMutex); +#else + int ret; + + ret = pthread_mutex_unlock((pthread_mutex_t*)systemMutex); + if (ret != 0) + throw rdr::SystemException("Failed to unlock mutex", ret); +#endif +} + +Condition::Condition(Mutex* mutex) +{ + this->mutex = mutex; + +#ifdef WIN32 + systemCondition = new CONDITION_VARIABLE; + InitializeConditionVariable((CONDITION_VARIABLE*)systemCondition); +#else + int ret; + + systemCondition = new pthread_cond_t; + ret = pthread_cond_init((pthread_cond_t*)systemCondition, NULL); + if (ret != 0) + throw rdr::SystemException("Failed to create condition variable", ret); +#endif +} + +Condition::~Condition() +{ +#ifdef WIN32 + delete (CONDITION_VARIABLE*)systemCondition; +#else + int ret; + + ret = pthread_cond_destroy((pthread_cond_t*)systemCondition); + delete (pthread_cond_t*)systemCondition; + if (ret != 0) + throw rdr::SystemException("Failed to destroy condition variable", ret); +#endif +} + +void Condition::wait() +{ +#ifdef WIN32 + BOOL ret; + + ret = SleepConditionVariableCS((CONDITION_VARIABLE*)systemCondition, + (CRITICAL_SECTION*)mutex->systemMutex, + INFINITE); + if (!ret) + throw rdr::SystemException("Failed to wait on condition variable", GetLastError()); +#else + int ret; + + ret = pthread_cond_wait((pthread_cond_t*)systemCondition, + (pthread_mutex_t*)mutex->systemMutex); + if (ret != 0) + throw rdr::SystemException("Failed to wait on condition variable", ret); +#endif +} + +void Condition::signal() +{ +#ifdef WIN32 + WakeConditionVariable((CONDITION_VARIABLE*)systemCondition); +#else + int ret; + + ret = pthread_cond_signal((pthread_cond_t*)systemCondition); + if (ret != 0) + throw rdr::SystemException("Failed to signal condition variable", ret); +#endif +} + +void Condition::broadcast() +{ +#ifdef WIN32 + WakeAllConditionVariable((CONDITION_VARIABLE*)systemCondition); +#else + int ret; + + ret = pthread_cond_broadcast((pthread_cond_t*)systemCondition); + if (ret != 0) + throw rdr::SystemException("Failed to broadcast condition variable", ret); +#endif +} |