Mutex.h
Go to the documentation of this file.
00001 /* -*- C++ -*- */
00002 
00003 /****************************************************************************
00004 ** Copyright (c) 2001-2014
00005 **
00006 ** This file is part of the QuickFIX FIX Engine
00007 **
00008 ** This file may be distributed under the terms of the quickfixengine.org
00009 ** license as defined by quickfixengine.org and appearing in the file
00010 ** LICENSE included in the packaging of this file.
00011 **
00012 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00013 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00014 **
00015 ** See http://www.quickfixengine.org/LICENSE for licensing information.
00016 **
00017 ** Contact ask@quickfixengine.org if any conditions of this licensing are
00018 ** not clear to you.
00019 **
00020 ****************************************************************************/
00021 
00022 #ifndef FIX_MUTEX_H
00023 #define FIX_MUTEX_H
00024 
00025 #include "Utility.h"
00026 
00027 namespace FIX
00028 {
00030 class Mutex
00031 {
00032 public:
00033   Mutex()
00034   {
00035 #ifdef _MSC_VER
00036     InitializeCriticalSection( &m_mutex );
00037 #else
00038     m_count = 0;
00039     m_threadID = 0;
00040     //pthread_mutexattr_t attr;
00041     //pthread_mutexattr_init(&attr);
00042     //pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
00043     //pthread_mutex_init(&m_mutex, &attr);
00044     pthread_mutex_init( &m_mutex, 0 );
00045 #endif
00046   }
00047 
00048   ~Mutex()
00049   {
00050 #ifdef _MSC_VER
00051     DeleteCriticalSection( &m_mutex );
00052 #else
00053     pthread_mutex_destroy( &m_mutex );
00054 #endif
00055   }
00056 
00057   void lock()
00058   {
00059 #ifdef _MSC_VER
00060     EnterCriticalSection( &m_mutex );
00061 #else
00062     if ( m_count && m_threadID == pthread_self() )
00063     { ++m_count; return ; }
00064     pthread_mutex_lock( &m_mutex );
00065     ++m_count;
00066     m_threadID = pthread_self();
00067 #endif
00068   }
00069 
00070   void unlock()
00071   {
00072 #ifdef _MSC_VER
00073     LeaveCriticalSection( &m_mutex );
00074 #else
00075     if ( m_count > 1 )
00076     { m_count--; return ; }
00077     --m_count;
00078     m_threadID = 0;
00079     pthread_mutex_unlock( &m_mutex );
00080 #endif
00081   }
00082 
00083 private:
00084 
00085 #ifdef _MSC_VER
00086   CRITICAL_SECTION m_mutex;
00087 #else
00088   pthread_mutex_t m_mutex;
00089   pthread_t m_threadID;
00090   int m_count;
00091 #endif
00092 };
00093 
00095 class Locker
00096 {
00097 public:
00098   Locker( Mutex& mutex )
00099   : m_mutex( mutex )
00100   {
00101     m_mutex.lock();
00102   }
00103 
00104   ~Locker()
00105   {
00106     m_mutex.unlock();
00107   }
00108 private:
00109   Mutex& m_mutex;
00110 };
00111 
00113 class ReverseLocker
00114 {
00115 public:
00116   ReverseLocker( Mutex& mutex )
00117   : m_mutex( mutex )
00118   {
00119     m_mutex.unlock();
00120   }
00121 
00122   ~ReverseLocker()
00123   {
00124     m_mutex.lock();
00125   }
00126 private:
00127   Mutex& m_mutex;
00128 };
00129 }
00130 
00131 #endif

Generated on Mon Jun 23 2014 23:49:38 for QuickFIX by doxygen 1.7.6.1 written by Dimitri van Heesch, © 1997-2001