Go to the documentation of this file.00001
00002
00003
00004
00005
00006
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 }
00158
00159
00160 #endif