| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  | // Copyright 2009-2021 Intel Corporation
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  | // SPDX-License-Identifier: Apache-2.0
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "condition.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(__WIN32__) && !defined(PTHREADS_WIN32)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define WIN32_LEAN_AND_MEAN
 | 
					
						
							|  |  |  | #include <windows.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace embree | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   struct ConditionImplementation | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     __forceinline ConditionImplementation () { | 
					
						
							|  |  |  |       InitializeConditionVariable(&cond); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     __forceinline ~ConditionImplementation () { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     __forceinline void wait(MutexSys& mutex_in) { | 
					
						
							|  |  |  |       SleepConditionVariableCS(&cond, (LPCRITICAL_SECTION)mutex_in.mutex, INFINITE); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     __forceinline void notify_all() { | 
					
						
							|  |  |  |       WakeAllConditionVariable(&cond); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   public: | 
					
						
							|  |  |  |     CONDITION_VARIABLE cond; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(__UNIX__) || defined(PTHREADS_WIN32)
 | 
					
						
							|  |  |  | #include <pthread.h>
 | 
					
						
							|  |  |  | namespace embree | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   struct ConditionImplementation | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     __forceinline ConditionImplementation () {  | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |       if (pthread_cond_init(&cond,nullptr) != 0) | 
					
						
							|  |  |  |         THROW_RUNTIME_ERROR("pthread_cond_init failed"); | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     __forceinline ~ConditionImplementation() {  | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |       MAYBE_UNUSED bool ok = pthread_cond_destroy(&cond) == 0; | 
					
						
							|  |  |  |       assert(ok); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |      | 
					
						
							|  |  |  |     __forceinline void wait(MutexSys& mutex) {  | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |       if (pthread_cond_wait(&cond, (pthread_mutex_t*)mutex.mutex) != 0) | 
					
						
							|  |  |  |         THROW_RUNTIME_ERROR("pthread_cond_wait failed"); | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     __forceinline void notify_all() {  | 
					
						
							| 
									
										
										
										
											2021-05-20 12:49:33 +02:00
										 |  |  |       if (pthread_cond_broadcast(&cond) != 0) | 
					
						
							|  |  |  |         THROW_RUNTIME_ERROR("pthread_cond_broadcast failed"); | 
					
						
							| 
									
										
										
										
											2021-04-20 18:38:09 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |   public: | 
					
						
							|  |  |  |     pthread_cond_t cond; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace embree  | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   ConditionSys::ConditionSys () {  | 
					
						
							|  |  |  |     cond = new ConditionImplementation;  | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ConditionSys::~ConditionSys() {  | 
					
						
							|  |  |  |     delete (ConditionImplementation*) cond; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void ConditionSys::wait(MutexSys& mutex) {  | 
					
						
							|  |  |  |     ((ConditionImplementation*) cond)->wait(mutex); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void ConditionSys::notify_all() {  | 
					
						
							|  |  |  |     ((ConditionImplementation*) cond)->notify_all(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |