rt: Delete schedulers immediately upon release

This will be needed once we support dynamically changing schedulers.
This commit is contained in:
Brian Anderson
2012-02-04 23:42:27 -08:00
parent f39e64d56a
commit c76b81cddf
3 changed files with 6 additions and 5 deletions

View File

@@ -21,10 +21,6 @@ rust_kernel::rust_kernel(rust_srv *srv, size_t num_threads) :
live_schedulers = 1; live_schedulers = 1;
} }
rust_kernel::~rust_kernel() {
delete sched;
}
void void
rust_kernel::log(uint32_t level, char const *fmt, ...) { rust_kernel::log(uint32_t level, char const *fmt, ...) {
char buf[BUF_BYTES]; char buf[BUF_BYTES];
@@ -83,6 +79,7 @@ void
rust_kernel::release_scheduler() { rust_kernel::release_scheduler() {
I(this, !sched_lock.lock_held_by_current_thread()); I(this, !sched_lock.lock_held_by_current_thread());
scoped_lock with(sched_lock); scoped_lock with(sched_lock);
delete sched;
--live_schedulers; --live_schedulers;
if (live_schedulers == 0) { if (live_schedulers == 0) {
// We're all done. Tell the main thread to continue // We're all done. Tell the main thread to continue

View File

@@ -47,7 +47,6 @@ public:
struct rust_env *env; struct rust_env *env;
rust_kernel(rust_srv *srv, size_t num_threads); rust_kernel(rust_srv *srv, size_t num_threads);
~rust_kernel();
void log(uint32_t level, char const *fmt, ...); void log(uint32_t level, char const *fmt, ...);
void fatal(char const *fmt, ...); void fatal(char const *fmt, ...);

View File

@@ -56,6 +56,11 @@ rust_scheduler::destroy_task_threads() {
void void
rust_scheduler::start_task_threads() 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) { for(size_t i = 0; i < num_threads; ++i) {
rust_task_thread *thread = threads[i]; rust_task_thread *thread = threads[i];
thread->start(); thread->start();