1 // Copyright (C) 2006-2008 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
19 #include "DeploymentTree.hxx"
20 #include "ComponentInstance.hxx"
21 #include "Container.hxx"
22 #include "Scheduler.hxx"
26 using namespace YACS::ENGINE;
28 DeploymentTreeOnHeap::DeploymentTreeOnHeap():_cnt(1)
32 DeploymentTreeOnHeap::~DeploymentTreeOnHeap()
36 bool DeploymentTreeOnHeap::decrRef()
44 void DeploymentTreeOnHeap::incrRef() const
49 unsigned char DeploymentTreeOnHeap::appendTask(Task *task, Scheduler *cloner)
52 return DeploymentTree::NULL_TASK;
53 if(!task->isDeployable())//Task not needed to be placed.
54 return DeploymentTree::NOT_DEPLOYABLE_TASK;
55 ComponentInstance *ci=task->getComponent();
56 if(!ci)//Task is not attached to a Component -> not needed to be placed.
58 _freePlacableTasks.push_back(pair<Task *,Scheduler *>(task,cloner));
59 return DeploymentTree::DEPLOYABLE_BUT_NOT_SPECIFIED;
61 Container *cont=ci->getContainer();
62 vector< vector< vector< pair<Task *, Scheduler *> > > >::iterator iter1;
63 vector< vector< pair<Task *, Scheduler * > > >::iterator iter2;
64 vector< pair<Task *, Scheduler *> >::iterator iter3;
65 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
66 if(((*iter1)[0][0]).first->getComponent()->getContainer()==cont)
68 if(iter1==_tree.end())
70 _tree.push_back(vector< vector< pair< Task *, Scheduler *> > >());
74 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
75 if(((*iter2)[0]).first->getComponent()==ci)
77 if(iter2==(*iter1).end())
79 (*iter1).push_back(vector< pair< Task *, Scheduler *> >());
83 for(iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
84 if((*iter3).first==task)
85 return DeploymentTree::ALREADY_IN_TREE;
86 if(!isConsistentTaskRegardingShCompInst(*iter2,cloner))
87 return DeploymentTree::DUP_TASK_NOT_COMPATIBLE_WITH_EXISTING_TREE;
88 (*iter2).push_back(pair<Task *,Scheduler *>(task,cloner));
89 return DeploymentTree::APPEND_OK;
92 unsigned DeploymentTreeOnHeap::getNumberOfCTDefContainer() const
94 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
95 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
96 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
98 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
100 bool isCTDefSurely1=true;
101 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isCTDefSurely1;iter2++)
103 bool isCTDefSurely2=true;
104 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely2;iter3++)
105 if((*iter3).second!=0)
106 isCTDefSurely2=false;
110 isCTDefSurely1=(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
112 Container *cont=((*iter1)[0][0].first)->getComponent()->getContainer();
120 if(cont->isAttachedOnCloning())
125 if((*iter1)[0][0].second->isMultiplicitySpecified(val))
132 unsigned DeploymentTreeOnHeap::getNumberOfRTODefContainer() const
134 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
135 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
136 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
138 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
140 bool isRTODefSurely1=true;
141 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isRTODefSurely1;iter2++)
143 bool isRTODefSurely2=true;
144 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isRTODefSurely2;iter3++)
145 if((*iter3).second==0)
146 isRTODefSurely2=false;
148 isRTODefSurely1=!(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
150 isRTODefSurely1=false;
153 if(((*iter1)[0][0].first)->getComponent()->getContainer())
154 if(!((*iter1)[0][0].first)->getComponent()->getContainer()->isAttachedOnCloning())
160 unsigned DeploymentTreeOnHeap::getNumberOfCTDefComponentInstances() const
162 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
163 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
164 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
166 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
167 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
169 bool isCTDefSurely=true;
170 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely;iter3++)
171 if((*iter3).second!=0)
176 if(((*iter2)[0].first)->getComponent()->isAttachedOnCloning())
182 unsigned DeploymentTreeOnHeap::getNumberOfRTODefComponentInstances() const
184 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
185 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
186 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
188 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
189 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
192 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && !isRTODef;iter3++)
193 if((*iter3).second!=0)
195 if(isRTODef && !((*iter2)[0].first)->getComponent()->isAttachedOnCloning())
201 std::vector<Container *> DeploymentTreeOnHeap::getAllContainers() const
203 vector<Container *> ret;
204 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
205 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
206 ret.push_back(((*iter1)[0][0].first)->getComponent()->getContainer());
210 std::vector<Container *> DeploymentTreeOnHeap::getAllCTDefContainers() const
212 vector<Container *> ret;
213 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
214 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
215 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
216 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
218 bool isCTDefSurely1=true;
219 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isCTDefSurely1;iter2++)
221 bool isCTDefSurely2=true;
222 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely2;iter3++)
223 if((*iter3).second!=0)
224 isCTDefSurely2=false;
228 isCTDefSurely1=(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
230 Container *cont=((*iter1)[0][0].first)->getComponent()->getContainer();
238 if(cont->isAttachedOnCloning())
244 std::vector<Container *> DeploymentTreeOnHeap::getAllRTODefContainers() const
246 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
247 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
248 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
249 vector<Container *> ret;
250 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
252 bool isRTODefSurely1=true;
253 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isRTODefSurely1;iter2++)
255 bool isRTODefSurely2=true;
256 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isRTODefSurely2;iter3++)
257 if((*iter3).second==0)
258 isRTODefSurely2=false;
260 isRTODefSurely1=!(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
262 isRTODefSurely1=false;
265 if(((*iter1)[0][0].first)->getComponent()->getContainer())
266 if(!((*iter1)[0][0].first)->getComponent()->getContainer()->isAttachedOnCloning())
267 ret.push_back(((*iter1)[0][0].first)->getComponent()->getContainer());
272 std::vector<Task *> DeploymentTreeOnHeap::getTasksLinkedToComponent(ComponentInstance *comp) const
274 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
275 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
276 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
278 std::vector<Task *> ret;
279 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
280 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
281 if(((*iter2)[0].first)->getComponent()==comp)
282 for(iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
283 ret.push_back((*iter3).first);
287 std::vector<ComponentInstance *> DeploymentTreeOnHeap::getComponentsLinkedToContainer(Container *cont) const
289 vector<ComponentInstance *> ret;
290 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
291 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
292 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
293 if(((*iter1)[0][0].first)->getComponent()->getContainer()==cont)
294 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
295 ret.push_back(((*iter2)[0].first)->getComponent());
299 bool DeploymentTreeOnHeap::presenceOfDefaultContainer() const
301 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
302 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
303 if(!((*iter1)[0][0].first)->getComponent()->getContainer())
308 std::vector<Task *> DeploymentTreeOnHeap::getFreeDeployableTasks() const
311 for(vector< pair<Task *,Scheduler *> >::const_iterator iter=_freePlacableTasks.begin();iter!=_freePlacableTasks.end();iter++)
312 ret.push_back((*iter).first);
316 bool DeploymentTreeOnHeap::isConsistentTaskRegardingShCompInst(std::vector< std::pair<Task *, Scheduler * > >& tasksSharingSameCompInst, Scheduler *cloner)
318 vector< std::pair<Task *, Scheduler * > >::const_iterator iter;
319 bool coexistenceOfDifferentSched=false;
320 for(iter=tasksSharingSameCompInst.begin();iter!=tasksSharingSameCompInst.end() && !coexistenceOfDifferentSched;iter++)
322 coexistenceOfDifferentSched=(((*iter).second)!=cloner);
324 if(!coexistenceOfDifferentSched)
326 //In this case the component is duplicated on cloning raising on runtime on different policy (schedulers) than other tasks in tasksSharingSameCompInst
327 return (tasksSharingSameCompInst[0].first)->getComponent()->isAttachedOnCloning();
330 DeploymentTree::DeploymentTree():_treeHandle(0)
334 DeploymentTree::~DeploymentTree()
337 _treeHandle->decrRef();
340 DeploymentTree::DeploymentTree(const DeploymentTree& other)
342 _treeHandle=other._treeHandle;
344 _treeHandle->incrRef();
347 const DeploymentTree &DeploymentTree::operator=(const DeploymentTree& other)
350 _treeHandle->decrRef();
351 _treeHandle=other._treeHandle;
353 _treeHandle->incrRef();
357 unsigned char DeploymentTree::appendTask(Task *task, Scheduler *cloner)
360 return _treeHandle->appendTask(task,cloner);
362 return DeploymentTree::NULL_TASK;
363 if(!task->isDeployable())//Task not needed to be placed.
364 return DeploymentTree::NOT_DEPLOYABLE_TASK;
365 _treeHandle=new DeploymentTreeOnHeap;
366 return _treeHandle->appendTask(task,cloner);
370 * Returns number of containers predictably launchable \b without counting default container.
372 unsigned DeploymentTree::getNumberOfCTDefContainer() const
375 return _treeHandle->getNumberOfCTDefContainer();
380 * Returns number of containers unpredictably launchable \b without counting default container.
382 unsigned DeploymentTree::getNumberOfRTODefContainer() const
385 return _treeHandle->getNumberOfRTODefContainer();
389 unsigned DeploymentTree::getNumberOfCTDefComponentInstances() const
392 return _treeHandle->getNumberOfCTDefComponentInstances();
396 unsigned DeploymentTree::getNumberOfRTODefComponentInstances() const
399 return _treeHandle->getNumberOfRTODefComponentInstances();
404 * Returns all containers default included (0).
406 std::vector<Container *> DeploymentTree::getAllContainers() const
409 return _treeHandle->getAllContainers();
410 return vector<Container *>();
414 * Returns containers predictably launchable \b without counting default container.
416 std::vector<Container *> DeploymentTree::getAllCTDefContainers() const
419 return _treeHandle->getAllCTDefContainers();
420 return vector<Container *>();
424 * Returns containers unpredictably launchable \b without counting default container.
426 std::vector<Container *> DeploymentTree::getAllRTODefContainers() const
429 return _treeHandle->getAllRTODefContainers();
430 return vector<Container *>();
433 std::vector<Task *> DeploymentTree::getTasksLinkedToComponent(ComponentInstance *comp) const
436 return _treeHandle->getTasksLinkedToComponent(comp);
437 return vector<Task *>();
440 std::vector<ComponentInstance *> DeploymentTree::getComponentsLinkedToContainer(Container *cont) const
443 return _treeHandle->getComponentsLinkedToContainer(cont);
444 return vector<ComponentInstance *>();
447 bool DeploymentTree::presenceOfDefaultContainer() const
450 return _treeHandle->presenceOfDefaultContainer();
454 bool DeploymentTree::isNull() const
456 return _treeHandle==0;
459 std::vector<Task *> DeploymentTree::getFreeDeployableTasks() const
462 return _treeHandle->getFreeDeployableTasks();
463 return vector<Task *>();