about summary refs log tree commit diff
path: root/src/rt/rust_sched_driver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/rt/rust_sched_driver.cpp')
-rw-r--r--src/rt/rust_sched_driver.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/rt/rust_sched_driver.cpp b/src/rt/rust_sched_driver.cpp
new file mode 100644
index 00000000000..dd9ca9e7f10
--- /dev/null
+++ b/src/rt/rust_sched_driver.cpp
@@ -0,0 +1,46 @@
+#include <assert.h>
+#include "rust_internal.h"
+#include "rust_sched_driver.h"
+#include "rust_sched_loop.h"
+
+rust_sched_driver::rust_sched_driver(rust_sched_loop *sched_loop)
+    : sched_loop(sched_loop),
+      signalled(false) {
+
+    assert(sched_loop != NULL);
+    sched_loop->on_pump_loop(this);
+}
+
+/**
+ * Starts the main scheduler loop which performs task scheduling for this
+ * domain.
+ *
+ * Returns once no more tasks can be scheduled and all task ref_counts
+ * drop to zero.
+ */
+void
+rust_sched_driver::start_main_loop() {
+    assert(sched_loop != NULL);
+
+    rust_sched_loop_state state = sched_loop_state_keep_going;
+    while (state != sched_loop_state_exit) {
+        DLOG(sched_loop, dom, "pumping scheduler");
+        state = sched_loop->run_single_turn();
+
+        if (state == sched_loop_state_block) {
+            scoped_lock with(lock);
+            if (!signalled) {
+                DLOG(sched_loop, dom, "blocking scheduler");
+                lock.wait();
+            }
+            signalled = false;
+        }
+    }
+}
+
+void
+rust_sched_driver::signal() {
+    scoped_lock with(lock);
+    signalled = true;
+    lock.signal();
+}