void SystemScheduler::schedule()
{
- for(GraphNode &n: nodes)
+ for(size_t i=0; i<nodes.size(); ++i)
{
- n.prerequisites = 0;
- n.commit_barrier = 0;
+ nodes[i].prerequisites = 0;
+ nodes[i].commit_barrier = 1ULL<<i;
}
// Collect basic prerequisites from system dependencies
{
NodeMask check_bits = 0;
for(size_t j=0; j<nodes.size(); ++j)
- if(nodes[j].commit_barrier&(1ULL<<i))
+ if(j!=i && nodes[j].commit_barrier&(1ULL<<i))
check_bits |= 1ULL<<j;
for(size_t j=0; j<nodes.size(); ++j)
- if((nodes[i].commit_barrier&(1ULL<<j)) && (nodes[j].prerequisites&check_bits))
+ if(j!=i && (nodes[i].commit_barrier&(1ULL<<j)) && (nodes[j].prerequisites&check_bits))
{
nodes[i].commit_barrier &= ~(1ULL<<j);
nodes[j].prerequisites |= 1ULL<<i;
{
if(!(started&(1ULL<<i)) && (committed&nodes[i].prerequisites)==nodes[i].prerequisites)
run_index = i;
- if((finished&nodes[i].commit_barrier)==nodes[i].commit_barrier)
+ if(!(committed&(1ULL<<i)) && (finished&nodes[i].commit_barrier)==nodes[i].commit_barrier)
commit_index = i;
}