From 938c7fa130b60fbb1b9f4bca29e9657c6d8728d1 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Fri, 13 Jul 2012 12:48:27 +0200 Subject: [PATCH] NOVA: call kill_thread of cpu_session If a thread has been deleted the thread object at the cpu_session was never freed which caused the cpu_session quota to be exhausted as reported in issue #150. Fixes #150 --- base-nova/src/base/thread/thread_nova.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/base-nova/src/base/thread/thread_nova.cc b/base-nova/src/base/thread/thread_nova.cc index 43bf1e8cc2..77a4055a90 100644 --- a/base-nova/src/base/thread/thread_nova.cc +++ b/base-nova/src/base/thread/thread_nova.cc @@ -79,15 +79,15 @@ void Thread_base::_init_platform_thread() /* create thread at core */ char buf[48]; name(buf, sizeof(buf)); - Thread_capability thread_cap = env()->cpu_session()->create_thread(buf); + _thread_cap = env()->cpu_session()->create_thread(buf); /* create new pager object and assign it to the new thread */ - Pager_capability pager_cap = env()->rm_session()->add_client(thread_cap); - env()->cpu_session()->set_pager(thread_cap, pager_cap); + Pager_capability pager_cap = env()->rm_session()->add_client(_thread_cap); + env()->cpu_session()->set_pager(_thread_cap, pager_cap); /* register initial IP and SP at core */ mword_t thread_sp = (mword_t)&_context->stack[-4]; - env()->cpu_session()->start(thread_cap, (addr_t)_thread_start, thread_sp); + env()->cpu_session()->start(_thread_cap, (addr_t)_thread_start, thread_sp); request_event_portal(pager_cap, _tid.exc_pt_sel, PT_SEL_STARTUP); request_event_portal(pager_cap, _tid.exc_pt_sel, PT_SEL_PAGE_FAULT); @@ -115,6 +115,9 @@ void Thread_base::_deinit_platform_thread() Nova::Rights rwx(true, true, true); addr_t utcb = reinterpret_cast(&_context->utcb); Nova::revoke(Nova::Mem_crd(utcb >> 12, 0, rwx)); + + /* de-announce thread */ + env()->cpu_session()->kill_thread(_thread_cap); }