diff options
author | Marc Laukien <marc@zeroc.com> | 2002-09-22 15:44:10 +0000 |
---|---|---|
committer | Marc Laukien <marc@zeroc.com> | 2002-09-22 15:44:10 +0000 |
commit | f683ef370bcb987a9f96fc5da0793d71e3721d29 (patch) | |
tree | d0ef420f3cab12b8bab3563dbd71618adba704a3 /cpp/src/IceUtil/RecMutex.cpp | |
parent | minor (diff) | |
download | ice-f683ef370bcb987a9f96fc5da0793d71e3721d29.tar.bz2 ice-f683ef370bcb987a9f96fc5da0793d71e3721d29.tar.xz ice-f683ef370bcb987a9f96fc5da0793d71e3721d29.zip |
thread fixes
Diffstat (limited to 'cpp/src/IceUtil/RecMutex.cpp')
-rw-r--r-- | cpp/src/IceUtil/RecMutex.cpp | 336 |
1 files changed, 168 insertions, 168 deletions
diff --git a/cpp/src/IceUtil/RecMutex.cpp b/cpp/src/IceUtil/RecMutex.cpp index 89c11b020d9..2f617b2d51d 100644 --- a/cpp/src/IceUtil/RecMutex.cpp +++ b/cpp/src/IceUtil/RecMutex.cpp @@ -1,168 +1,168 @@ -// ********************************************************************** -// -// Copyright (c) 2001 -// Mutable Realms, Inc. -// Huntsville, AL, USA -// -// All Rights Reserved -// -// ********************************************************************** - -#include <IceUtil/RecMutex.h> -#include <IceUtil/Exception.h> - -using namespace std; - -#ifdef _WIN32 - -IceUtil::RecMutex::RecMutex() : - _count(0) -{ - InitializeCriticalSection(&_mutex); -} - -IceUtil::RecMutex::~RecMutex() -{ - assert(_count == 0); - DeleteCriticalSection(&_mutex); -} - -bool -IceUtil::RecMutex::lock() const -{ - EnterCriticalSection(&_mutex); - if(++_count > 1) - { - LeaveCriticalSection(&_mutex); - return false; - } - return true; -} - -bool -IceUtil::RecMutex::trylock() const -{ - if(!TryEnterCriticalSection(&_mutex)) - { - throw LockedException(__FILE__, __LINE__); - } - if(++_count > 1) - { - LeaveCriticalSection(&_mutex); - return false; - } - return true; -} - -bool -IceUtil::RecMutex::unlock() const -{ - if(--_count == 0) - { - LeaveCriticalSection(&_mutex); - return true; - } - return false; -} - -void -IceUtil::RecMutex::unlock(LockState& state) const -{ - state.count = _count; - _count = 0; - LeaveCriticalSection(&_mutex); -} - -void -IceUtil::RecMutex::lock(LockState& state) const -{ - EnterCriticalSection(&_mutex); - _count = state.count; -} -#else - -IceUtil::RecMutex::RecMutex() : - _count(0) -{ - const pthread_mutexattr_t attr = { PTHREAD_MUTEX_RECURSIVE_NP }; - int rc = pthread_mutex_init(&_mutex, &attr); - if(rc != 0) - { - throw SyscallException(strerror(rc), __FILE__, __LINE__); - } -} - -IceUtil::RecMutex::~RecMutex() -{ - assert(_count == 0); - int rc = 0; - rc = pthread_mutex_destroy(&_mutex); - assert(rc == 0); -} - -bool -IceUtil::RecMutex::lock() const -{ - int rc = pthread_mutex_lock(&_mutex); - if(rc != 0) - { - throw SyscallException(strerror(rc), __FILE__, __LINE__); - } - if(++_count > 1) - { - rc = pthread_mutex_unlock(&_mutex); - assert(rc == 0); - return false; - } - return true; -} - -bool -IceUtil::RecMutex::trylock() const -{ - int rc = pthread_mutex_trylock(&_mutex); - if(rc != 0) - { - if(rc == EBUSY) - { - throw LockedException(__FILE__, __LINE__); - } - throw SyscallException(strerror(rc), __FILE__, __LINE__); - } - if(++_count > 1) - { - rc = pthread_mutex_unlock(&_mutex); - assert(rc == 0); - return false; - } - return true; -} - -bool -IceUtil::RecMutex::unlock() const -{ - if(--_count == 0) - { - int rc = 0; // Prevent warnings when NDEBUG is defined. - rc = pthread_mutex_unlock(&_mutex); - assert(rc == 0); - return true; - } - return false; -} - -void -IceUtil::RecMutex::unlock(LockState& state) const -{ - state.mutex = &_mutex; - state.count = _count; - _count = 0; -} - -void -IceUtil::RecMutex::lock(LockState& state) const -{ - _count = state.count; -} - -#endif +// **********************************************************************
+//
+// Copyright (c) 2001
+// Mutable Realms, Inc.
+// Huntsville, AL, USA
+//
+// All Rights Reserved
+//
+// **********************************************************************
+
+#include <IceUtil/RecMutex.h>
+#include <IceUtil/Exception.h>
+
+using namespace std;
+
+#ifdef _WIN32
+
+IceUtil::RecMutex::RecMutex() :
+ _count(0)
+{
+ InitializeCriticalSection(&_mutex);
+}
+
+IceUtil::RecMutex::~RecMutex()
+{
+ assert(_count == 0);
+ DeleteCriticalSection(&_mutex);
+}
+
+bool
+IceUtil::RecMutex::lock() const
+{
+ EnterCriticalSection(&_mutex);
+ if(++_count > 1)
+ {
+ LeaveCriticalSection(&_mutex);
+ return false;
+ }
+ return true;
+}
+
+bool
+IceUtil::RecMutex::trylock() const
+{
+ if(!TryEnterCriticalSection(&_mutex))
+ {
+ throw ThreadLockedException(__FILE__, __LINE__);
+ }
+ if(++_count > 1)
+ {
+ LeaveCriticalSection(&_mutex);
+ return false;
+ }
+ return true;
+}
+
+bool
+IceUtil::RecMutex::unlock() const
+{
+ if(--_count == 0)
+ {
+ LeaveCriticalSection(&_mutex);
+ return true;
+ }
+ return false;
+}
+
+void
+IceUtil::RecMutex::unlock(LockState& state) const
+{
+ state.count = _count;
+ _count = 0;
+ LeaveCriticalSection(&_mutex);
+}
+
+void
+IceUtil::RecMutex::lock(LockState& state) const
+{
+ EnterCriticalSection(&_mutex);
+ _count = state.count;
+}
+#else
+
+IceUtil::RecMutex::RecMutex() :
+ _count(0)
+{
+ const pthread_mutexattr_t attr = { PTHREAD_MUTEX_RECURSIVE_NP };
+ int rc = pthread_mutex_init(&_mutex, &attr);
+ if(rc != 0)
+ {
+ throw ThreadSyscallException(strerror(rc), __FILE__, __LINE__);
+ }
+}
+
+IceUtil::RecMutex::~RecMutex()
+{
+ assert(_count == 0);
+ int rc = 0;
+ rc = pthread_mutex_destroy(&_mutex);
+ assert(rc == 0);
+}
+
+bool
+IceUtil::RecMutex::lock() const
+{
+ int rc = pthread_mutex_lock(&_mutex);
+ if(rc != 0)
+ {
+ throw ThreadSyscallException(strerror(rc), __FILE__, __LINE__);
+ }
+ if(++_count > 1)
+ {
+ rc = pthread_mutex_unlock(&_mutex);
+ assert(rc == 0);
+ return false;
+ }
+ return true;
+}
+
+bool
+IceUtil::RecMutex::trylock() const
+{
+ int rc = pthread_mutex_trylock(&_mutex);
+ if(rc != 0)
+ {
+ if(rc == EBUSY)
+ {
+ throw ThreadLockedException(__FILE__, __LINE__);
+ }
+ throw ThreadSyscallException(strerror(rc), __FILE__, __LINE__);
+ }
+ if(++_count > 1)
+ {
+ rc = pthread_mutex_unlock(&_mutex);
+ assert(rc == 0);
+ return false;
+ }
+ return true;
+}
+
+bool
+IceUtil::RecMutex::unlock() const
+{
+ if(--_count == 0)
+ {
+ int rc = 0; // Prevent warnings when NDEBUG is defined.
+ rc = pthread_mutex_unlock(&_mutex);
+ assert(rc == 0);
+ return true;
+ }
+ return false;
+}
+
+void
+IceUtil::RecMutex::unlock(LockState& state) const
+{
+ state.mutex = &_mutex;
+ state.count = _count;
+ _count = 0;
+}
+
+void
+IceUtil::RecMutex::lock(LockState& state) const
+{
+ _count = state.count;
+}
+
+#endif
|