Open
Graph Drawing
Framework

 v.2012.05
 

CriticalSection.h
Go to the documentation of this file.
00001 /*
00002  * $Revision: 2299 $
00003  * 
00004  * last checkin:
00005  *   $Author: gutwenger $ 
00006  *   $Date: 2012-05-07 15:57:08 +0200 (Mon, 07 May 2012) $ 
00007  ***************************************************************/
00008  
00043 #ifdef _MSC_VER
00044 #pragma once
00045 #endif
00046 
00047 
00048 #ifndef OGDF_CRITICAL_SECTION_H
00049 #define OGDF_CRITICAL_SECTION_H
00050 
00051 #if !defined(OGDF_SYSTEM_WINDOWS)
00052 #include <pthread.h>
00053 #include <errno.h>
00054 #endif
00055 
00056 #include <ogdf/basic/System.h>
00057 
00058 
00059 namespace ogdf {
00060 
00061 #if defined(OGDF_SYSTEM_WINDOWS)
00062 
00064 
00069 class OGDF_EXPORT CriticalSection
00070 {
00071 public:
00073     CriticalSection() {
00074         InitializeCriticalSection(&m_cs);
00075     }
00076 
00078 
00084     explicit CriticalSection(int spinCount) {
00085         InitializeCriticalSectionAndSpinCount(&m_cs, spinCount);
00086     }
00087 
00088     ~CriticalSection() {
00089         DeleteCriticalSection(&m_cs);
00090     }
00091 
00093     void enter() {
00094         EnterCriticalSection(&m_cs);
00095     }
00096 
00098     bool tryEnter() {
00099         return (TryEnterCriticalSection(&m_cs) != 0);
00100     }
00101 
00103     void leave() {
00104         LeaveCriticalSection(&m_cs);
00105     }
00106 
00107 private:
00108     CRITICAL_SECTION m_cs; 
00109 };
00110 
00111 
00112 #else
00113 
00114 class OGDF_EXPORT CriticalSection
00115 {
00116 public:
00117     CriticalSection() : m_spinCount(0) {
00118         pthread_mutex_init(&m_mutex, NULL);
00119     }
00120 
00121     explicit CriticalSection(int spinCount) {
00122         m_spinCount = (System::numberOfProcessors() >= 2) ? spinCount : 0;
00123         int ret = pthread_mutex_init(&m_mutex, NULL);
00124         if(ret != 0)
00125             cout << "initialization of mutex failed: " << ret << endl;
00126     }
00127 
00128     ~CriticalSection() {
00129         pthread_mutex_destroy(&m_mutex);
00130     }
00131 
00132     void enter() {
00133         if(m_spinCount > 0) {
00134             for(int i = m_spinCount; i > 0; --i)
00135                 if(pthread_mutex_trylock(&m_mutex) != EBUSY)
00136                     return;
00137         }
00138         pthread_mutex_lock(&m_mutex);
00139     }
00140 
00141     bool tryEnter() {
00142         return (pthread_mutex_trylock(&m_mutex) != EBUSY);
00143     }
00144 
00145     void leave() {
00146         pthread_mutex_unlock(&m_mutex);
00147     }
00148 
00149 private:
00150     pthread_mutex_t m_mutex;
00151     int             m_spinCount;
00152 };
00153 
00154 #endif
00155 
00156 
00157 } // end namespace ogdf
00158 
00159 
00160 #endif