about summary refs log tree commit diff
path: root/src/rt/rust_scheduler.cpp
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-02-04 23:42:27 -0800
committerBrian Anderson <banderson@mozilla.com>2012-02-08 15:33:40 -0800
commitc76b81cddf7cd7b4aaebbe64bbf8c6565e3ce682 (patch)
tree1d2635bcf60d3b6ce6025079503ca463dbb18295 /src/rt/rust_scheduler.cpp
parentf39e64d56ab4929be5985d4a64020d2223706d96 (diff)
downloadrust-c76b81cddf7cd7b4aaebbe64bbf8c6565e3ce682.tar.gz
rust-c76b81cddf7cd7b4aaebbe64bbf8c6565e3ce682.zip
rt: Delete schedulers immediately upon release
This will be needed once we support dynamically changing schedulers.
Diffstat (limited to 'src/rt/rust_scheduler.cpp')
-rw-r--r--src/rt/rust_scheduler.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/rt/rust_scheduler.cpp b/src/rt/rust_scheduler.cpp
index 904eb5cafcb..666733a4318 100644
--- a/src/rt/rust_scheduler.cpp
+++ b/src/rt/rust_scheduler.cpp
@@ -56,6 +56,11 @@ rust_scheduler::destroy_task_threads() {
 void
 rust_scheduler::start_task_threads()
 {
+    // Copy num_threads because it's possible for the last thread
+    // to terminate and have the kernel delete us before we
+    // hit the last check against num_threads, in which case
+    // we would be accessing invalid memory.
+    uintptr_t num_threads = this->num_threads;
     for(size_t i = 0; i < num_threads; ++i) {
         rust_task_thread *thread = threads[i];
         thread->start();