From 7b3add0632f65865159af1ee35933c4e61d41f8b Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Thu, 5 Jul 2012 19:55:01 -0400 Subject: [PATCH] make disallow_kill an int for nested unkillables (closes #2782) --- src/libcore/dlist.rs | 2 +- src/rt/rust_task.cpp | 9 +++++---- src/rt/rust_task.h | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/libcore/dlist.rs b/src/libcore/dlist.rs index f80972d50b33..c66f094eec06 100644 --- a/src/libcore/dlist.rs +++ b/src/libcore/dlist.rs @@ -609,7 +609,7 @@ mod tests { #[test] #[should_fail] #[ignore(cfg(windows))] fn test_asymmetric_link() { let l = create::(); - let one = l.push_n(1); + let _one = l.push_n(1); let two = l.push_n(2); two.prev = none; l.assert_consistent(); diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index a6ad35b5a572..d7d43bcd27d2 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -38,7 +38,7 @@ rust_task::rust_task(rust_sched_loop *sched_loop, rust_task_state state, cond_name("none"), killed(false), reentered_rust_stack(false), - disallow_kill(false), + disallow_kill(0), c_stack(NULL), next_c_sp(0), next_rust_sp(0), @@ -237,7 +237,7 @@ rust_task::must_fail_from_being_killed() { bool rust_task::must_fail_from_being_killed_unlocked() { kill_lock.must_have_lock(); - return killed && !reentered_rust_stack && !disallow_kill; + return killed && !reentered_rust_stack && disallow_kill == 0; } // Only run this on the rust stack @@ -683,13 +683,14 @@ rust_task::on_rust_stack() { void rust_task::inhibit_kill() { scoped_lock with(kill_lock); - disallow_kill = true; + disallow_kill++; } void rust_task::allow_kill() { scoped_lock with(kill_lock); - disallow_kill = false; + assert(disallow_kill > 0 && "Illegal allow_kill(): already killable!"); + disallow_kill--; } // diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h index f92682ec0070..96b0bddd4e06 100644 --- a/src/rt/rust_task.h +++ b/src/rt/rust_task.h @@ -181,7 +181,7 @@ private: bool killed; // Indicates that we've called back into Rust from C bool reentered_rust_stack; - bool disallow_kill; + int disallow_kill; // The stack used for running C code, borrowed from the scheduler thread stk_seg *c_stack;