Path: blob/master/thirdparty/embree/common/sys/condition.cpp
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#include "condition.h"45#if defined(__WIN32__) && !defined(PTHREADS_WIN32)67#define WIN32_LEAN_AND_MEAN8#include <windows.h>910namespace embree11{12struct ConditionImplementation13{14__forceinline ConditionImplementation () {15InitializeConditionVariable(&cond);16}1718__forceinline ~ConditionImplementation () {19}2021__forceinline void wait(MutexSys& mutex_in) {22SleepConditionVariableCS(&cond, (LPCRITICAL_SECTION)mutex_in.mutex, INFINITE);23}2425__forceinline void notify_all() {26WakeAllConditionVariable(&cond);27}2829public:30CONDITION_VARIABLE cond;31};32}33#endif3435#if defined(__UNIX__) || defined(PTHREADS_WIN32)36#include <pthread.h>37namespace embree38{39struct ConditionImplementation40{41__forceinline ConditionImplementation () {42if (pthread_cond_init(&cond,nullptr) != 0)43THROW_RUNTIME_ERROR("pthread_cond_init failed");44}4546__forceinline ~ConditionImplementation() {47MAYBE_UNUSED bool ok = pthread_cond_destroy(&cond) == 0;48assert(ok);49}5051__forceinline void wait(MutexSys& mutex) {52if (pthread_cond_wait(&cond, (pthread_mutex_t*)mutex.mutex) != 0)53THROW_RUNTIME_ERROR("pthread_cond_wait failed");54}5556__forceinline void notify_all() {57if (pthread_cond_broadcast(&cond) != 0)58THROW_RUNTIME_ERROR("pthread_cond_broadcast failed");59}6061public:62pthread_cond_t cond;63};64}65#endif6667namespace embree68{69ConditionSys::ConditionSys () {70cond = new ConditionImplementation;71}7273ConditionSys::~ConditionSys() {74delete (ConditionImplementation*) cond;75}7677void ConditionSys::wait(MutexSys& mutex) {78((ConditionImplementation*) cond)->wait(mutex);79}8081void ConditionSys::notify_all() {82((ConditionImplementation*) cond)->notify_all();83}84}858687