1 // Copyright (C) 2006-2013 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "DeploymentTree.hxx"
21 #include "ComponentInstance.hxx"
22 #include "Container.hxx"
23 #include "Scheduler.hxx"
27 #include "YacsTrace.hxx"
30 using namespace YACS::ENGINE;
32 DeploymentTreeOnHeap::DeploymentTreeOnHeap():_cnt(1)
36 DeploymentTreeOnHeap::~DeploymentTreeOnHeap()
40 bool DeploymentTreeOnHeap::decrRef()
48 void DeploymentTreeOnHeap::incrRef() const
53 unsigned char DeploymentTreeOnHeap::appendTask(Task *task, Scheduler *cloner)
55 DEBTRACE( "DeploymentTreeOnHeap::appendTask: " << task );
57 return DeploymentTree::NULL_TASK;
58 if(!task->isDeployable())//Task not needed to be placed.
59 return DeploymentTree::NOT_DEPLOYABLE_TASK;
60 ComponentInstance *ci=task->getComponent();
61 Container *cont=task->getContainer();
62 DEBTRACE( "DeploymentTreeOnHeap::appendTask component: " << ci );
63 DEBTRACE( "DeploymentTreeOnHeap::appendTask container: " << cont );
64 if(!ci && !cont)//Task is not attached to a Component or a Container -> not needed to be placed.
66 _freePlacableTasks.push_back(pair<Task *,Scheduler *>(task,cloner));
67 return DeploymentTree::DEPLOYABLE_BUT_NOT_SPECIFIED;
69 DEBTRACE( "DeploymentTreeOnHeap::appendTask container: " << cont );
71 // an iterator for Container level
72 vector< vector< vector< pair<Task *, Scheduler *> > > >::iterator iter1;
73 // an iterator for Component instance level
74 vector< vector< pair<Task *, Scheduler * > > >::iterator iter2;
75 // an iterator for a vector of tasks with same container and component instance
76 vector< pair<Task *, Scheduler *> >::iterator iter3;
78 // search an existing vector of tasks with container == cont
79 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
81 Task* task=(*iter1)[0][0].first;
82 if(task->getContainer() == cont)
85 if(iter1==_tree.end())
87 // the vector does not exist : create it
88 DEBTRACE("create a vector of vector of tasks for container " << cont);
89 _tree.push_back(vector< vector< pair< Task *, Scheduler *> > >());
94 // search a vector of tasks with component instance == ci
95 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
96 if(((*iter2)[0]).first->getComponent()==ci)
98 if(iter2==(*iter1).end())
100 // the vector does not exist : create it
101 DEBTRACE("create a vector of tasks for component instance " << ci);
102 (*iter1).push_back(vector< pair< Task *, Scheduler *> >());
103 iter2=(*iter1).end();
107 // search the task in the vector. If it exists return
108 for(iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
109 if((*iter3).first==task)
110 return DeploymentTree::ALREADY_IN_TREE;
112 // if the task is not in the vector add it under condition
113 if(!isConsistentTaskRegardingShCompInst(*iter2,cloner))
114 return DeploymentTree::DUP_TASK_NOT_COMPATIBLE_WITH_EXISTING_TREE;
115 DEBTRACE("add task to vector of tasks " << task);
116 (*iter2).push_back(pair<Task *,Scheduler *>(task,cloner));
117 return DeploymentTree::APPEND_OK;
120 unsigned DeploymentTreeOnHeap::getNumberOfCTDefContainer() const
122 DEBTRACE("getNumberOfCTDefContainer ");
123 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
124 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
125 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
127 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
129 bool isCTDefSurely1=true;
130 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isCTDefSurely1;iter2++)
132 bool isCTDefSurely2=true;
133 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely2;iter3++)
134 if((*iter3).second!=0)
135 isCTDefSurely2=false;
138 else if(((*iter2)[0].first)->getComponent())
139 isCTDefSurely1=(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
141 isCTDefSurely1=false;
143 Container *cont=((*iter1)[0][0].first)->getContainer();
151 if(cont->isAttachedOnCloning())
156 if((*iter1)[0][0].second->isMultiplicitySpecified(val))
163 unsigned DeploymentTreeOnHeap::getNumberOfRTODefContainer() const
165 DEBTRACE("getNumberOfRTODefContainer");
166 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
167 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
168 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
170 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
172 bool isRTODefSurely1=true;
173 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isRTODefSurely1;iter2++)
175 bool isRTODefSurely2=true;
176 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isRTODefSurely2;iter3++)
177 if((*iter3).second==0)
178 isRTODefSurely2=false;
180 if(((*iter2)[0].first)->getComponent())
181 isRTODefSurely1=!(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
183 isRTODefSurely1=false;
185 isRTODefSurely1=false;
188 if(((*iter1)[0][0].first)->getContainer())
189 if(!((*iter1)[0][0].first)->getContainer()->isAttachedOnCloning())
195 unsigned DeploymentTreeOnHeap::getNumberOfCTDefComponentInstances() const
197 DEBTRACE("getNumberOfCTDefComponentInstances");
198 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
199 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
200 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
202 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
203 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
205 bool isCTDefSurely=true;
206 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely;iter3++)
207 if((*iter3).second!=0)
212 if(((*iter2)[0].first)->getComponent() && ((*iter2)[0].first)->getComponent()->isAttachedOnCloning())
218 unsigned DeploymentTreeOnHeap::getNumberOfRTODefComponentInstances() const
220 DEBTRACE("getNumberOfRTODefComponentInstances");
221 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
222 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
223 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
225 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
226 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
229 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && !isRTODef;iter3++)
230 if((*iter3).second!=0)
232 if(isRTODef && ((*iter2)[0].first)->getComponent() && !((*iter2)[0].first)->getComponent()->isAttachedOnCloning())
238 std::vector<Container *> DeploymentTreeOnHeap::getAllContainers() const
240 vector<Container *> ret;
241 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
242 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
244 Task* task=(*iter1)[0][0].first;
245 ret.push_back(task->getContainer());
250 std::vector<Container *> DeploymentTreeOnHeap::getAllCTDefContainers() const
252 DEBTRACE("getAllCTDefContainers");
253 vector<Container *> ret;
254 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
255 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
256 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
257 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
259 bool isCTDefSurely1=true;
260 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isCTDefSurely1;iter2++)
262 bool isCTDefSurely2=true;
263 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely2;iter3++)
264 if((*iter3).second!=0)
265 isCTDefSurely2=false;
268 else if(((*iter2)[0].first)->getComponent())
269 isCTDefSurely1=(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
271 isCTDefSurely1=false;
273 Container *cont=((*iter1)[0][0].first)->getContainer();
281 if(cont->isAttachedOnCloning())
287 std::vector<Container *> DeploymentTreeOnHeap::getAllRTODefContainers() const
289 DEBTRACE("getAllRTODefContainers");
290 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
291 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
292 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
293 vector<Container *> ret;
294 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
296 bool isRTODefSurely1=true;
297 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isRTODefSurely1;iter2++)
299 bool isRTODefSurely2=true;
300 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isRTODefSurely2;iter3++)
301 if((*iter3).second==0)
302 isRTODefSurely2=false;
305 if(((*iter2)[0].first)->getComponent())
306 isRTODefSurely1=!(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
308 isRTODefSurely1=false;
311 isRTODefSurely1=false;
315 Container* cont= (*iter1)[0][0].first->getContainer();
317 if(!cont->isAttachedOnCloning())
324 std::vector<Task *> DeploymentTreeOnHeap::getTasksLinkedToContainer(Container *cont) const
326 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
327 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
328 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
330 std::vector<Task *> ret;
331 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
333 if(((*iter1)[0][0].first)->getContainer()==cont)
334 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
335 if(((*iter2)[0].first)->getComponent()==0)
336 for(iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
337 ret.push_back((*iter3).first);
342 std::vector<Task *> DeploymentTreeOnHeap::getTasksLinkedToComponent(ComponentInstance *comp) const
344 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
345 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
346 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
348 std::vector<Task *> ret;
349 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
350 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
351 if(((*iter2)[0].first)->getComponent()==comp)
352 for(iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
353 ret.push_back((*iter3).first);
357 std::vector<ComponentInstance *> DeploymentTreeOnHeap::getComponentsLinkedToContainer(Container *cont) const
359 DEBTRACE("DeploymentTreeOnHeap::getComponentsLinkedToContainer ");
360 vector<ComponentInstance *> ret;
361 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
362 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
363 //iterate on containers
364 for(iter1=_tree.begin();iter1!=_tree.end();++iter1)
366 //iterate on components
367 for(iter2=(*iter1).begin();iter2!=(*iter1).end();++iter2)
369 ComponentInstance *compo=(*iter2)[0].first->getComponent();
372 //it's a real component, add it if its container is the right one
373 if(compo->getContainer()==cont)
374 ret.push_back(compo);
384 bool DeploymentTreeOnHeap::presenceOfDefaultContainer() const
386 DEBTRACE("presenceOfDefaultContainer");
387 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
388 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
389 if(!((*iter1)[0][0].first)->getContainer())
394 std::vector<Task *> DeploymentTreeOnHeap::getFreeDeployableTasks() const
397 for(vector< pair<Task *,Scheduler *> >::const_iterator iter=_freePlacableTasks.begin();iter!=_freePlacableTasks.end();iter++)
398 ret.push_back((*iter).first);
402 bool DeploymentTreeOnHeap::isConsistentTaskRegardingShCompInst(std::vector< std::pair<Task *, Scheduler * > >& tasksSharingSameCompInst, Scheduler *cloner)
404 vector< std::pair<Task *, Scheduler * > >::const_iterator iter;
405 bool coexistenceOfDifferentSched=false;
406 for(iter=tasksSharingSameCompInst.begin();iter!=tasksSharingSameCompInst.end() && !coexistenceOfDifferentSched;iter++)
408 coexistenceOfDifferentSched=(((*iter).second)!=cloner);
410 if(!coexistenceOfDifferentSched)
412 //In this case the component is duplicated on cloning raising on runtime on different policy (schedulers) than other tasks in tasksSharingSameCompInst
413 if((tasksSharingSameCompInst[0].first)->getComponent())
414 return (tasksSharingSameCompInst[0].first)->getComponent()->isAttachedOnCloning();
416 return (tasksSharingSameCompInst[0].first)->getContainer()->isAttachedOnCloning();
419 DeploymentTree::DeploymentTree():_treeHandle(0)
423 DeploymentTree::~DeploymentTree()
426 _treeHandle->decrRef();
429 DeploymentTree::DeploymentTree(const DeploymentTree& other)
431 _treeHandle=other._treeHandle;
433 _treeHandle->incrRef();
436 const DeploymentTree &DeploymentTree::operator=(const DeploymentTree& other)
439 _treeHandle->decrRef();
440 _treeHandle=other._treeHandle;
442 _treeHandle->incrRef();
446 unsigned char DeploymentTree::appendTask(Task *task, Scheduler *cloner)
449 return _treeHandle->appendTask(task,cloner);
451 return DeploymentTree::NULL_TASK;
452 if(!task->isDeployable())//Task not needed to be placed.
453 return DeploymentTree::NOT_DEPLOYABLE_TASK;
454 _treeHandle=new DeploymentTreeOnHeap;
455 return _treeHandle->appendTask(task,cloner);
459 * Returns number of containers predictably launchable \b without counting default container.
461 unsigned DeploymentTree::getNumberOfCTDefContainer() const
464 return _treeHandle->getNumberOfCTDefContainer();
469 * Returns number of containers unpredictably launchable \b without counting default container.
471 unsigned DeploymentTree::getNumberOfRTODefContainer() const
474 return _treeHandle->getNumberOfRTODefContainer();
478 unsigned DeploymentTree::getNumberOfCTDefComponentInstances() const
481 return _treeHandle->getNumberOfCTDefComponentInstances();
485 unsigned DeploymentTree::getNumberOfRTODefComponentInstances() const
488 return _treeHandle->getNumberOfRTODefComponentInstances();
493 * Returns all containers default included (0).
495 std::vector<Container *> DeploymentTree::getAllContainers() const
498 return _treeHandle->getAllContainers();
499 return vector<Container *>();
503 * Returns containers predictably launchable \b without counting default container.
505 std::vector<Container *> DeploymentTree::getAllCTDefContainers() const
508 return _treeHandle->getAllCTDefContainers();
509 return vector<Container *>();
513 * Returns containers unpredictably launchable \b without counting default container.
515 std::vector<Container *> DeploymentTree::getAllRTODefContainers() const
518 return _treeHandle->getAllRTODefContainers();
519 return vector<Container *>();
522 std::vector<Task *> DeploymentTree::getTasksLinkedToContainer(Container *cont) const
525 return _treeHandle->getTasksLinkedToContainer(cont);
526 return vector<Task *>();
529 std::vector<Task *> DeploymentTree::getTasksLinkedToComponent(ComponentInstance *comp) const
532 return _treeHandle->getTasksLinkedToComponent(comp);
533 return vector<Task *>();
536 std::vector<ComponentInstance *> DeploymentTree::getComponentsLinkedToContainer(Container *cont) const
539 return _treeHandle->getComponentsLinkedToContainer(cont);
540 return vector<ComponentInstance *>();
543 bool DeploymentTree::presenceOfDefaultContainer() const
546 return _treeHandle->presenceOfDefaultContainer();
550 bool DeploymentTree::isNull() const
552 return _treeHandle==0;
555 std::vector<Task *> DeploymentTree::getFreeDeployableTasks() const
558 return _treeHandle->getFreeDeployableTasks();
559 return vector<Task *>();