rt: Delete schedulers immediately upon release
This will be needed once we support dynamically changing schedulers.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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, ...);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user