hw: always remove RM client on thread destruction

ref #589
This commit is contained in:
Martin Stein 2013-09-18 23:40:38 +02:00 committed by Norman Feske
parent 36111587be
commit 327cdfdf36
2 changed files with 18 additions and 5 deletions

View File

@ -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);
}

View File

@ -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<Pager_object *>(_rm_client);
assert(object);
Rm_session_component * const rm = _rm_client->member_rm_session();
assert(rm);
Pager_capability cap = reinterpret_cap_cast<Pager_object>(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<<MIN_MAPPING_SIZE_LOG2)-1));
+ platform()->vm_size() - sizeof(Native_utcb))
& ~((1<<MIN_MAPPING_SIZE_LOG2)-1));
/* attach UTCB */
if (!_rm_client) {