Skip to content

Commit d4db1be

Browse files
committed
std: Separate weakening the I/O task from spawning it
1 parent 95898b4 commit d4db1be

File tree

1 file changed

+38
-11
lines changed

1 file changed

+38
-11
lines changed

src/libstd/uv_global_loop.rs

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export get, get_monitor_task_gl;
77
import ll = uv_ll;
88
import hl = uv_hl;
99
import get_gl = get;
10-
import task::{spawn_sched, single_threaded};
10+
import task::{run, single_threaded};
1111
import priv::{chan_from_global_ptr, weaken_task};
1212
import comm::{port, chan, methods, select2, listen};
1313
import either::{left, right};
@@ -63,7 +63,7 @@ fn get_monitor_task_gl() -> hl::high_level_loop unsafe {
6363
// As a weak task the runtime will notify us when to exit
6464
weaken_task() {|weak_exit_po|
6565
#debug("global monitor task is now weak");
66-
let hl_loop = spawn_high_level_loop();
66+
let hl_loop = spawn_loop();
6767
loop {
6868
#debug("in outer_loop...");
6969
alt select2(weak_exit_po, msg_po) {
@@ -93,18 +93,45 @@ fn get_monitor_task_gl() -> hl::high_level_loop unsafe {
9393
}
9494
}
9595

96-
fn spawn_high_level_loop() -> hl::high_level_loop unsafe {
96+
fn spawn_loop() -> hl::high_level_loop unsafe {
97+
let builder = task::builder();
98+
task::add_wrapper(builder) {|task_body|
99+
fn~(move task_body) {
100+
// The I/O loop task also needs to be weak so it doesn't keep
101+
// the runtime alive
102+
weaken_task {|weak_exit_po|
103+
#debug("global libuv task is now weak %?", weak_exit_po);
104+
task_body();
105+
106+
// We don't wait for the exit message on weak_exit_po
107+
// because the monitor task will tell the uv loop when to
108+
// exit
109+
110+
#debug("global libuv task is leaving weakened state");
111+
}
112+
}
113+
}
114+
spawn_high_level_loop(builder)
115+
}
116+
117+
fn spawn_high_level_loop(-builder: task::builder
118+
) -> hl::high_level_loop unsafe {
119+
97120
let hll_po = port::<hl::high_level_loop>();
98121
let hll_ch = hll_po.chan();
99122

100-
spawn_sched(single_threaded) {||
101-
#debug("entering global libuv task");
102-
weaken_task() {|weak_exit_po|
103-
#debug("global libuv task is now weak %?", weak_exit_po);
104-
hl::run_high_level_loop(hll_ch);
105-
#debug("global libuv task is leaving weakened state");
106-
};
107-
#debug("global libuv task exiting");
123+
task::set_opts(builder, {
124+
sched: some({
125+
mode: single_threaded,
126+
native_stack_size: none
127+
})
128+
with task::get_opts(builder)
129+
});
130+
131+
run(builder) {||
132+
#debug("entering libuv task");
133+
hl::run_high_level_loop(hll_ch);
134+
#debug("libuv task exiting");
108135
};
109136

110137
hll_po.recv()

0 commit comments

Comments
 (0)