/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Code/Engine/Foundation/Platform/Posix/ConditionVariable_Posix.h
71 строка
2 KB
Jan Krassnigg
Remove circular includes in Basics.h (#1318)
04 июн 2024, 22:07
Не верифицирован
04 июн 2024, 22:07
dab7d29
Код
Авторство
О чём код?
#include <Foundation/FoundationInternal.h> EZ_FOUNDATION_INTERNAL_HEADER #include <Foundation/Threading/ConditionVariable.h> #include <Foundation/Time/Time.h> #include <errno.h> #include <pthread.h> #include <sys/time.h> ezConditionVariable::ezConditionVariable() { pthread_cond_init(&m_Data.m_ConditionVariable, nullptr); } ezConditionVariable::~ezConditionVariable() { EZ_ASSERT_DEV(m_iLockCount == 0, "Thread-signal must be unlocked during destruction."); pthread_cond_destroy(&m_Data.m_ConditionVariable); } void ezConditionVariable::SignalOne() { pthread_cond_signal(&m_Data.m_ConditionVariable); } void ezConditionVariable::SignalAll() { pthread_cond_broadcast(&m_Data.m_ConditionVariable); } void ezConditionVariable::UnlockWaitForSignalAndLock() const { EZ_ASSERT_DEV(m_iLockCount > 0, "ezConditionVariable must be locked when calling UnlockWaitForSignalAndLock."); pthread_cond_wait(&m_Data.m_ConditionVariable, &m_Mutex.GetMutexHandle()); } ezConditionVariable::WaitResult ezConditionVariable::UnlockWaitForSignalAndLock(ezTime timeout) const { EZ_ASSERT_DEV(m_iLockCount > 0, "ezConditionVariable must be locked when calling UnlockWaitForSignalAndLock."); // inside the lock --m_iLockCount; timeval now; gettimeofday(&now, nullptr); // pthread_cond_timedwait needs an absolute time value, so compute it from the current time. struct timespec timeToWait; const ezInt64 iNanoSecondsPerSecond = 1000000000LL; const ezInt64 iMicroSecondsPerNanoSecond = 1000LL; ezInt64 endTime = now.tv_sec * iNanoSecondsPerSecond + now.tv_usec * iMicroSecondsPerNanoSecond + static_cast<ezInt64>(timeout.GetNanoseconds()); timeToWait.tv_sec = endTime / iNanoSecondsPerSecond; timeToWait.tv_nsec = endTime % iNanoSecondsPerSecond; if (pthread_cond_timedwait(&m_Data.m_ConditionVariable, &m_Mutex.GetMutexHandle(), &timeToWait) == ETIMEDOUT) { // inside the lock ++m_iLockCount; return WaitResult::Timeout; } // inside the lock ++m_iLockCount; return WaitResult::Signaled; }