about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cpp/.traces/scheduler_runs_single_routine21
-rw-r--r--cpp/.traces/scheduler_skips_completed_routines28
-rw-r--r--cpp/.traces/scheduler_starts_at_middle_of_routines20
-rw-r--r--cpp/038scheduler.cc49
4 files changed, 117 insertions, 1 deletions
diff --git a/cpp/.traces/scheduler_runs_single_routine b/cpp/.traces/scheduler_runs_single_routine
new file mode 100644
index 00000000..8f5d7102
--- /dev/null
+++ b/cpp/.traces/scheduler_runs_single_routine
@@ -0,0 +1,21 @@
+parse/0: instruction: copy
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0: instruction: copy
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+after-brace/0: recipe f1
+after-brace/0: copy ...
+after-brace/0: copy ...
+new/0: routine allocated memory from 1000 to 101000
+schedule/0: f1
+run/0: instruction f1/0
+run/0: {name: "1", value: 1, type: 1, properties: ["1": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1
+schedule/0: f1
+run/0: instruction f1/1
+run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 2
+schedule/0: f1
diff --git a/cpp/.traces/scheduler_skips_completed_routines b/cpp/.traces/scheduler_skips_completed_routines
new file mode 100644
index 00000000..9e609d02
--- /dev/null
+++ b/cpp/.traces/scheduler_skips_completed_routines
@@ -0,0 +1,28 @@
+parse/0: instruction: copy
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0: instruction: copy
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+new/0: routine allocated memory from 1000 to 101000
+new/0: routine allocated memory from 101000 to 201000
+parse/0: instruction: copy
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
+after-brace/0: recipe f1
+after-brace/0: copy ...
+after-brace/0: recipe f2
+after-brace/0: copy ...
+after-brace/0: recipe f3
+after-brace/0: copy ...
+new/0: routine allocated memory from 201000 to 301000
+schedule/0: f3
+run/0: instruction f3/0
+run/0: {name: "3", value: 3, type: 1, properties: ["3": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 3
+schedule/0: f1
+run/0: instruction f1/0
+run/0: {name: "1", value: 1, type: 1, properties: ["1": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1
diff --git a/cpp/.traces/scheduler_starts_at_middle_of_routines b/cpp/.traces/scheduler_starts_at_middle_of_routines
new file mode 100644
index 00000000..2c35f427
--- /dev/null
+++ b/cpp/.traces/scheduler_starts_at_middle_of_routines
@@ -0,0 +1,20 @@
+new/0: routine allocated memory from 1000 to 101000
+parse/0: instruction: copy
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0: instruction: copy
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+after-brace/0: recipe f1
+after-brace/0: copy ...
+after-brace/0: copy ...
+new/0: routine allocated memory from 101000 to 201000
+schedule/0: f1
+run/0: instruction f1/0
+run/0: {name: "1", value: 1, type: 1, properties: ["1": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 1
+run/0: instruction f1/1
+run/0: {name: "2", value: 2, type: 1, properties: ["2": "integer"]} <- copy {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+run/0: ingredient 0 is 0
+mem/0: storing 0 in location 2
diff --git a/cpp/038scheduler.cc b/cpp/038scheduler.cc
index 3550ff1f..6e3f74b8 100644
--- a/cpp/038scheduler.cc
+++ b/cpp/038scheduler.cc
@@ -46,6 +46,8 @@ void run(recipe_number r) {
   Routines.push_back(new routine(r));
   Current_routine_index = 0, Current_routine = Routines[0];
   while (!all_routines_done()) {
+    skip_to_next_routine();
+//?     cout << "scheduler: " << Current_routine_index << '\n'; //? 1
     assert(Current_routine);
     assert(Current_routine->state == RUNNING);
     trace("schedule") << current_recipe_name();
@@ -53,13 +55,14 @@ void run(recipe_number r) {
     if (Current_routine->completed())
       Current_routine->state = COMPLETED;
     // End Scheduler State Transitions
-    skip_to_next_routine();
   }
+//?   cout << "done with run\n"; //? 1
 }
 
 :(code)
 bool all_routines_done() {
   for (size_t i = 0; i < Routines.size(); ++i) {
+//?     cout << "routine " << i << ' ' << Routines[i]->state << '\n'; //? 1
     if (Routines[i]->state == RUNNING) {
       return false;
     }
@@ -73,11 +76,13 @@ void skip_to_next_routine() {
   assert(Current_routine_index < Routines.size());
   for (size_t i = (Current_routine_index+1)%Routines.size();  i != Current_routine_index;  i = (i+1)%Routines.size()) {
     if (Routines[i]->state == RUNNING) {
+//?       cout << "switching to " << i << '\n'; //? 1
       Current_routine_index = i;
       Current_routine = Routines[i];
       return;
     }
   }
+//?   cout << "all done\n"; //? 1
 }
 
 :(before "End Teardown")
@@ -97,6 +102,17 @@ case START_RUNNING: {
   break;
 }
 
+:(scenario scheduler_runs_single_routine)
+% Scheduling_interval = 1;
+recipe f1 [
+  1:integer <- copy 0:literal
+  2:integer <- copy 0:literal
+]
++schedule: f1
++run: instruction f1/0
++schedule: f1
++run: instruction f1/1
+
 :(scenario scheduler_interleaves_routines)
 % Scheduling_interval = 1;
 recipe f1 [
@@ -118,3 +134,34 @@ recipe f2 [
 +run: instruction f2/1
 +schedule: f1
 +run: instruction f1/2
+
+:(scenario scheduler_skips_completed_routines)
+# this scenario will require some careful setup in escaped C++
+# (straining our tangle capabilities to near-breaking point)
+% recipe_number f1 = load("recipe f1 [\n1:integer <- copy 0:literal\n]").front();
+% recipe_number f2 = load("recipe f2 [\n2:integer <- copy 0:literal\n]").front();
+% Routines.push_back(new routine(f1));  // f1 meant to run
+% Routines.push_back(new routine(f2));
+% Routines.back()->state = COMPLETED;  // f2 not meant to run
+#? % Trace_stream->dump_layer = "all";
+# must have at least one routine without escaping
+recipe f3 [
+  3:integer <- copy 0:literal
+]
+# by interleaving '+' lines with '-' lines, we allow f1 and f3 to run in any order
++schedule: f1
++mem: storing 0 in location 1
+-schedule: f2
+-mem: storing 0 in location 2
++schedule: f3
++mem: storing 0 in location 3
+
+:(scenario scheduler_starts_at_middle_of_routines)
+% Routines.push_back(new routine(COPY));
+% Routines.back()->state = COMPLETED;
+recipe f1 [
+  1:integer <- copy 0:literal
+  2:integer <- copy 0:literal
+]
++schedule: f1
+-run: idle