mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-18 07:08:18 +00:00
base: support for multi-staged child startup
This patch enhances the 'Child' and 'Child_policy' with the ability to separate the different steps of bootstrapping children. If the 'Child_policy::initiate_env_sessions()' returns false, the child's environment sessions remain unrouted at construction time. This way, child objects for many children can be initialized to a state that allows the children to represent services for other children. Therefore, session routing can be applied before any child executes. At this stage, the environment RAM sessions of all children can be created. Note that this step still has the limitation that RAM sessions are generally expected to be provided by either the parent or a local service. Once all children are equipped with RAM, they can in principle receive session-quota donations. Hence, all other environment sessions can now be arbitrarily routed and initiated. Once the environment of a child is complete, the child's process and initial thread is created.
This commit is contained in:
committed by
Christian Helmuth
parent
9cba459958
commit
7d9f68493a
@ -712,6 +712,31 @@ void Child::_discard_env_session(Id_space<Parent::Client>::Id id)
|
||||
}
|
||||
|
||||
|
||||
void Child::initiate_env_ram_session() { _ram.initiate(); }
|
||||
|
||||
|
||||
void Child::initiate_env_sessions()
|
||||
{
|
||||
_pd .initiate();
|
||||
_cpu .initiate();
|
||||
_log .initiate();
|
||||
_binary.initiate();
|
||||
|
||||
/*
|
||||
* Issue environment-session request for obtaining the linker binary. We
|
||||
* accept this request to fail. In this case, the child creation may still
|
||||
* succeed if the binary is statically linked.
|
||||
*/
|
||||
try {
|
||||
_linker.construct(*this, Parent::Env::linker(), _policy.linker_name());
|
||||
_linker->initiate();
|
||||
}
|
||||
catch (Parent::Service_denied) { }
|
||||
|
||||
_try_construct_env_dependent_members();
|
||||
}
|
||||
|
||||
|
||||
Child::Child(Region_map &local_rm,
|
||||
Rpc_entrypoint &entrypoint,
|
||||
Child_policy &policy)
|
||||
@ -719,15 +744,10 @@ Child::Child(Region_map &local_rm,
|
||||
_policy(policy), _local_rm(local_rm), _entrypoint(entrypoint),
|
||||
_parent_cap(_entrypoint.manage(this))
|
||||
{
|
||||
/*
|
||||
* Issue environment-session request for obtaining the linker binary. We
|
||||
* accept this request to fail. In this case, the child creation may still
|
||||
* succeed if the binary is statically linked.
|
||||
*/
|
||||
try { _linker.construct(*this, Parent::Env::linker(), _policy.linker_name()); }
|
||||
catch (Parent::Service_denied) { }
|
||||
|
||||
_try_construct_env_dependent_members();
|
||||
if (_policy.initiate_env_sessions()) {
|
||||
initiate_env_ram_session();
|
||||
initiate_env_sessions();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user