Skip to content

Commit db6c305

Browse files
olsonjefferybrson
authored andcommitted
---
yaml --- r: 15581 b: refs/heads/try c: e15f1d5 h: refs/heads/master i: 15579: 308692a v: v3
1 parent cdaadcd commit db6c305

File tree

3 files changed

+89
-23
lines changed

3 files changed

+89
-23
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5-
refs/heads/try: afb35f752f89e9466f8f15e701808871b6dcdb6e
5+
refs/heads/try: e15f1d5cad5d35cc640252377344dcdfbec04b22
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/try/src/libstd/uv_global_loop.rs

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import ll = uv_ll;
66
import hl = uv_hl;
77
import get_gl = get;
88

9-
export get;
9+
export get, get_single_task_gl;
1010

1111
native mod rustrt {
1212
fn rust_uv_get_kernel_global_chan_ptr() -> *libc::uintptr_t;
@@ -26,7 +26,44 @@ loop is running.
2626
loop.
2727
"]
2828
fn get() -> hl::high_level_loop {
29+
ret get_single_task_gl();
30+
}
31+
32+
#[doc(hidden)]
33+
fn get_single_task_gl() -> hl::high_level_loop {
2934
let global_loop_chan_ptr = rustrt::rust_uv_get_kernel_global_chan_ptr();
35+
ret spawn_global_weak_task(
36+
global_loop_chan_ptr,
37+
{|weak_exit_po, msg_po, loop_ptr, first_msg|
38+
log(debug, "about to enter inner loop");
39+
unsafe {
40+
single_task_loop_body(weak_exit_po, msg_po, loop_ptr,
41+
copy(first_msg))
42+
}
43+
},
44+
{|msg_ch|
45+
log(debug, "after priv::chan_from_global_ptr");
46+
unsafe {
47+
let handle = get_global_async_handle_native_representation()
48+
as **ll::uv_async_t;
49+
hl::single_task_loop(
50+
{ async_handle: handle, op_chan: msg_ch })
51+
}
52+
}
53+
);
54+
}
55+
56+
// INTERNAL API
57+
58+
fn spawn_global_weak_task(
59+
global_loop_chan_ptr: *libc::uintptr_t,
60+
weak_task_body_cb: fn~(
61+
comm::port<()>,
62+
comm::port<hl::high_level_msg>,
63+
*libc::c_void,
64+
hl::high_level_msg) -> bool,
65+
after_task_spawn_cb: fn~(comm::chan<hl::high_level_msg>)
66+
-> hl::high_level_loop) -> hl::high_level_loop {
3067
log(debug, #fmt("ENTERING global_loop::get() loop chan: %?",
3168
global_loop_chan_ptr));
3269

@@ -44,25 +81,26 @@ fn get() -> hl::high_level_loop {
4481
};
4582
unsafe {
4683
log(debug, "before priv::chan_from_global_ptr");
47-
let chan = priv::chan_from_global_ptr::<hl::high_level_msg>(
84+
let msg_ch = priv::chan_from_global_ptr::<hl::high_level_msg>(
4885
global_loop_chan_ptr,
4986
builder_fn) {|port|
5087

5188
// the actual body of our global loop lives here
5289
log(debug, "initialized global port task!");
5390
log(debug, "GLOBAL initialized global port task!");
54-
outer_global_loop_body(port);
91+
outer_global_loop_body(port, weak_task_body_cb);
5592
};
56-
log(debug, "after priv::chan_from_global_ptr");
57-
let handle = get_global_async_handle_native_representation()
58-
as **ll::uv_async_t;
59-
ret { async_handle: handle, op_chan: chan };
93+
ret after_task_spawn_cb(msg_ch);
6094
}
6195
}
6296

63-
// INTERNAL API
64-
65-
unsafe fn outer_global_loop_body(msg_po: comm::port<hl::high_level_msg>) {
97+
unsafe fn outer_global_loop_body(
98+
msg_po: comm::port<hl::high_level_msg>,
99+
weak_task_body_cb: fn~(
100+
comm::port<()>,
101+
comm::port<hl::high_level_msg>,
102+
*libc::c_void,
103+
hl::high_level_msg) -> bool) {
66104
// we're going to use a single libuv-generated loop ptr
67105
// for the duration of the process
68106
let loop_ptr = ll::loop_new();
@@ -87,9 +125,8 @@ unsafe fn outer_global_loop_body(msg_po: comm::port<hl::high_level_msg>) {
87125
left_val));
88126
false
89127
}, {|right_val|
90-
log(debug, "about to enter inner loop");
91-
inner_global_loop_body(weak_exit_po, msg_po, loop_ptr,
92-
copy(right_val))
128+
weak_task_body_cb(weak_exit_po, msg_po, loop_ptr,
129+
right_val)
93130
}, comm::select2(weak_exit_po, msg_po));
94131
log(debug,#fmt("GLOBAL LOOP EXITED, WAITING TO RESTART? %?",
95132
continue));
@@ -99,7 +136,7 @@ unsafe fn outer_global_loop_body(msg_po: comm::port<hl::high_level_msg>) {
99136
ll::loop_delete(loop_ptr);
100137
}
101138

102-
unsafe fn inner_global_loop_body(weak_exit_po_in: comm::port<()>,
139+
unsafe fn single_task_loop_body(weak_exit_po_in: comm::port<()>,
103140
msg_po_in: comm::port<hl::high_level_msg>,
104141
loop_ptr: *libc::c_void,
105142
-first_interaction: hl::high_level_msg) -> bool {

branches/try/src/libstd/uv_hl.rs

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ provide a high-level, abstracted interface to some set of
66
libuv functionality.
77
"];
88

9-
export high_level_loop, high_level_msg;
9+
export high_level_loop, hl_loop_ext, high_level_msg;
1010
export run_high_level_loop, interact, ref_handle, unref_handle;
1111

1212
import ll = uv_ll;
@@ -22,10 +22,39 @@ the C uv loop to process any pending callbacks
2222
* op_chan - a channel used to send function callbacks to be processed
2323
by the C uv loop
2424
"]
25-
type high_level_loop = {
26-
async_handle: **ll::uv_async_t,
27-
op_chan: comm::chan<high_level_msg>
28-
};
25+
enum high_level_loop {
26+
single_task_loop({
27+
async_handle: **ll::uv_async_t,
28+
op_chan: comm::chan<high_level_msg>
29+
}),
30+
monitor_task_loop({
31+
op_chan: comm::chan<high_level_msg>
32+
})
33+
}
34+
35+
impl hl_loop_ext for high_level_loop {
36+
fn async_handle() -> **ll::uv_async_t {
37+
alt self {
38+
single_task_loop({async_handle, op_chan}) {
39+
ret async_handle;
40+
}
41+
_ {
42+
fail "variant of hl::high_level_loop that doesn't include" +
43+
"an async_handle field";
44+
}
45+
}
46+
}
47+
fn op_chan() -> comm::chan<high_level_msg> {
48+
alt self {
49+
single_task_loop({async_handle, op_chan}) {
50+
ret op_chan;
51+
}
52+
monitor_task_loop({op_chan}) {
53+
ret op_chan;
54+
}
55+
}
56+
}
57+
}
2958

3059
#[doc="
3160
Represents the range of interactions with a `high_level_loop`
@@ -158,15 +187,15 @@ enum global_loop_data {
158187

159188
unsafe fn send_high_level_msg(hl_loop: high_level_loop,
160189
-msg: high_level_msg) unsafe {
161-
comm::send(hl_loop.op_chan, msg);
190+
comm::send(hl_loop.op_chan(), msg);
162191

163192
// if the global async handle == 0, then that means
164193
// the loop isn't active, so we don't need to wake it up,
165194
// (the loop's enclosing task should be blocking on a message
166195
// receive on this port)
167-
if (*(hl_loop.async_handle) != 0 as *ll::uv_async_t) {
196+
if (*(hl_loop.async_handle()) != 0 as *ll::uv_async_t) {
168197
log(debug,"global async handle != 0, waking up loop..");
169-
ll::async_send(*(hl_loop.async_handle));
198+
ll::async_send(*(hl_loop.async_handle()));
170199
}
171200
else {
172201
log(debug,"GLOBAL ASYNC handle == 0");

0 commit comments

Comments
 (0)