38 DECLARE_EXPORT short unsigned HasLevel::numberOfHangingClusters = 0;
43 computationBusy =
true;
45 static Mutex levelcomputationbusy;
50 while (recomputeLevels)
55 recomputeLevels =
false;
78 stack< pair<Operation*,int> > stack;
86 numberOfHangingClusters = 0;
87 map<Operation*,short> visited;
93 logger <<
"Investigating operation '" << &*g
94 <<
"' - current cluster " << g->cluster << endl;
99 cur_cluster = g->cluster;
102 cur_cluster = ++numberOfClusters;
103 if (numberOfClusters >= USHRT_MAX)
107 if (g->getFlows().empty() && g->getLoads().empty()
108 && g->getSuperOperations().empty()
109 && g->getSubOperations().empty()
112 ++numberOfHangingClusters;
123 search_level =
false;
124 if (g->getSuperOperations().empty())
129 fl != g->getFlows().end() && search_level; ++fl)
130 if (fl->isProducer()) search_level =
false;
134 for (Operation::Operationlist::const_reverse_iterator
135 i = g->getSubOperations().rbegin();
136 i != g->getSubOperations().rend() && search_level;
139 fl = (*i)->getFlows().begin();
140 fl != (*i)->getFlows().end() && search_level;
142 if (fl->isProducer()) search_level =
false;
147 if (!search_level && g->cluster)
continue;
153 stack.push(make_pair(&*g, search_level ? 0 : -1));
155 g->cluster = cur_cluster;
156 if (search_level) g->lvl = 0;
157 while (!stack.empty())
160 cur_oper = stack.top().first;
161 cur_level = stack.top().second;
165 logger <<
" Recursing in Operation '" << *(cur_oper)
166 <<
"' - current level " << cur_level << endl;
169 map<Operation*,short>::iterator detectloop = visited.find(cur_oper);
170 if (detectloop == visited.end())
172 visited.insert(make_pair(cur_oper,0));
173 else if (++(detectloop->second) > 1)
178 for (Operation::Operationlist::const_reverse_iterator
183 if ((*i)->lvl < cur_level)
186 stack.push(make_pair(*i,cur_level));
187 (*i)->lvl = cur_level;
188 (*i)->cluster = cur_cluster;
190 else if (!(*i)->cluster)
193 stack.push(make_pair(*i,-1));
194 (*i)->cluster = cur_cluster;
200 for (Operation::Operationlist::const_reverse_iterator
205 if ((*j)->lvl < cur_level)
208 stack.push(make_pair(*j,cur_level));
209 (*j)->lvl = cur_level;
210 (*j)->cluster = cur_cluster;
212 else if (!(*j)->cluster)
215 stack.push(make_pair(*j,-1));
216 (*j)->cluster = cur_cluster;
222 for (Operation::loadlist::const_iterator gres =
224 gres != cur_oper->
getLoads().end(); ++gres)
226 Resource *resptr = gres->getResource();
228 if (resptr->lvl < cur_level) resptr->lvl = cur_level;
230 if (!resptr->cluster)
232 resptr->cluster = cur_cluster;
234 for (Resource::loadlist::const_iterator resops =
236 resops != resptr->
getLoads().end(); ++resops)
237 if (!resops->getOperation()->cluster)
239 stack.push(make_pair(resops->getOperation(),-1));
240 resops->getOperation()->cluster = cur_cluster;
255 search_level = cur_level!=-1 && cur_buf->lvl<cur_level+1;
258 if (search_level || !cur_buf->cluster)
261 cur_buf->cluster = cur_cluster;
272 if (buffl->getOperation()->lvl < cur_level+1
273 && &*buffl != cur_Flow && buffl->
isProducer())
275 stack.push(make_pair(buffl->getOperation(),cur_level+1));
276 buffl->getOperation()->lvl = cur_level+1;
277 buffl->getOperation()->cluster = cur_cluster;
279 else if (!buffl->getOperation()->cluster)
281 stack.push(make_pair(buffl->getOperation(),-1));
282 buffl->getOperation()->cluster = cur_cluster;
284 cur_buf->lvl = cur_level+1;
287 else if (!buffl->getOperation()->cluster)
289 stack.push(make_pair(buffl->getOperation(),-1));
290 buffl->getOperation()->cluster = cur_cluster;
306 if (gbuf2->getFlows().empty())
308 gbuf2->cluster = ++numberOfClusters;
309 if (numberOfClusters >= USHRT_MAX)
311 ++numberOfHangingClusters;
315 if (gres2->getLoads().empty())
317 gres2->cluster = ++numberOfClusters;
318 if (numberOfClusters >= USHRT_MAX)
320 ++numberOfHangingClusters;
327 computationBusy =
false;