Skip to content

Commit 728f926

Browse files
olsonjefferybrson
authored andcommitted
fix a race in global loop test; unref_handle now takes a close_cb
1 parent 9a5d197 commit 728f926

File tree

1 file changed

+15
-19
lines changed

1 file changed

+15
-19
lines changed

src/libstd/uv_hl.rs

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,10 @@ fn ref_handle<T>(hl_loop: high_level_loop, handle: *T) unsafe {
166166
}
167167
#[doc="
168168
"]
169-
fn unref_handle<T>(hl_loop: high_level_loop, handle: *T) unsafe {
170-
send_high_level_msg(hl_loop, auto_unref_handle(handle as *libc::c_void));
169+
fn unref_handle<T>(hl_loop: high_level_loop, handle: *T,
170+
user_close_cb: *u8) unsafe {
171+
send_high_level_msg(hl_loop, auto_unref_handle(handle as *libc::c_void,
172+
user_close_cb));
171173
}
172174

173175
/////////////////////
@@ -232,8 +234,8 @@ crust fn high_level_wake_up_cb(async_handle: *libc::c_void,
232234
auto_ref_handle(handle) {
233235
high_level_ref(data, handle);
234236
}
235-
auto_unref_handle(handle) {
236-
high_level_unref(data, handle, false);
237+
auto_unref_handle(handle, user_close_cb) {
238+
high_level_unref(data, handle, false, user_close_cb);
237239
}
238240
tear_down {
239241
log(debug,"incoming hl_msg: got tear_down");
@@ -277,12 +279,8 @@ unsafe fn high_level_ref(data: *global_loop_data, handle: *libc::c_void) {
277279
(*data).refd_handles = refd_handles;
278280
}
279281

280-
crust fn auto_unref_close_cb(handle: *libc::c_void) {
281-
log(debug, "closing handle via high_level_unref");
282-
}
283-
284282
unsafe fn high_level_unref(data: *global_loop_data, handle: *libc::c_void,
285-
manual_unref: bool) {
283+
manual_unref: bool, user_close_cb: *u8) {
286284
log(debug,"incoming hl_msg: got auto_unref_handle");
287285
let mut refd_handles = (*data).refd_handles;
288286
let mut unrefd_handles = (*data).unrefd_handles;
@@ -299,7 +297,7 @@ unsafe fn high_level_unref(data: *global_loop_data, handle: *libc::c_void,
299297
}
300298
}
301299
else {
302-
ll::close(handle, auto_unref_close_cb);
300+
ll::close(handle, user_close_cb);
303301
let last_idx = vec::len(refd_handles) - 1u;
304302
let handle_idx = vec::position_elem(refd_handles, handle);
305303
alt handle_idx {
@@ -328,7 +326,7 @@ unsafe fn high_level_unref(data: *global_loop_data, handle: *libc::c_void,
328326
enum high_level_msg {
329327
interaction (fn~(*libc::c_void)),
330328
auto_ref_handle (*libc::c_void),
331-
auto_unref_handle (*libc::c_void),
329+
auto_unref_handle (*libc::c_void, *u8),
332330
tear_down
333331
}
334332

@@ -384,8 +382,6 @@ unsafe fn outer_global_loop_body(msg_po: comm::port<high_level_msg>) {
384382
};
385383

386384
ll::loop_delete(loop_ptr);
387-
// once we get here, show's over.
388-
rustrt::rust_uv_free_kernel_global_async_handle();
389385
}
390386

391387
unsafe fn inner_global_loop_body(weak_exit_po_in: comm::port<()>,
@@ -437,22 +433,22 @@ unsafe fn inner_global_loop_body(weak_exit_po_in: comm::port<()>,
437433
#[cfg(test)]
438434
mod test {
439435
crust fn simple_timer_close_cb(timer_ptr: *ll::uv_timer_t) unsafe {
440-
log(debug, "UNUSED...");
436+
log(debug, "user close cb for timer_ptr");
437+
let exit_ch_ptr = ll::get_data_for_uv_handle(
438+
timer_ptr as *libc::c_void) as *comm::chan<bool>;
439+
let exit_ch = *exit_ch_ptr;
440+
comm::send(exit_ch, true);
441441
}
442442
crust fn simple_timer_cb(timer_ptr: *ll::uv_timer_t,
443443
status: libc::c_int) unsafe {
444444
log(debug, "in simple timer cb");
445-
let exit_ch_ptr = ll::get_data_for_uv_handle(
446-
timer_ptr as *libc::c_void) as *comm::chan<bool>;
447445
ll::timer_stop(timer_ptr);
448446
let hl_loop = get_global_loop();
449447
interact(hl_loop) {|loop_ptr|
450448
log(debug, "closing timer");
451449
//ll::close(timer_ptr as *libc::c_void, simple_timer_close_cb);
452-
unref_handle(hl_loop, timer_ptr);
450+
unref_handle(hl_loop, timer_ptr, simple_timer_close_cb);
453451
log(debug, "about to deref exit_ch_ptr");
454-
let exit_ch = *exit_ch_ptr;
455-
comm::send(exit_ch, true);
456452
log(debug, "after msg sent on deref'd exit_ch");
457453
};
458454
log(debug, "exiting simple timer cb");

0 commit comments

Comments
 (0)