bool LatencyTestDeviceImpl::SetConfiguration(const OVR::LatencyTestConfiguration& configuration, bool waitFlag) { bool result = false; ThreadCommandQueue* queue = GetManagerImpl()->GetThreadQueue(); if (GetManagerImpl()->GetThreadId() != OVR::GetCurrentThreadId()) { if (!waitFlag) { return queue->PushCall(this, &LatencyTestDeviceImpl::setConfiguration, configuration); } if (!queue->PushCallAndWaitResult( this, &LatencyTestDeviceImpl::setConfiguration, &result, configuration)) { return false; } } else return setConfiguration(configuration); return result; }
void DeviceCommon::DeviceRelease() { while(1) { UInt32 refCount = RefCount; OVR_ASSERT(refCount > 0); if (refCount == 1) { DeviceManagerImpl* manager = pCreateDesc->GetManagerImpl(); ThreadCommandQueue* queue = manager->GetThreadQueue(); // Enqueue ReleaseDevice for {1 -> 0} transition with no wait. // We pass our reference ownership into the queue to destroy. // It's in theory possible for another thread to re-steal our device reference, // but that is checked for atomically in DeviceManagerImpl::ReleaseDevice. if (!queue->PushCall(manager, &DeviceManagerImpl::ReleaseDevice_MgrThread, pCreateDesc->pDevice)) { // PushCall shouldn't fail because background thread runs while manager is // alive and we are holding Manager alive through pParent chain. OVR_ASSERT(false); } // Warning! At his point everything, including manager, may be dead. break; } else if (RefCount.CompareAndSet_NoSync(refCount, refCount-1)) { break; } } }
bool LatencyTestDeviceImpl::SetDisplay(const OVR::LatencyTestDisplay& display, bool waitFlag) { bool result = false; ThreadCommandQueue * queue = GetManagerImpl()->GetThreadQueue(); if (!waitFlag) { return queue->PushCall(this, &LatencyTestDeviceImpl::setDisplay, display); } if (!queue->PushCallAndWaitResult( this, &LatencyTestDeviceImpl::setDisplay, &result, display)) { return false; } return result; }
bool LatencyTestDeviceImpl::SetStartTest(const Color& targetColor, bool waitFlag) { bool result = false; ThreadCommandQueue* queue = GetManagerImpl()->GetThreadQueue(); if (!waitFlag) { return queue->PushCall(this, &LatencyTestDeviceImpl::setStartTest, targetColor); } if (!queue->PushCallAndWaitResult( this, &LatencyTestDeviceImpl::setStartTest, &result, targetColor)) { return false; } return result; }