1 // Copyright 2009-2021 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 
4 #include "mutex.h"
5 #include "regression.h"
6 
7 #if defined(__WIN32__) && !defined(PTHREADS_WIN32)
8 
9 #define WIN32_LEAN_AND_MEAN
10 #include <windows.h>
11 
12 namespace embree
13 {
MutexSys()14   MutexSys::MutexSys() { mutex = new CRITICAL_SECTION; InitializeCriticalSection((CRITICAL_SECTION*)mutex); }
~MutexSys()15   MutexSys::~MutexSys() { DeleteCriticalSection((CRITICAL_SECTION*)mutex); delete (CRITICAL_SECTION*)mutex; }
lock()16   void MutexSys::lock() { EnterCriticalSection((CRITICAL_SECTION*)mutex); }
try_lock()17   bool MutexSys::try_lock() { return TryEnterCriticalSection((CRITICAL_SECTION*)mutex) != 0; }
unlock()18   void MutexSys::unlock() { LeaveCriticalSection((CRITICAL_SECTION*)mutex); }
19 }
20 #endif
21 
22 #if defined(__UNIX__) || defined(PTHREADS_WIN32)
23 #include <pthread.h>
24 namespace embree
25 {
26   /*! system mutex using pthreads */
MutexSys()27   MutexSys::MutexSys()
28   {
29     mutex = new pthread_mutex_t;
30     if (pthread_mutex_init((pthread_mutex_t*)mutex, nullptr) != 0)
31       THROW_RUNTIME_ERROR("pthread_mutex_init failed");
32   }
33 
~MutexSys()34   MutexSys::~MutexSys()
35   {
36     MAYBE_UNUSED bool ok = pthread_mutex_destroy((pthread_mutex_t*)mutex) == 0;
37     assert(ok);
38     delete (pthread_mutex_t*)mutex;
39   }
40 
lock()41   void MutexSys::lock()
42   {
43     if (pthread_mutex_lock((pthread_mutex_t*)mutex) != 0)
44       THROW_RUNTIME_ERROR("pthread_mutex_lock failed");
45   }
46 
try_lock()47   bool MutexSys::try_lock() {
48     return pthread_mutex_trylock((pthread_mutex_t*)mutex) == 0;
49   }
50 
unlock()51   void MutexSys::unlock()
52   {
53     if (pthread_mutex_unlock((pthread_mutex_t*)mutex) != 0)
54       THROW_RUNTIME_ERROR("pthread_mutex_unlock failed");
55   }
56 };
57 #endif
58