1 // Copyright (C) 2006-2015 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, or (at your option) any later version.
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 DEBTRACE("add task to vector of tasks " << task);
113 (*iter2).push_back(pair<Task *,Scheduler *>(task,cloner));
114 return DeploymentTree::APPEND_OK;
117 unsigned DeploymentTreeOnHeap::getNumberOfCTDefContainer() const
119 DEBTRACE("getNumberOfCTDefContainer ");
120 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
121 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
122 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
124 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
126 bool isCTDefSurely1=true;
127 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isCTDefSurely1;iter2++)
129 bool isCTDefSurely2=true;
130 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely2;iter3++)
131 if((*iter3).second!=0)
132 isCTDefSurely2=false;
135 else if(((*iter2)[0].first)->getComponent())
136 isCTDefSurely1=(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
138 isCTDefSurely1=false;
140 Container *cont=((*iter1)[0][0].first)->getContainer();
148 if(cont->isAttachedOnCloning())
153 if((*iter1)[0][0].second->isMultiplicitySpecified(val))
160 unsigned DeploymentTreeOnHeap::getNumberOfRTODefContainer() const
162 DEBTRACE("getNumberOfRTODefContainer");
163 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
164 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
165 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
167 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
169 bool isRTODefSurely1=true;
170 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isRTODefSurely1;iter2++)
172 bool isRTODefSurely2=true;
173 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isRTODefSurely2;iter3++)
174 if((*iter3).second==0)
175 isRTODefSurely2=false;
177 if(((*iter2)[0].first)->getComponent())
178 isRTODefSurely1=!(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
180 isRTODefSurely1=false;
182 isRTODefSurely1=false;
185 if(((*iter1)[0][0].first)->getContainer())
186 if(!((*iter1)[0][0].first)->getContainer()->isAttachedOnCloning())
192 unsigned DeploymentTreeOnHeap::getNumberOfCTDefComponentInstances() const
194 DEBTRACE("getNumberOfCTDefComponentInstances");
195 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
196 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
197 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
199 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
200 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
202 bool isCTDefSurely=true;
203 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely;iter3++)
204 if((*iter3).second!=0)
209 if(((*iter2)[0].first)->getComponent() && ((*iter2)[0].first)->getComponent()->isAttachedOnCloning())
215 unsigned DeploymentTreeOnHeap::getNumberOfRTODefComponentInstances() const
217 DEBTRACE("getNumberOfRTODefComponentInstances");
218 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
219 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
220 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
222 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
223 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
226 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && !isRTODef;iter3++)
227 if((*iter3).second!=0)
229 if(isRTODef && ((*iter2)[0].first)->getComponent() && !((*iter2)[0].first)->getComponent()->isAttachedOnCloning())
235 std::vector<Container *> DeploymentTreeOnHeap::getAllContainers() const
237 vector<Container *> ret;
238 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
239 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
241 Task* task=(*iter1)[0][0].first;
242 ret.push_back(task->getContainer());
247 std::vector<Container *> DeploymentTreeOnHeap::getAllCTDefContainers() const
249 DEBTRACE("getAllCTDefContainers");
250 vector<Container *> ret;
251 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
252 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
253 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
254 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
256 bool isCTDefSurely1=true;
257 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isCTDefSurely1;iter2++)
259 bool isCTDefSurely2=true;
260 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely2;iter3++)
261 if((*iter3).second!=0)
262 isCTDefSurely2=false;
265 else if(((*iter2)[0].first)->getComponent())
266 isCTDefSurely1=(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
268 isCTDefSurely1=false;
270 Container *cont=((*iter1)[0][0].first)->getContainer();
278 if(cont->isAttachedOnCloning())
284 std::vector<Container *> DeploymentTreeOnHeap::getAllRTODefContainers() const
286 DEBTRACE("getAllRTODefContainers");
287 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
288 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
289 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
290 vector<Container *> ret;
291 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
293 bool isRTODefSurely1=true;
294 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isRTODefSurely1;iter2++)
296 bool isRTODefSurely2=true;
297 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isRTODefSurely2;iter3++)
298 if((*iter3).second==0)
299 isRTODefSurely2=false;
302 if(((*iter2)[0].first)->getComponent())
303 isRTODefSurely1=!(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
305 isRTODefSurely1=false;
308 isRTODefSurely1=false;
312 Container* cont= (*iter1)[0][0].first->getContainer();
314 if(!cont->isAttachedOnCloning())
321 std::vector<Task *> DeploymentTreeOnHeap::getTasksLinkedToContainer(Container *cont) const
323 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
324 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
325 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
327 std::vector<Task *> ret;
328 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
330 if(((*iter1)[0][0].first)->getContainer()==cont)
331 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
332 if(((*iter2)[0].first)->getComponent()==0)
333 for(iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
334 ret.push_back((*iter3).first);
339 std::vector<Task *> DeploymentTreeOnHeap::getTasksLinkedToComponent(ComponentInstance *comp) const
341 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
342 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
343 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
345 std::vector<Task *> ret;
346 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
347 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
348 if(((*iter2)[0].first)->getComponent()==comp)
349 for(iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
350 ret.push_back((*iter3).first);
354 std::vector<ComponentInstance *> DeploymentTreeOnHeap::getComponentsLinkedToContainer(Container *cont) const
356 DEBTRACE("DeploymentTreeOnHeap::getComponentsLinkedToContainer ");
357 vector<ComponentInstance *> ret;
358 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
359 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
360 //iterate on containers
361 for(iter1=_tree.begin();iter1!=_tree.end();++iter1)
363 //iterate on components
364 for(iter2=(*iter1).begin();iter2!=(*iter1).end();++iter2)
366 ComponentInstance *compo=(*iter2)[0].first->getComponent();
369 //it's a real component, add it if its container is the right one
370 if(compo->getContainer()==cont)
371 ret.push_back(compo);
381 bool DeploymentTreeOnHeap::presenceOfDefaultContainer() const
383 DEBTRACE("presenceOfDefaultContainer");
384 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
385 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
386 if(!((*iter1)[0][0].first)->getContainer())
391 std::vector<Task *> DeploymentTreeOnHeap::getFreeDeployableTasks() const
394 for(vector< pair<Task *,Scheduler *> >::const_iterator iter=_freePlacableTasks.begin();iter!=_freePlacableTasks.end();iter++)
395 ret.push_back((*iter).first);
399 DeploymentTree::DeploymentTree():_treeHandle(0)
403 DeploymentTree::~DeploymentTree()
406 _treeHandle->decrRef();
409 DeploymentTree::DeploymentTree(const DeploymentTree& other)
411 _treeHandle=other._treeHandle;
413 _treeHandle->incrRef();
416 const DeploymentTree &DeploymentTree::operator=(const DeploymentTree& other)
419 _treeHandle->decrRef();
420 _treeHandle=other._treeHandle;
422 _treeHandle->incrRef();
426 unsigned char DeploymentTree::appendTask(Task *task, Scheduler *cloner)
429 return _treeHandle->appendTask(task,cloner);
431 return DeploymentTree::NULL_TASK;
432 if(!task->isDeployable())//Task not needed to be placed.
433 return DeploymentTree::NOT_DEPLOYABLE_TASK;
434 _treeHandle=new DeploymentTreeOnHeap;
435 return _treeHandle->appendTask(task,cloner);
439 * Returns number of containers predictably launchable \b without counting default container.
441 unsigned DeploymentTree::getNumberOfCTDefContainer() const
444 return _treeHandle->getNumberOfCTDefContainer();
449 * Returns number of containers unpredictably launchable \b without counting default container.
451 unsigned DeploymentTree::getNumberOfRTODefContainer() const
454 return _treeHandle->getNumberOfRTODefContainer();
458 unsigned DeploymentTree::getNumberOfCTDefComponentInstances() const
461 return _treeHandle->getNumberOfCTDefComponentInstances();
465 unsigned DeploymentTree::getNumberOfRTODefComponentInstances() const
468 return _treeHandle->getNumberOfRTODefComponentInstances();
473 * Returns all containers default included (0).
475 std::vector<Container *> DeploymentTree::getAllContainers() const
478 return _treeHandle->getAllContainers();
479 return vector<Container *>();
483 * Returns containers predictably launchable \b without counting default container.
485 std::vector<Container *> DeploymentTree::getAllCTDefContainers() const
488 return _treeHandle->getAllCTDefContainers();
489 return vector<Container *>();
493 * Returns containers unpredictably launchable \b without counting default container.
495 std::vector<Container *> DeploymentTree::getAllRTODefContainers() const
498 return _treeHandle->getAllRTODefContainers();
499 return vector<Container *>();
502 std::vector<Task *> DeploymentTree::getTasksLinkedToContainer(Container *cont) const
505 return _treeHandle->getTasksLinkedToContainer(cont);
506 return vector<Task *>();
509 std::vector<Task *> DeploymentTree::getTasksLinkedToComponent(ComponentInstance *comp) const
512 return _treeHandle->getTasksLinkedToComponent(comp);
513 return vector<Task *>();
516 std::vector<ComponentInstance *> DeploymentTree::getComponentsLinkedToContainer(Container *cont) const
519 return _treeHandle->getComponentsLinkedToContainer(cont);
520 return vector<ComponentInstance *>();
523 bool DeploymentTree::presenceOfDefaultContainer() const
526 return _treeHandle->presenceOfDefaultContainer();
530 bool DeploymentTree::isNull() const
532 return _treeHandle==0;
535 std::vector<Task *> DeploymentTree::getFreeDeployableTasks() const
538 return _treeHandle->getFreeDeployableTasks();
539 return vector<Task *>();