UtiLite  0.3.1
A lite utilities library
include/utilite/UMutex.h
00001 /*
00002 *  utilite is a cross-platform library with
00003 *  useful utilities for fast and small developing.
00004 *  Copyright (C) 2010  Mathieu Labbe
00005 *
00006 *  utilite is free library: you can redistribute it and/or modify
00007 *  it under the terms of the GNU Lesser General Public License as published by
00008 *  the Free Software Foundation, either version 3 of the License, or
00009 *  (at your option) any later version.
00010 *
00011 *  utilite is distributed in the hope that it will be useful,
00012 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 *  GNU Lesser General Public License for more details.
00015 *
00016 *  You should have received a copy of the GNU Lesser General Public License
00017 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
00018 */
00019 
00020 #ifndef UMUTEX_H
00021 #define UMUTEX_H
00022 
00023 #include <errno.h>
00024 
00025 #ifdef WIN32
00026   #include "utilite/Win32/UWin32.h"
00027 #else
00028   #include <pthread.h>
00029 #endif
00030 
00031 
00054 class UMutex
00055 {
00056 
00057 public:
00058 
00062         UMutex()
00063         {
00064 #ifdef WIN32
00065                 InitializeCriticalSection(&C);
00066 #else
00067                 pthread_mutexattr_t attr;
00068                 pthread_mutexattr_init(&attr);
00069                 pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE);
00070                 pthread_mutex_init(&M,&attr);
00071                 pthread_mutexattr_destroy(&attr);
00072 #endif
00073         }
00074 
00075         virtual ~UMutex()
00076         {
00077 #ifdef WIN32
00078                 DeleteCriticalSection(&C);
00079 #else
00080                 pthread_mutex_unlock(&M); pthread_mutex_destroy(&M);
00081 #endif
00082         }
00083 
00087         int lock() const
00088         {
00089 #ifdef WIN32
00090                 EnterCriticalSection(&C); return 0;
00091 #else
00092                 return pthread_mutex_lock(&M);
00093 #endif
00094         }
00095 
00096 #ifdef WIN32
00097         #if(_WIN32_WINNT >= 0x0400)
00098         int lockTry() const
00099         {
00100                 return (TryEnterCriticalSection(&C)?0:EBUSY);
00101         }
00102         #endif
00103 #else
00104         int lockTry() const
00105         {
00106                 return pthread_mutex_trylock(&M);
00107         }
00108 #endif
00109 
00113         int unlock() const
00114         {
00115 #ifdef WIN32
00116                 LeaveCriticalSection(&C); return 0;
00117 #else
00118                 return pthread_mutex_unlock(&M);
00119 #endif
00120         }
00121 
00122         private:
00123 #ifdef WIN32
00124                 mutable CRITICAL_SECTION C;
00125 #else
00126                 mutable pthread_mutex_t M;
00127 #endif
00128                 void operator=(UMutex &M) {}
00129                 UMutex( const UMutex &M ) {}
00130 };
00131 
00157 class UScopeMutex
00158 {
00159 public:
00160         UScopeMutex(const UMutex & mutex) :
00161                 mutex_(mutex)
00162         {
00163                 mutex_.lock();
00164         }
00165         // backward compatibility
00166         UScopeMutex(UMutex * mutex) :
00167                 mutex_(*mutex)
00168         {
00169                 mutex_.lock();
00170         }
00171         ~UScopeMutex()
00172         {
00173                 mutex_.unlock();
00174         }
00175 private:
00176         const UMutex & mutex_;
00177 };
00178 
00179 #endif // UMUTEX_H
 All Classes Files Functions Variables Enumerations Friends Defines