about summary refs log tree commit diff
path: root/src/libstd/uv_global_loop.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-05-24 22:26:30 -0700
committerBrian Anderson <banderson@mozilla.com>2012-05-24 22:26:30 -0700
commitd4db1beabf5b8837aa50b9f3991df47ac2cc575c (patch)
treeab504d24edbdb8f00cf13b0aa2dab46179ea1503 /src/libstd/uv_global_loop.rs
parent95898b4cfcbc5b47730aa722f3818f8b9028cb63 (diff)
std: Separate weakening the I/O task from spawning it
Diffstat (limited to 'src/libstd/uv_global_loop.rs')
-rw-r--r--src/libstd/uv_global_loop.rs49
1 files changed, 38 insertions, 11 deletions
diff --git a/src/libstd/uv_global_loop.rs b/src/libstd/uv_global_loop.rs
index 5e3ecfd5318..bdd84536c6a 100644
--- a/src/libstd/uv_global_loop.rs
+++ b/src/libstd/uv_global_loop.rs
@@ -7,7 +7,7 @@ export get, get_monitor_task_gl;
 import ll = uv_ll;
 import hl = uv_hl;
 import get_gl = get;
-import task::{spawn_sched, single_threaded};
+import task::{run, single_threaded};
 import priv::{chan_from_global_ptr, weaken_task};
 import comm::{port, chan, methods, select2, listen};
 import either::{left, right};
@@ -63,7 +63,7 @@ fn get_monitor_task_gl() -> hl::high_level_loop unsafe {
         // As a weak task the runtime will notify us when to exit
         weaken_task() {|weak_exit_po|
             #debug("global monitor task is now weak");
-            let hl_loop = spawn_high_level_loop();
+            let hl_loop = spawn_loop();
             loop {
                 #debug("in outer_loop...");
                 alt select2(weak_exit_po, msg_po) {
@@ -93,18 +93,45 @@ fn get_monitor_task_gl() -> hl::high_level_loop unsafe {
     }
 }
 
-fn spawn_high_level_loop() -> hl::high_level_loop unsafe {
+fn spawn_loop() -> hl::high_level_loop unsafe {
+    let builder = task::builder();
+    task::add_wrapper(builder) {|task_body|
+        fn~(move task_body) {
+            // The I/O loop task also needs to be weak so it doesn't keep
+            // the runtime alive
+            weaken_task {|weak_exit_po|
+                #debug("global libuv task is now weak %?", weak_exit_po);
+                task_body();
+
+                // We don't wait for the exit message on weak_exit_po
+                // because the monitor task will tell the uv loop when to
+                // exit
+
+                #debug("global libuv task is leaving weakened state");
+            }
+        }
+    }
+    spawn_high_level_loop(builder)
+}
+
+fn spawn_high_level_loop(-builder: task::builder
+                        ) -> hl::high_level_loop unsafe {
+
     let hll_po = port::<hl::high_level_loop>();
     let hll_ch = hll_po.chan();
 
-    spawn_sched(single_threaded) {||
-        #debug("entering global libuv task");
-        weaken_task() {|weak_exit_po|
-            #debug("global libuv task is now weak %?", weak_exit_po);
-            hl::run_high_level_loop(hll_ch);
-            #debug("global libuv task is leaving weakened state");
-        };
-        #debug("global libuv task exiting");
+    task::set_opts(builder, {
+        sched: some({
+            mode: single_threaded,
+            native_stack_size: none
+        })
+        with task::get_opts(builder)
+    });
+
+    run(builder) {||
+        #debug("entering libuv task");
+        hl::run_high_level_loop(hll_ch);
+        #debug("libuv task exiting");
     };
 
     hll_po.recv()