diff --git a/base-hw/src/base/thread_support.cc b/base-hw/src/base/thread_support.cc index dc53e774ae..3292c89c68 100644 --- a/base-hw/src/base/thread_support.cc +++ b/base-hw/src/base/thread_support.cc @@ -61,7 +61,9 @@ void Thread_base::_deinit_platform_thread() /* destroy object at the CPU session */ env()->cpu_session()->kill_thread(_thread_cap); - env()->rm_session()->remove_client(_pager_cap); + if (_pager_cap.valid()) { + env()->rm_session()->remove_client(_pager_cap); + } } @@ -99,6 +101,8 @@ void Thread_base::start() } -void Thread_base::cancel_blocking() { - env()->cpu_session()->cancel_blocking(_thread_cap); } +void Thread_base::cancel_blocking() +{ + env()->cpu_session()->cancel_blocking(_thread_cap); +} diff --git a/base-hw/src/core/platform_thread.cc b/base-hw/src/core/platform_thread.cc index 48b1d848fd..6f4e5fbc10 100644 --- a/base-hw/src/core/platform_thread.cc +++ b/base-hw/src/core/platform_thread.cc @@ -59,6 +59,15 @@ Platform_thread::~Platform_thread() assert(ram); ram->free(_utcb); } + /* release from pager */ + if (_rm_client) { + Pager_object * const object = dynamic_cast(_rm_client); + assert(object); + Rm_session_component * const rm = _rm_client->member_rm_session(); + assert(rm); + Pager_capability cap = reinterpret_cap_cast(object->cap()); + rm->remove_client(cap); + } /* destroy object at the kernel */ Kernel::delete_thread(_id); } @@ -157,8 +166,8 @@ int Platform_thread::start(void * ip, void * sp, unsigned int cpu_no) * Kernel afterwards offers this as bootstrap argument to the thread. */ _virt_utcb = (Native_utcb *)((platform()->vm_start() - + platform()->vm_size() - sizeof(Native_utcb)) - & ~((1<vm_size() - sizeof(Native_utcb)) + & ~((1<