#include "pool_node.hpp" #include "cxios.hpp" #include "thread_manager.hpp" #include namespace xios { CPoolNode::CPoolNode(void) : CObjectTemplate(), CPoolNodeAttributes() { setVirtualServiceNodeGroup(CServiceNodeGroup::create(getId() + "_virtual_service_node_group")); } CPoolNode::CPoolNode(const StdString & id) : CObjectTemplate(id), CPoolNodeAttributes() { setVirtualServiceNodeGroup(CServiceNodeGroup::create(getId() + "_virtual_service_node_group")); } CPoolNode::~CPoolNode(void) { /* Ne rien faire de plus */ } void CPoolNode::parse(xml::CXMLNode & node) { SuperClass::parse(node); if (node.goToChildElement()) { do { if (node.getElementName()=="service" || node.getElementName()=="service_group") this->getVirtualServiceNodeGroup()->parseChild(node); } while (node.goToNextElement()); node.goToParentElement(); } } void CPoolNode::allocateRessources(void) { int nonEmpty=0 ; if (!nprocs.isEmpty()) nonEmpty++ ; if (!global_fraction.isEmpty()) nonEmpty++ ; if (!remain_fraction.isEmpty()) nonEmpty++ ; if (!remain.isEmpty()) nonEmpty++ ; if (nonEmpty==0) ERROR("void CPoolNode::allocateRessources(void)",<<"A number a ressource for allocate pool must be specified." <<"At least attributes, or or or must be specified") else if (nonEmpty>1) ERROR("void CPoolNode::allocateRessources(void)",<<"Only one of these attributes : or " <<" or or must be specified to determine allocated ressouces." <<" More than one is currently specified") auto ressourcesManager=CXios::getRessourcesManager() ; int nbRessources ; int globalRessources = ressourcesManager->getRessourcesSize() ; int freeRessources = ressourcesManager->getFreeRessourcesSize() ; if (!nprocs.isEmpty()) nbRessources = nprocs ; if (!global_fraction.isEmpty()) nbRessources = std::round(globalRessources * global_fraction) ; if (!remain_fraction.isEmpty()) nbRessources = std::round(freeRessources * remain_fraction) ; if (!remain.isEmpty()) nbRessources = freeRessources ; if (nbRessources>freeRessources) ERROR("void CPoolNode::allocateRessources(void)",<<"Cannot allocate required ressources for the pool." <<" Required is : "< or must be specified") ressourcesManager->createPool(poolId, nbRessources) ; if (CThreadManager::isUsingThreads()) while(!ressourcesManager->hasPool(poolId)) { CXios::getDaemonsManager()->eventLoop() ; CThreadManager::yield() ; } else ressourcesManager->waitPoolRegistration(poolId) ; auto services=this->getAllServiceNodes() ; for(auto& service : services) service->allocateRessources(poolId) ; } }