base: add remove_client to rm_session

Fixes #13
This commit is contained in:
Alexander Boettcher 2013-01-18 09:38:19 +01:00 committed by Norman Feske
parent f02958b25f
commit 9453d319cb
24 changed files with 99 additions and 34 deletions

View File

@ -49,6 +49,7 @@ void Thread_base::_init_platform_thread()
void Thread_base::_deinit_platform_thread()
{
env()->cpu_session()->kill_thread(_thread_cap);
env()->rm_session()->remove_client(_pager_cap);
}
@ -63,8 +64,8 @@ void Thread_base::start()
env()->pd_session()->bind_thread(_thread_cap);
/* 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_cap = env()->rm_session()->add_client(_thread_cap);
env()->cpu_session()->set_pager(_thread_cap, _pager_cap);
/* register initial IP and SP at core */
addr_t thread_sp = (addr_t)&_context->stack[-4];

View File

@ -42,6 +42,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability) {
return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability) { }
State state() { return State(); }

View File

@ -33,6 +33,7 @@ void Thread_base::_deinit_platform_thread()
Cap_index *i = (Cap_index*)l4_utcb_tcr_u(_context->utcb)->user[UTCB_TCR_BADGE];
cap_map()->remove(i);
env()->cpu_session()->kill_thread(_thread_cap);
env()->rm_session()->remove_client(_pager_cap);
}
}
@ -50,8 +51,8 @@ void Thread_base::start()
env()->pd_session()->bind_thread(_thread_cap);
/* 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_cap = env()->rm_session()->add_client(_thread_cap);
env()->cpu_session()->set_pager(_thread_cap, _pager_cap);
/* get gate-capability and badge of new thread */
Thread_state state;

View File

@ -61,6 +61,7 @@ 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);
}
@ -76,8 +77,8 @@ void Thread_base::start()
env()->pd_session()->bind_thread(_thread_cap);
/* 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_cap = env()->rm_session()->add_client(_thread_cap);
env()->cpu_session()->set_pager(_thread_cap, _pager_cap);
/* attach UTCB */
try {

View File

@ -252,6 +252,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) {
return Pager_capability(); }
void remove_client(Pager_capability pager) { }
void fault_handler(Signal_context_capability handler) { }
State state() { return State(); }

View File

@ -46,6 +46,9 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) {
return _local()->add_client(thread); }
void remove_client(Pager_capability pager) {
_local()->remove_client(pager); }
void fault_handler(Signal_context_capability handler)
{
/*

View File

@ -65,6 +65,8 @@ class Context_area_rm_session : public Genode::Rm_session
Genode::Pager_capability add_client(Genode::Thread_capability) {
return Genode::Pager_capability(); }
void remove_client(Genode::Pager_capability) { }
void fault_handler(Genode::Signal_context_capability) { }
State state() { return State(); }

View File

@ -48,6 +48,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability) {
return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability) { }
State state() { return State(); }

View File

@ -44,6 +44,7 @@ void Thread_base::_init_platform_thread() { }
void Thread_base::_deinit_platform_thread()
{
env()->cpu_session()->kill_thread(_thread_cap);
env()->rm_session()->remove_client(_pager_cap);
}
@ -58,8 +59,8 @@ void Thread_base::start()
env()->pd_session()->bind_thread(_thread_cap);
/* 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_cap = env()->rm_session()->add_client(_thread_cap);
env()->cpu_session()->set_pager(_thread_cap, _pager_cap);
/* register initial IP and SP at core */
addr_t thread_sp = (addr_t)&_context->stack[-4];

View File

@ -42,6 +42,9 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) {
return call<Rpc_add_client>(thread); }
void remove_client(Pager_capability pager) {
call<Rpc_remove_client>(pager); }
void fault_handler(Signal_context_capability handler) {
call<Rpc_fault_handler>(handler); }

View File

@ -213,12 +213,11 @@ Rpc_entrypoint::Rpc_entrypoint(Cap_session *cap_session, size_t stack_size,
*/
if (_tid.ec_sel == ~0UL) {
/* create new pager object and assign it to the new thread */
Pager_capability pager_cap =
env()->rm_session()->add_client(_thread_cap);
if (!pager_cap.valid())
_pager_cap = env()->rm_session()->add_client(_thread_cap);
if (!_pager_cap.valid())
throw Cpu_session::Thread_creation_failed();
if (env()->cpu_session()->set_pager(_thread_cap, pager_cap))
if (env()->cpu_session()->set_pager(_thread_cap, _pager_cap))
throw Cpu_session::Thread_creation_failed();
addr_t thread_sp = (addr_t)&_context->stack[-4];
@ -232,13 +231,13 @@ Rpc_entrypoint::Rpc_entrypoint(Cap_session *cap_session, size_t stack_size,
throw Cpu_session::Thread_creation_failed();
for (unsigned i = 0; i < Nova::PT_SEL_PARENT; i++)
request_event_portal(pager_cap, _tid.exc_pt_sel, i);
request_event_portal(_pager_cap, _tid.exc_pt_sel, i);
request_event_portal(pager_cap, _tid.exc_pt_sel,
request_event_portal(_pager_cap, _tid.exc_pt_sel,
Nova::PT_SEL_STARTUP);
request_event_portal(pager_cap, _tid.exc_pt_sel,
request_event_portal(_pager_cap, _tid.exc_pt_sel,
Nova::SM_SEL_EC);
request_event_portal(pager_cap, _tid.exc_pt_sel,
request_event_portal(_pager_cap, _tid.exc_pt_sel,
Nova::PT_SEL_RECALL);
/*

View File

@ -90,11 +90,17 @@ void Thread_base::_deinit_platform_thread()
revoke(Mem_crd(utcb >> 12, 0, rwx));
/* de-announce thread */
env()->cpu_session()->kill_thread(_thread_cap);
revoke(_thread_cap.local_name(), 0);
cap_selector_allocator()->free(_thread_cap.local_name(), 0);
if (_thread_cap.valid()) {
env()->cpu_session()->kill_thread(_thread_cap);
revoke(_thread_cap.local_name(), 0);
cap_selector_allocator()->free(_thread_cap.local_name(), 0);
}
if (_pager_cap.valid()) {
env()->rm_session()->remove_client(_pager_cap);
revoke(_pager_cap.local_name(), 0);
cap_selector_allocator()->free(_pager_cap.local_name(), 0);
}
}
@ -106,12 +112,11 @@ void Thread_base::start()
using namespace Genode;
/* create new pager object and assign it to the new thread */
Pager_capability pager_cap =
env()->rm_session()->add_client(_thread_cap);
if (!pager_cap.valid())
_pager_cap = env()->rm_session()->add_client(_thread_cap);
if (!_pager_cap.valid())
throw Cpu_session::Thread_creation_failed();
if (env()->cpu_session()->set_pager(_thread_cap, pager_cap))
if (env()->cpu_session()->set_pager(_thread_cap, _pager_cap))
throw Cpu_session::Thread_creation_failed();
/* create EC at core */
@ -139,11 +144,11 @@ void Thread_base::start()
/* request exception portals for normal threads */
if (!_tid.is_vcpu) {
for (unsigned i = 0; i < PT_SEL_PARENT; i++)
request_event_portal(pager_cap, _tid.exc_pt_sel, i);
request_event_portal(_pager_cap, _tid.exc_pt_sel, i);
request_event_portal(pager_cap, _tid.exc_pt_sel, PT_SEL_STARTUP);
request_event_portal(pager_cap, _tid.exc_pt_sel, SM_SEL_EC);
request_event_portal(pager_cap, _tid.exc_pt_sel, PT_SEL_RECALL);
request_event_portal(_pager_cap, _tid.exc_pt_sel, PT_SEL_STARTUP);
request_event_portal(_pager_cap, _tid.exc_pt_sel, SM_SEL_EC);
request_event_portal(_pager_cap, _tid.exc_pt_sel, PT_SEL_RECALL);
}
/* request creation of SC to let thread run*/

View File

@ -50,6 +50,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) {
return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability handler) { }
State state() { return State(); }

View File

@ -47,6 +47,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) {
return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability handler) { }
State state() { return State(); }

View File

@ -92,6 +92,11 @@ namespace Genode {
return Pager_capability();
}
void remove_client(Pager_capability pager)
{
Rm_session_client::remove_client(pager);
}
};
class Expanding_ram_session_client : public Ram_session_client

View File

@ -239,10 +239,14 @@ namespace Genode {
* Capability for this thread (set by _start())
*
* Used if thread creation involves core's CPU service.
* Currently, this is not the case for NOVA.
*/
Genode::Thread_capability _thread_cap;
/**
* Capability to pager paging this thread (created by _start())
*/
Genode::Pager_capability _pager_cap;
/**
* Pointer to corresponding thread context
*/

View File

@ -39,6 +39,9 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) {
return call<Rpc_add_client>(thread); }
void remove_client(Pager_capability pager) {
call<Rpc_remove_client>(pager); }
void fault_handler(Signal_context_capability handler) {
call<Rpc_fault_handler>(handler); }

View File

@ -164,6 +164,13 @@ namespace Genode {
*/
virtual Pager_capability add_client(Thread_capability thread) = 0;
/**
* Remove client from pager
*
* \param pager pager capability of client to be removed
*/
virtual void remove_client(Pager_capability) = 0;
/**
* Register signal handler for region-manager faults
*
@ -197,12 +204,14 @@ namespace Genode {
GENODE_RPC_THROW(Rpc_add_client, Pager_capability, add_client,
GENODE_TYPE_LIST(Invalid_thread, Out_of_metadata),
Thread_capability);
GENODE_RPC(Rpc_remove_client, void, remove_client, Pager_capability);
GENODE_RPC(Rpc_fault_handler, void, fault_handler, Signal_context_capability);
GENODE_RPC(Rpc_state, State, state);
GENODE_RPC(Rpc_dataspace, Dataspace_capability, dataspace);
GENODE_RPC_INTERFACE(Rpc_attach, Rpc_detach, Rpc_add_client,
Rpc_fault_handler, Rpc_state, Rpc_dataspace);
Rpc_remove_client, Rpc_fault_handler, Rpc_state,
Rpc_dataspace);
};
}

View File

@ -112,6 +112,8 @@ class Context_area_rm_session : public Rm_session
Pager_capability add_client(Thread_capability) {
return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability) { }
State state() { return State(); }

View File

@ -54,6 +54,8 @@ namespace Genode {
Pager_capability add_client(Thread_capability thread) {
return Pager_capability(); }
void remove_client(Pager_capability) { }
void fault_handler(Signal_context_capability handler) { }
State state() { return State(); }

View File

@ -81,9 +81,8 @@ namespace L4lx {
env()->pd_session()->bind_thread(_thread_cap);
/* create new pager object and assign it to the new thread */
Pager_capability pager_cap =
env()->rm_session()->add_client(_thread_cap);
vcpu_connection()->set_pager(_thread_cap, pager_cap);
_pager_cap = env()->rm_session()->add_client(_thread_cap);
vcpu_connection()->set_pager(_thread_cap, _pager_cap);
/* get gate-capability and badge of new thread */
Thread_state state = vcpu_connection()->state(_thread_cap);

View File

@ -118,6 +118,15 @@ Pager_capability Rm_session_component::add_client(Thread_capability thread)
}
void Rm_session_component::remove_client(Pager_capability pager)
{
if (verbose)
PDBG("remove_client()");
return _parent_rm_session.remove_client(pager);
}
void Rm_session_component::fault_handler(Signal_context_capability handler)
{
if (verbose)

View File

@ -96,7 +96,8 @@ namespace Gdb_monitor {
Genode::off_t, bool, Local_addr, bool);
void detach (Local_addr);
Pager_capability add_client (Thread_capability);
void fault_handler (Signal_context_capability handler);
void remove_client (Pager_capability);
void fault_handler (Signal_context_capability);
State state ();
Dataspace_capability dataspace ();
};

View File

@ -230,6 +230,11 @@ namespace Noux {
return _rm.add_client(thread);
}
void remove_client(Pager_capability pager)
{
_rm.remove_client(pager);
}
void fault_handler(Signal_context_capability handler)
{
return _rm.fault_handler(handler);