gloox 1.0
mutex.cpp
00001 /*
00002   Copyright (c) 2007-2009 by Jakob Schroeter <js@camaya.net>
00003   This file is part of the gloox library. http://camaya.net/gloox
00004 
00005   This software is distributed under a license. The full license
00006   agreement can be found in the file LICENSE in this distribution.
00007   This software may not be copied, modified, sold or distributed
00008   other than expressed in the named license agreement.
00009 
00010   This software is distributed without any warranty.
00011 */
00012 
00013 
00014 #include "mutex.h"
00015 
00016 #include "config.h"
00017 
00018 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
00019 # include <windows.h>
00020 #endif
00021 
00022 #ifdef _WIN32_WCE
00023 # include <winbase.h>
00024 #endif
00025 
00026 #ifdef HAVE_PTHREAD
00027 # include <pthread.h>
00028 #endif
00029 
00030 namespace gloox
00031 {
00032 
00033   namespace util
00034   {
00035 
00036     class Mutex::MutexImpl
00037     {
00038       public:
00039         MutexImpl();
00040         ~MutexImpl();
00041         void lock();
00042         bool trylock();
00043         void unlock();
00044       private:
00045         MutexImpl( const MutexImpl& );
00046         MutexImpl& operator=( const MutexImpl& );
00047 
00048 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
00049         CRITICAL_SECTION m_cs;
00050 #elif defined( HAVE_PTHREAD )
00051         pthread_mutex_t m_mutex;
00052 #endif
00053 
00054     };
00055 
00056     Mutex::MutexImpl::MutexImpl()
00057     {
00058 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
00059       InitializeCriticalSection( &m_cs );
00060 #elif defined( HAVE_PTHREAD )
00061       pthread_mutex_init( &m_mutex, 0 );
00062 #endif
00063     }
00064 
00065     Mutex::MutexImpl::~MutexImpl()
00066     {
00067 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
00068       DeleteCriticalSection( &m_cs );
00069 #elif defined( HAVE_PTHREAD )
00070       pthread_mutex_destroy( &m_mutex );
00071 #endif
00072     }
00073 
00074     void Mutex::MutexImpl::lock()
00075     {
00076 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
00077       EnterCriticalSection( &m_cs );
00078 #elif defined( HAVE_PTHREAD )
00079       pthread_mutex_lock( &m_mutex );
00080 #endif
00081     }
00082 
00083     bool Mutex::MutexImpl::trylock()
00084     {
00085 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
00086       return TryEnterCriticalSection( &m_cs ) ? true : false;
00087 #elif defined( HAVE_PTHREAD )
00088       return !( pthread_mutex_trylock( &m_mutex ) );
00089 #else
00090       return true;
00091 #endif
00092     }
00093 
00094     void Mutex::MutexImpl::unlock()
00095     {
00096 #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
00097       LeaveCriticalSection( &m_cs );
00098 #elif defined( HAVE_PTHREAD )
00099       pthread_mutex_unlock( &m_mutex );
00100 #endif
00101     }
00102 
00103     Mutex::Mutex()
00104       : m_mutex( new MutexImpl() )
00105     {
00106     }
00107 
00108     Mutex::~Mutex()
00109     {
00110       delete m_mutex;
00111     }
00112 
00113     void Mutex::lock()
00114     {
00115       m_mutex->lock();
00116     }
00117 
00118     bool Mutex::trylock()
00119     {
00120       return m_mutex->trylock();
00121     }
00122 
00123     void Mutex::unlock()
00124     {
00125       m_mutex->unlock();
00126     }
00127 
00128   }
00129 
00130 }