bool AllocationManager_impl::completeAllocations(CF::Device_ptr device, const std::vector<CF::Properties>& allocations) { for (size_t ii = 0; ii < allocations.size(); ++ii) { try { if (device->allocateCapacity(allocations[ii])) { // Allocation succeeded, try next continue; } } CATCH_LOG_WARN(AllocationManager_impl, "Device allocation raised an exception"); // An allocation failed; backtrack and deallocate any prior successes bool warned = false; for (size_t undo = ii; undo > 0; --undo) { try { device->deallocateCapacity(allocations[undo-1]); } catch (...) { if (!warned) { // If a symmetric deallocateCapacity failes, the device is // probably in a bad state; only warn about it once LOG_WARN(AllocationManager_impl, "Device deallocation on cleanup raised an exception"); warned = true; } } } return false; } return true; }
CF::AllocationManager::AllocationResponseSequence* AllocationManager_impl::allocateDevices(const CF::AllocationManager::AllocationRequestSequence &requests, ossie::DeviceList& devices, const std::string& domainName) { LOG_TRACE(AllocationManager_impl, "Servicing " << requests.length() << " allocation request(s)"); CF::AllocationManager::AllocationResponseSequence_var response = new CF::AllocationManager::AllocationResponseSequence(); typedef std::list<ossie::AllocationType*> LocalAllocationList; LocalAllocationList local_allocations; for (unsigned int request_idx=0; request_idx<requests.length(); request_idx++) { const CF::AllocationManager::AllocationRequestType& request = requests[request_idx]; const std::string requestID(request.requestID); LOG_TRACE(AllocationManager_impl, "Allocation request " << requestID << " contains " << request.allocationProperties.length() << " properties"); // Get device identifiers, and ensure that no device references are nil std::vector<std::string> requestedDeviceIDs; for (unsigned int device_idx = 0; device_idx < request.requestedDevices.length(); ++device_idx) { CF::Device_ptr device = request.requestedDevices[device_idx]; if (!CORBA::is_nil(device)) { requestedDeviceIDs.push_back(ossie::corba::returnString(device->identifier())); } } if (requestedDeviceIDs.size() != request.requestedDevices.length()) { // At least one requested device was nil continue; } // If a requested device list was given, skip devices not in list ossie::DeviceList requestedDevices = devices; if (!requestedDeviceIDs.empty()) { for (ossie::DeviceList::iterator node = requestedDevices.begin(); node != requestedDevices.end(); ++node) { if (std::find(requestedDeviceIDs.begin(), requestedDeviceIDs.end(), (*node)->identifier) == requestedDeviceIDs.end()) { node = requestedDevices.erase(node); } } } std::pair<ossie::AllocationType*,ossie::DeviceList::iterator> result = allocateRequest(requestID, request.allocationProperties, requestedDevices, std::vector<std::string>(), std::vector<ossie::SPD::NameVersionPair>(), domainName); if (result.first) { local_allocations.push_back(result.first); ossie::AllocationType* allocation(result.first); const std::string requestID(request.requestID); ossie::corba::push_back(response, ossie::assembleResponse(requestID, allocation->allocationID, allocation->allocationProperties, allocation->allocatedDevice, allocation->allocationDeviceManager)); } } // Update the database boost::recursive_mutex::scoped_lock lock(allocationAccess); for (LocalAllocationList::iterator alloc = local_allocations.begin(); alloc != local_allocations.end(); ++alloc) { this->_allocations[(*alloc)->allocationID] = **alloc; delete *alloc; } if (response->length() != 0) { this->_domainManager->updateLocalAllocations(this->_allocations); } return response._retn(); }
void AggregateDevice_impl::addDevice(CF::Device_ptr associatedDevice) { unsigned int devSeqLength = _devices->length(); for (unsigned int i = 0; i < devSeqLength; i++) { if (!strcmp(associatedDevice->identifier(), (*_devices)[i]->identifier())) { return; } } _devices->length(devSeqLength + 1); (*_devices)[devSeqLength] = CF::Device::_duplicate(associatedDevice); }
void AggregateDevice_impl::removeDevice(CF::Device_ptr associatedDevice) { unsigned int devSeqLength = _devices->length(); for (unsigned int i = 0; i < devSeqLength; i++) { if (!strcmp(associatedDevice->identifier(), (*_devices)[i]->identifier())) { for (unsigned int j = i + 1; j < devSeqLength; i++) { (*_devices)[j-1] = (*_devices)[j]; } _devices->length(devSeqLength - 1); } } return; }