void DeviceManagerImpl::Shutdown() { // Remove all device descriptors from list while the lock is held. // Some descriptors may survive longer due to handles. while(!Devices.IsEmpty()) { DeviceCreateDesc* devDesc = Devices.GetFirst(); OVR_ASSERT(!devDesc->pDevice); // Manager shouldn't be dying while Device exists. devDesc->Enumerated = false; devDesc->RemoveNode(); devDesc->pNext = devDesc->pPrev = 0; if (devDesc->HandleCount == 0) { delete devDesc; } } Devices.Clear(); // These must've been cleared by caller. OVR_ASSERT(pCreateDesc->pDevice == 0); OVR_ASSERT(pCreateDesc->pLock->pManager == 0); pProfileManager.Clear(); }
virtual void Visit(const DeviceCreateDesc& createDesc) { DeviceCreateDesc* devDesc; // If found, mark as enumerated and we are done. DeviceCreateDesc* descCandidate = 0; for(devDesc = pManager->Devices.GetFirst(); !pManager->Devices.IsNull(devDesc); devDesc = devDesc->pNext) { DeviceCreateDesc::MatchResult mr = devDesc->MatchDevice(createDesc, &descCandidate); if (mr == DeviceCreateDesc::Match_Found) { devDesc->Enumerated = true; return; } } // Update candidate (this may involve writing fields to HMDDevice createDesc). if (descCandidate && descCandidate->UpdateMatchedCandidate(createDesc)) { descCandidate->Enumerated = true; return; } // If not found, add new device. // - This stores a new descriptor with // {pDevice = 0, HandleCount = 1, Enumerated = true} DeviceCreateDesc* desc = createDesc.Clone(); desc->pLock = pManager->pCreateDesc->pLock; pManager->Devices.PushBack(desc); pManager->CallOnDeviceAdded(desc); }
bool DeviceHandle::enumerateNext(const DeviceEnumerationArgs& args) { if (GetType() == Device_None) return false; Ptr<DeviceManagerImpl> managerKeepAlive; Lock::Locker lockScope(pImpl->GetLock()); DeviceCreateDesc* next = pImpl; // If manager was destroyed, we get removed from the list. if (!pImpl->pNext) return false; managerKeepAlive = next->GetManagerImpl(); OVR_ASSERT(managerKeepAlive); do { next = next->pNext; if (managerKeepAlive->Devices.IsNull(next)) { pImpl->Release(); pImpl = 0; return false; } } while(!args.MatchRule(next->Type, next->Enumerated)); next->AddRef(); pImpl->Release(); pImpl = next; return true; }
Ptr<DeviceCreateDesc> DeviceManagerImpl::FindHIDDevice(const HIDDeviceDesc& hidDevDesc) { Lock::Locker deviceLock(GetLock()); DeviceCreateDesc* devDesc; for (devDesc = Devices.GetFirst(); !Devices.IsNull(devDesc); devDesc = devDesc->pNext) { if (devDesc->MatchHIDDevice(hidDevDesc)) return devDesc; } return NULL; }
Ptr<DeviceCreateDesc> DeviceManagerImpl::FindDevice( const String& path, DeviceType deviceType) { Lock::Locker deviceLock(GetLock()); DeviceCreateDesc* devDesc; for (devDesc = Devices.GetFirst(); !Devices.IsNull(devDesc); devDesc = devDesc->pNext) { if ((deviceType == Device_None || deviceType == devDesc->Type) && devDesc->MatchDevice(path)) return devDesc; } return NULL; }
Ptr<DeviceCreateDesc> DeviceManagerImpl::AddDevice_NeedsLock( const DeviceCreateDesc& createDesc) { // If found, mark as enumerated and we are done. DeviceCreateDesc* descCandidate = 0; for(DeviceCreateDesc* devDesc = Devices.GetFirst(); !Devices.IsNull(devDesc); devDesc = devDesc->pNext) { DeviceCreateDesc::MatchResult mr = devDesc->MatchDevice(createDesc, &descCandidate); if (mr == DeviceCreateDesc::Match_Found) { devDesc->Enumerated = true; if (!devDesc->pDevice) CallOnDeviceAdded(devDesc); return devDesc; } } // Update candidate (this may involve writing fields to HMDDevice createDesc). if (descCandidate) { bool newDevice = false; if (descCandidate->UpdateMatchedCandidate(createDesc, &newDevice)) { descCandidate->Enumerated = true; if (!descCandidate->pDevice || newDevice) CallOnDeviceAdded(descCandidate); return descCandidate; } } // If not found, add new device. // - This stores a new descriptor with // {pDevice = 0, HandleCount = 1, Enumerated = true} DeviceCreateDesc* desc = createDesc.Clone(); desc->pLock = pCreateDesc->pLock; Devices.PushBack(desc); desc->Enumerated = true; CallOnDeviceAdded(desc); return desc; }
Ptr<DeviceCreateDesc> DeviceManagerImpl::FindHIDDevice(const HIDDeviceDesc& hidDevDesc, bool created) { Lock::Locker deviceLock(GetLock()); DeviceCreateDesc* devDesc; for (devDesc = Devices.GetFirst(); !Devices.IsNull(devDesc); devDesc = devDesc->pNext) { if (created) { // Search for matching device that is created if (devDesc->MatchHIDDevice(hidDevDesc) && devDesc->pDevice) return devDesc; } else { // Search for any matching device if (devDesc->MatchHIDDevice(hidDevDesc)) return devDesc; } } return NULL; }