1 #include "DeploymentTree.hxx"
2 #include "ComponentInstance.hxx"
3 #include "Container.hxx"
4 #include "Scheduler.hxx"
8 using namespace YACS::ENGINE;
10 DeploymentTreeOnHeap::DeploymentTreeOnHeap():_cnt(1)
14 DeploymentTreeOnHeap::~DeploymentTreeOnHeap()
18 bool DeploymentTreeOnHeap::decrRef()
26 void DeploymentTreeOnHeap::incrRef() const
31 unsigned char DeploymentTreeOnHeap::appendTask(Task *task, Scheduler *cloner)
34 return DeploymentTree::NULL_TASK;
35 if(!task->isDeployable())//Task not needed to be placed.
36 return DeploymentTree::NOT_DEPLOYABLE_TASK;
37 ComponentInstance *ci=task->getComponent();
38 if(!ci)//Task is not attached to a Component -> not needed to be placed.
40 _freePlacableTasks.push_back(pair<Task *,Scheduler *>(task,cloner));
41 return DeploymentTree::DEPLOYABLE_BUT_NOT_SPECIFIED;
43 Container *cont=ci->getContainer();
44 vector< vector< vector< pair<Task *, Scheduler *> > > >::iterator iter1;
45 vector< vector< pair<Task *, Scheduler * > > >::iterator iter2;
46 vector< pair<Task *, Scheduler *> >::iterator iter3;
47 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
48 if(((*iter1)[0][0]).first->getComponent()->getContainer()==cont)
50 if(iter1==_tree.end())
52 _tree.push_back(vector< vector< pair< Task *, Scheduler *> > >());
56 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
57 if(((*iter2)[0]).first->getComponent()==ci)
59 if(iter2==(*iter1).end())
61 (*iter1).push_back(vector< pair< Task *, Scheduler *> >());
65 for(iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
66 if((*iter3).first==task)
67 return DeploymentTree::ALREADY_IN_TREE;
68 if(!isConsistentTaskRegardingShCompInst(*iter2,cloner))
69 return DeploymentTree::DUP_TASK_NOT_COMPATIBLE_WITH_EXISTING_TREE;
70 (*iter2).push_back(pair<Task *,Scheduler *>(task,cloner));
71 return DeploymentTree::APPEND_OK;
74 unsigned DeploymentTreeOnHeap::getNumberOfCTDefContainer() const
76 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
77 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
78 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
80 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
82 bool isCTDefSurely1=true;
83 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isCTDefSurely1;iter2++)
85 bool isCTDefSurely2=true;
86 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely2;iter3++)
87 if((*iter3).second!=0)
92 isCTDefSurely1=(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
94 Container *cont=((*iter1)[0][0].first)->getComponent()->getContainer();
102 if(cont->isAttachedOnCloning())
107 if((*iter1)[0][0].second->isMultiplicitySpecified(val))
114 unsigned DeploymentTreeOnHeap::getNumberOfRTODefContainer() const
116 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
117 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
118 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
120 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
122 bool isRTODefSurely1=true;
123 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isRTODefSurely1;iter2++)
125 bool isRTODefSurely2=true;
126 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isRTODefSurely2;iter3++)
127 if((*iter3).second==0)
128 isRTODefSurely2=false;
130 isRTODefSurely1=!(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
132 isRTODefSurely1=false;
135 if(((*iter1)[0][0].first)->getComponent()->getContainer())
136 if(!((*iter1)[0][0].first)->getComponent()->getContainer()->isAttachedOnCloning())
142 unsigned DeploymentTreeOnHeap::getNumberOfCTDefComponentInstances() const
144 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
145 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
146 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
148 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
149 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
151 bool isCTDefSurely=true;
152 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely;iter3++)
153 if((*iter3).second!=0)
158 if(((*iter2)[0].first)->getComponent()->isAttachedOnCloning())
164 unsigned DeploymentTreeOnHeap::getNumberOfRTODefComponentInstances() const
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++)
171 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
174 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && !isRTODef;iter3++)
175 if((*iter3).second!=0)
177 if(isRTODef && !((*iter2)[0].first)->getComponent()->isAttachedOnCloning())
183 std::vector<Container *> DeploymentTreeOnHeap::getAllContainers() const
185 vector<Container *> ret;
186 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
187 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
188 ret.push_back(((*iter1)[0][0].first)->getComponent()->getContainer());
192 std::vector<Container *> DeploymentTreeOnHeap::getAllCTDefContainers() const
194 vector<Container *> ret;
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;
198 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
200 bool isCTDefSurely1=true;
201 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isCTDefSurely1;iter2++)
203 bool isCTDefSurely2=true;
204 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isCTDefSurely2;iter3++)
205 if((*iter3).second!=0)
206 isCTDefSurely2=false;
210 isCTDefSurely1=(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
212 Container *cont=((*iter1)[0][0].first)->getComponent()->getContainer();
220 if(cont->isAttachedOnCloning())
226 std::vector<Container *> DeploymentTreeOnHeap::getAllRTODefContainers() const
228 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
229 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
230 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
231 vector<Container *> ret;
232 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
234 bool isRTODefSurely1=true;
235 for(iter2=(*iter1).begin();iter2!=(*iter1).end() && isRTODefSurely1;iter2++)
237 bool isRTODefSurely2=true;
238 for(iter3=(*iter2).begin();iter3!=(*iter2).end() && isRTODefSurely2;iter3++)
239 if((*iter3).second==0)
240 isRTODefSurely2=false;
242 isRTODefSurely1=!(((*iter2)[0].first)->getComponent()->isAttachedOnCloning());
244 isRTODefSurely1=false;
247 if(((*iter1)[0][0].first)->getComponent()->getContainer())
248 if(!((*iter1)[0][0].first)->getComponent()->getContainer()->isAttachedOnCloning())
249 ret.push_back(((*iter1)[0][0].first)->getComponent()->getContainer());
254 std::vector<Task *> DeploymentTreeOnHeap::getTasksLinkedToComponent(ComponentInstance *comp) const
256 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
257 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
258 vector< pair<Task *, Scheduler *> >::const_iterator iter3;
260 std::vector<Task *> ret;
261 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
262 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
263 if(((*iter2)[0].first)->getComponent()==comp)
264 for(iter3=(*iter2).begin();iter3!=(*iter2).end();iter3++)
265 ret.push_back((*iter3).first);
269 std::vector<ComponentInstance *> DeploymentTreeOnHeap::getComponentsLinkedToContainer(Container *cont) const
271 vector<ComponentInstance *> ret;
272 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
273 vector< vector< pair<Task *, Scheduler * > > >::const_iterator iter2;
274 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
275 if(((*iter1)[0][0].first)->getComponent()->getContainer()==cont)
276 for(iter2=(*iter1).begin();iter2!=(*iter1).end();iter2++)
277 ret.push_back(((*iter2)[0].first)->getComponent());
281 bool DeploymentTreeOnHeap::presenceOfDefaultContainer() const
283 vector< vector< vector< pair<Task *, Scheduler *> > > >::const_iterator iter1;
284 for(iter1=_tree.begin();iter1!=_tree.end();iter1++)
285 if(!((*iter1)[0][0].first)->getComponent()->getContainer())
290 std::vector<Task *> DeploymentTreeOnHeap::getFreeDeployableTasks() const
293 for(vector< pair<Task *,Scheduler *> >::const_iterator iter=_freePlacableTasks.begin();iter!=_freePlacableTasks.end();iter++)
294 ret.push_back((*iter).first);
298 bool DeploymentTreeOnHeap::isConsistentTaskRegardingShCompInst(std::vector< std::pair<Task *, Scheduler * > >& tasksSharingSameCompInst, Scheduler *cloner)
300 vector< std::pair<Task *, Scheduler * > >::const_iterator iter;
301 bool coexistenceOfDifferentSched=false;
302 for(iter=tasksSharingSameCompInst.begin();iter!=tasksSharingSameCompInst.end() && !coexistenceOfDifferentSched;iter++)
304 coexistenceOfDifferentSched=(((*iter).second)!=cloner);
306 if(!coexistenceOfDifferentSched)
308 //In this case the component is duplicated on cloning raising on runtime on different policy (schedulers) than other tasks in tasksSharingSameCompInst
309 return (tasksSharingSameCompInst[0].first)->getComponent()->isAttachedOnCloning();
312 DeploymentTree::DeploymentTree():_treeHandle(0)
316 DeploymentTree::~DeploymentTree()
319 _treeHandle->decrRef();
322 DeploymentTree::DeploymentTree(const DeploymentTree& other)
324 _treeHandle=other._treeHandle;
326 _treeHandle->incrRef();
329 const DeploymentTree &DeploymentTree::operator=(const DeploymentTree& other)
332 _treeHandle->decrRef();
333 _treeHandle=other._treeHandle;
335 _treeHandle->incrRef();
339 unsigned char DeploymentTree::appendTask(Task *task, Scheduler *cloner)
342 return _treeHandle->appendTask(task,cloner);
344 return DeploymentTree::NULL_TASK;
345 if(!task->isDeployable())//Task not needed to be placed.
346 return DeploymentTree::NOT_DEPLOYABLE_TASK;
347 _treeHandle=new DeploymentTreeOnHeap;
348 return _treeHandle->appendTask(task,cloner);
352 * Returns number of containers predictably launchable \b without counting default container.
354 unsigned DeploymentTree::getNumberOfCTDefContainer() const
357 return _treeHandle->getNumberOfCTDefContainer();
362 * Returns number of containers unpredictably launchable \b without counting default container.
364 unsigned DeploymentTree::getNumberOfRTODefContainer() const
367 return _treeHandle->getNumberOfRTODefContainer();
371 unsigned DeploymentTree::getNumberOfCTDefComponentInstances() const
374 return _treeHandle->getNumberOfCTDefComponentInstances();
378 unsigned DeploymentTree::getNumberOfRTODefComponentInstances() const
381 return _treeHandle->getNumberOfRTODefComponentInstances();
386 * Returns all containers default included (0).
388 std::vector<Container *> DeploymentTree::getAllContainers() const
391 return _treeHandle->getAllContainers();
392 return vector<Container *>();
396 * Returns containers predictably launchable \b without counting default container.
398 std::vector<Container *> DeploymentTree::getAllCTDefContainers() const
401 return _treeHandle->getAllCTDefContainers();
402 return vector<Container *>();
406 * Returns containers unpredictably launchable \b without counting default container.
408 std::vector<Container *> DeploymentTree::getAllRTODefContainers() const
411 return _treeHandle->getAllRTODefContainers();
412 return vector<Container *>();
415 std::vector<Task *> DeploymentTree::getTasksLinkedToComponent(ComponentInstance *comp) const
418 return _treeHandle->getTasksLinkedToComponent(comp);
419 return vector<Task *>();
422 std::vector<ComponentInstance *> DeploymentTree::getComponentsLinkedToContainer(Container *cont) const
425 return _treeHandle->getComponentsLinkedToContainer(cont);
426 return vector<ComponentInstance *>();
429 bool DeploymentTree::presenceOfDefaultContainer() const
432 return _treeHandle->presenceOfDefaultContainer();
436 bool DeploymentTree::isNull() const
438 return _treeHandle==0;
441 std::vector<Task *> DeploymentTree::getFreeDeployableTasks() const
444 return _treeHandle->getFreeDeployableTasks();
445 return vector<Task *>();