diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-05-24 22:26:30 -0700 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-05-24 22:26:30 -0700 |
| commit | d4db1beabf5b8837aa50b9f3991df47ac2cc575c (patch) | |
| tree | ab504d24edbdb8f00cf13b0aa2dab46179ea1503 /src/libstd/uv_global_loop.rs | |
| parent | 95898b4cfcbc5b47730aa722f3818f8b9028cb63 (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.rs | 49 |
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() |
