about summary refs log tree commit diff
path: root/src/rt/rust_sched_driver.cpp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-03-30 17:10:02 -0700
committerBrian Anderson <banderson@mozilla.com>2012-03-31 19:51:29 -0700
commit609144f7a6adba552602feb7e50e7c4d6a815fae (patch)
treea0281e219c6d944dbffcd408e7291d14ae08e21e /src/rt/rust_sched_driver.cpp
parent218dd084697ed2ce58812ef9e69cdc86cb83bcf2 (diff)
downloadrust-609144f7a6adba552602feb7e50e7c4d6a815fae.tar.gz
rust-609144f7a6adba552602feb7e50e7c4d6a815fae.zip
rt: Extract start_main_loop from rust_sched_loop to rust_sched_driver
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();
+}