about summary refs log tree commit diff
path: root/src/rt/rust_task.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/rt/rust_task.cpp')
-rw-r--r--src/rt/rust_task.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index a6ad35b5a57..d7d43bcd27d 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--;
 }
 
 //