From 92e88e4e2ce79868daee1ac3f77a6aaa193b5896 Mon Sep 17 00:00:00 2001 From: Jeff Olson Date: Fri, 27 Apr 2012 21:42:04 -0700 Subject: std: another stab at a race-free global loop implementation seems to hold up pretty well. uv::hl API is affected.. had to do work on tests and std::timer code that leverages the global loop/high_level_loop API. see test_stress_gl_uv_global_loop_high_level_global_timer for a stress example.. it takes a while to run, but it exits cleanly (something I could never accomplish with earlier iterations of the global loop) --- src/libstd/timer.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) (limited to 'src/libstd/timer.rs') diff --git a/src/libstd/timer.rs b/src/libstd/timer.rs index a7cb1762c4f..1c646f61d6a 100644 --- a/src/libstd/timer.rs +++ b/src/libstd/timer.rs @@ -30,7 +30,6 @@ fn delayed_send(msecs: uint, ch: comm::chan, val: T) { let timer_ptr = ptr::addr_of(timer); let hl_loop = uv::global_loop::get(); uv::hl::interact(hl_loop) {|loop_ptr| - uv::hl::ref(hl_loop, timer_ptr); let init_result = uv::ll::timer_init(loop_ptr, timer_ptr); if (init_result == 0i32) { let start_result = uv::ll::timer_start( @@ -54,9 +53,6 @@ fn delayed_send(msecs: uint, ch: comm::chan, val: T) { comm::recv(timer_done_po); // notify the caller immediately comm::send(ch, copy(val)); - // then clean up our handle - uv::hl::unref_and_close(hl_loop, timer_ptr, - delayed_send_close_cb); // uv_close for this timer has been processed comm::recv(timer_done_po); } @@ -122,6 +118,7 @@ crust fn delayed_send_cb(handle: *uv::ll::uv_timer_t, let stop_result = uv::ll::timer_stop(handle); if (stop_result == 0i32) { comm::send(timer_done_ch, ()); + uv::ll::close(handle, delayed_send_close_cb); } else { let loop_ptr = uv::ll::get_loop_for_uv_handle(handle); @@ -140,14 +137,12 @@ crust fn delayed_send_close_cb(handle: *uv::ll::uv_timer_t) unsafe { #[cfg(test)] mod test { #[test] - #[ignore] - fn test_timer_simple_sleep_test() { + fn test_gl_timer_simple_sleep_test() { sleep(1u); } #[test] - #[ignore] - fn test_timer_recv_timeout_before_time_passes() { + fn test_gl_timer_recv_timeout_before_time_passes() { let expected = rand::rng().gen_str(16u); let test_po = comm::port::(); let test_ch = comm::chan(test_po); @@ -165,8 +160,7 @@ mod test { } #[test] - #[ignore] - fn test_timer_recv_timeout_after_time_passes() { + fn test_gl_timer_recv_timeout_after_time_passes() { let expected = rand::rng().gen_str(16u); let fail_msg = rand::rng().gen_str(16u); let test_po = comm::port::(); -- cgit 1.4.1-3-g733a5