]> git.tdb.fi Git - libs/game.git/commitdiff
Avoid committing systems at the wrong time
authorMikko Rasa <tdb@tdb.fi>
Sun, 30 Mar 2025 13:28:27 +0000 (16:28 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 30 Mar 2025 13:28:27 +0000 (16:28 +0300)
Checks were missing to only commit a system after it has finished
running and not committing it a second time.

source/game/systemscheduler.cpp

index 1a0d1ecb867d86ca64bbb5bc94cd1e5b261ca715..1b82b5435b946a1200138b723f11ad95e0147e6f 100644 (file)
@@ -24,10 +24,10 @@ void SystemScheduler::remove_system(System &s)
 
 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
@@ -73,11 +73,11 @@ void SystemScheduler::schedule()
        {
                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;
@@ -222,7 +222,7 @@ void SystemScheduler::run(Time::TimeDelta dt)
                {
                        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;
                }