10 #define MI_BASE_LOCK_H
17 #ifndef MI_PLATFORM_WINDOWS
21 #include <mi/base/miwindows.h>
123 #ifndef MI_PLATFORM_WINDOWS
125 pthread_mutex_t m_mutex;
128 CRITICAL_SECTION m_critical_section;
217 #ifndef MI_PLATFORM_WINDOWS
219 pthread_mutex_t m_mutex;
222 CRITICAL_SECTION m_critical_section;
226 #ifndef MI_FOR_DOXYGEN_ONLY
230 #ifndef MI_PLATFORM_WINDOWS
231 pthread_mutexattr_t mutex_attributes;
232 pthread_mutexattr_init( &mutex_attributes);
233 pthread_mutexattr_settype( &mutex_attributes, PTHREAD_MUTEX_ERRORCHECK);
234 pthread_mutex_init( &m_mutex, &mutex_attributes);
236 InitializeCriticalSection( &m_critical_section);
243 #ifndef MI_PLATFORM_WINDOWS
244 int result = pthread_mutex_destroy( &m_mutex);
251 DeleteCriticalSection( &m_critical_section);
257 #ifndef MI_PLATFORM_WINDOWS
258 int result = pthread_mutex_lock( &m_mutex);
259 if( result == EDEADLK) {
264 EnterCriticalSection( &m_critical_section);
275 #ifndef MI_PLATFORM_WINDOWS
276 int result = pthread_mutex_trylock( &m_mutex);
279 mi_base_assert( result == 0 || result == EBUSY || result == EDEADLK);
282 BOOL result = TryEnterCriticalSection( &m_critical_section);
286 LeaveCriticalSection( &m_critical_section);
296 #ifndef MI_PLATFORM_WINDOWS
297 int result = pthread_mutex_unlock( &m_mutex);
303 LeaveCriticalSection( &m_critical_section);
337 if( m_lock && m_lock->try_lock())
352 #ifndef MI_PLATFORM_WINDOWS
353 pthread_mutexattr_t mutex_attributes;
354 pthread_mutexattr_init( &mutex_attributes);
355 pthread_mutexattr_settype( &mutex_attributes, PTHREAD_MUTEX_RECURSIVE);
356 pthread_mutex_init( &m_mutex, &mutex_attributes);
358 InitializeCriticalSection( &m_critical_section);
364 #ifndef MI_PLATFORM_WINDOWS
365 int result = pthread_mutex_destroy( &m_mutex);
370 DeleteCriticalSection( &m_critical_section);
376 #ifndef MI_PLATFORM_WINDOWS
377 int result = pthread_mutex_lock( &m_mutex);
382 EnterCriticalSection( &m_critical_section);
388 #ifndef MI_PLATFORM_WINDOWS
389 int result = pthread_mutex_trylock( &m_mutex);
393 BOOL result = TryEnterCriticalSection( &m_critical_section);
400 #ifndef MI_PLATFORM_WINDOWS
401 int result = pthread_mutex_unlock( &m_mutex);
405 LeaveCriticalSection( &m_critical_section);
439 if( m_lock && m_lock->try_lock())
452 #endif // MI_FOR_DOXYGEN_ONLY
460 #endif // MI_BASE_LOCK_H