From c76b81cddf7cd7b4aaebbe64bbf8c6565e3ce682 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sat, 4 Feb 2012 23:42:27 -0800 Subject: [PATCH] rt: Delete schedulers immediately upon release This will be needed once we support dynamically changing schedulers. --- src/rt/rust_kernel.cpp | 5 +---- src/rt/rust_kernel.h | 1 - src/rt/rust_scheduler.cpp | 5 +++++ 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/rt/rust_kernel.cpp b/src/rt/rust_kernel.cpp index 004e42a81382..8f41182d7910 100644 --- a/src/rt/rust_kernel.cpp +++ b/src/rt/rust_kernel.cpp @@ -21,10 +21,6 @@ rust_kernel::rust_kernel(rust_srv *srv, size_t num_threads) : live_schedulers = 1; } -rust_kernel::~rust_kernel() { - delete sched; -} - void rust_kernel::log(uint32_t level, char const *fmt, ...) { char buf[BUF_BYTES]; @@ -83,6 +79,7 @@ void rust_kernel::release_scheduler() { I(this, !sched_lock.lock_held_by_current_thread()); scoped_lock with(sched_lock); + delete sched; --live_schedulers; if (live_schedulers == 0) { // We're all done. Tell the main thread to continue diff --git a/src/rt/rust_kernel.h b/src/rt/rust_kernel.h index 9a59a35e9088..fdf9f5eb0f7e 100644 --- a/src/rt/rust_kernel.h +++ b/src/rt/rust_kernel.h @@ -47,7 +47,6 @@ public: struct rust_env *env; rust_kernel(rust_srv *srv, size_t num_threads); - ~rust_kernel(); void log(uint32_t level, char const *fmt, ...); void fatal(char const *fmt, ...); diff --git a/src/rt/rust_scheduler.cpp b/src/rt/rust_scheduler.cpp index 904eb5cafcb9..666733a43180 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();