mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-18 15:18:20 +00:00
base: replace obj_by_* by lookup_and_lock
Add functionality to lookup an object and lock it. Additional the case is handled that a object may be already in-destruction and the lookup will deny returning the object. The object_pool generalize the lookup and lock functionality of the rpc_server and serve as base for following up patches to fix dangling pointer issues.
This commit is contained in:
committed by
Norman Feske
parent
ca37f26a01
commit
c2d3543e62
@ -15,9 +15,8 @@ using namespace Genode;
|
||||
|
||||
void Cpu_session_component::thread_id(Thread_capability thread_cap, int pid, int tid)
|
||||
{
|
||||
Lock::Guard lock_guard(_thread_list_lock);
|
||||
|
||||
Cpu_thread_component *thread = _lookup_thread(thread_cap);
|
||||
Object_pool<Cpu_thread_component>::Guard
|
||||
thread(_thread_ep->lookup_and_lock(thread_cap));
|
||||
if (!thread) return;
|
||||
|
||||
thread->platform_thread()->thread_id(pid, tid);
|
||||
@ -26,9 +25,8 @@ void Cpu_session_component::thread_id(Thread_capability thread_cap, int pid, int
|
||||
|
||||
Untyped_capability Cpu_session_component::server_sd(Thread_capability thread_cap)
|
||||
{
|
||||
Lock::Guard lock_guard(_thread_list_lock);
|
||||
|
||||
Cpu_thread_component *thread = _lookup_thread(thread_cap);
|
||||
Object_pool<Cpu_thread_component>::Guard
|
||||
thread(_thread_ep->lookup_and_lock(thread_cap));
|
||||
if (!thread) return Untyped_capability();
|
||||
|
||||
enum { DUMMY_LOCAL_NAME = 0 };
|
||||
@ -40,9 +38,8 @@ Untyped_capability Cpu_session_component::server_sd(Thread_capability thread_cap
|
||||
|
||||
Untyped_capability Cpu_session_component::client_sd(Thread_capability thread_cap)
|
||||
{
|
||||
Lock::Guard lock_guard(_thread_list_lock);
|
||||
|
||||
Cpu_thread_component *thread = _lookup_thread(thread_cap);
|
||||
Object_pool<Cpu_thread_component>::Guard
|
||||
thread(_thread_ep->lookup_and_lock(thread_cap));
|
||||
if (!thread) return Untyped_capability();
|
||||
|
||||
enum { DUMMY_LOCAL_NAME = 0 };
|
||||
|
@ -126,13 +126,6 @@ namespace Genode {
|
||||
{
|
||||
enum { STACK_SIZE = 2048 * sizeof(Genode::addr_t) };
|
||||
|
||||
template <typename T>
|
||||
T *lookup(Capability<T> cap)
|
||||
{
|
||||
Rpc_object_base *obj = obj_by_cap(cap);
|
||||
return obj ? dynamic_cast<T *>(obj) : 0;
|
||||
}
|
||||
|
||||
Entrypoint(Cap_session *cap_session)
|
||||
:
|
||||
Rpc_entrypoint(cap_session, STACK_SIZE, "entrypoint")
|
||||
|
@ -104,16 +104,6 @@ namespace Genode {
|
||||
*/
|
||||
Signal_context_capability _default_exception_handler;
|
||||
|
||||
/**
|
||||
* Lookup thread in CPU session by its capability
|
||||
*
|
||||
* \retval NULL thread capability is invalid or
|
||||
* does not belong to the CPU session
|
||||
*/
|
||||
Cpu_thread_component *_lookup_thread(Thread_capability thread) {
|
||||
return dynamic_cast<Cpu_thread_component *>
|
||||
(_thread_ep->obj_by_cap(thread)); }
|
||||
|
||||
/**
|
||||
* Raw thread-killing functionality
|
||||
*
|
||||
|
@ -365,8 +365,7 @@ int Pd_session_component::assign_parent(Parent_capability parent)
|
||||
void Pd_session_component::start(Capability<Dataspace> binary)
|
||||
{
|
||||
/* lookup binary dataspace */
|
||||
Dataspace_component *ds =
|
||||
reinterpret_cast<Dataspace_component *>(_ds_ep->obj_by_cap(binary));
|
||||
Object_pool<Dataspace_component>::Guard ds(_ds_ep->lookup_and_lock(binary));
|
||||
|
||||
if (!ds) {
|
||||
PERR("could not lookup binary, aborted PD startup");
|
||||
|
@ -161,7 +161,9 @@ Platform_env_base::Rm_session_mmap::_dataspace_size(Capability<Dataspace> ds_cap
|
||||
}
|
||||
|
||||
/* use local function call if called from the entrypoint */
|
||||
Dataspace *ds = core_env()->entrypoint()->lookup(ds_cap);
|
||||
Object_pool<Rpc_object_base>::Guard
|
||||
ds_rpc(core_env()->entrypoint()->lookup_and_lock(ds_cap));
|
||||
Dataspace * ds = dynamic_cast<Dataspace *>(&*ds_rpc);
|
||||
return ds ? ds->size() : 0;
|
||||
}
|
||||
|
||||
@ -178,7 +180,9 @@ int Platform_env_base::Rm_session_mmap::_dataspace_fd(Capability<Dataspace> ds_c
|
||||
|
||||
Capability<Linux_dataspace> lx_ds_cap = static_cap_cast<Linux_dataspace>(ds_cap);
|
||||
|
||||
Linux_dataspace *ds = core_env()->entrypoint()->lookup(lx_ds_cap);
|
||||
Object_pool<Rpc_object_base>::Guard
|
||||
ds_rpc(core_env()->entrypoint()->lookup_and_lock(lx_ds_cap));
|
||||
Linux_dataspace * ds = dynamic_cast<Linux_dataspace *>(&*ds_rpc);
|
||||
|
||||
return ds ? ds->fd().dst().socket : -1;
|
||||
}
|
||||
@ -194,7 +198,9 @@ bool Platform_env_base::Rm_session_mmap::_dataspace_writable(Dataspace_capabilit
|
||||
return writable;
|
||||
}
|
||||
|
||||
Dataspace *ds = core_env()->entrypoint()->lookup(ds_cap);
|
||||
Object_pool<Rpc_object_base>::Guard
|
||||
ds_rpc(core_env()->entrypoint()->lookup_and_lock(ds_cap));
|
||||
Dataspace * ds = dynamic_cast<Dataspace *>(&*ds_rpc);
|
||||
|
||||
return ds ? ds->writable() : false;
|
||||
}
|
||||
|
Reference in New Issue
Block a user