base: add reinit functionality to 'Env'

The 'reinit' and 'reinit_main_thread' methods are needed to implement
fork in Noux. Until now, they were provided by the 'Deprecated_env'
only.
This commit is contained in:
Norman Feske 2017-05-14 14:59:30 +02:00 committed by Christian Helmuth
parent ecf73e5b17
commit 53253ba422
4 changed files with 51 additions and 0 deletions

View File

@ -145,6 +145,33 @@ struct Genode::Env
* executes this function before constructing libc components.
*/
virtual void exec_static_constructors() = 0;
/**
* Reload parent capability and reinitialize environment resources
*
* This method is solely used for implementing fork in Noux. After forking
* a process, the new child process is executed within a copy of the
* address space of the forking process. Thereby, the new process inherits
* the original 'env' object of the forking process, which is meaningless
* in the context of the new process. By calling this function, the new
* process is able to reinitialize its 'env' with meaningful capabilities
* obtained via its updated parent capability.
*
* \noapi
*/
virtual void reinit(Native_capability::Raw) = 0;
/**
* Reinitialize main-thread object
*
* \param stack_area_rm new region map of the stack area
*
* This function is solely used for implementing fork as provided by the
* Noux environment.
*
* \noapi
*/
virtual void reinit_main_thread(Capability<Region_map> &stack_area_rm) = 0;
};
#endif /* _INCLUDE__BASE__ENV_H_ */

View File

@ -99,6 +99,16 @@ namespace {
return Genode::env_session_id_space();
}
void reinit(Native_capability::Raw raw) override
{
Genode::env_deprecated()->reinit(raw);
}
void reinit_main_thread(Capability<Region_map> &stack_area_rm) override
{
Genode::env_deprecated()->reinit_main_thread(stack_area_rm);
}
void _block_for_session()
{
/*

View File

@ -56,6 +56,14 @@ struct Qt_launchpad_namespace::Local_env : Genode::Env
void close(Parent::Client::Id id) { return genode_env.close(id); }
void exec_static_constructors() override { }
void reinit(Native_capability::Raw raw) override {
genode_env.reinit(raw);
}
void reinit_main_thread(Capability<Region_map> &stack_area_rm) override {
genode_env.reinit_main_thread(stack_area_rm);
}
};

View File

@ -161,6 +161,12 @@ class Libc::Env_implementation : public Libc::Env
/* already done by the libc */
void exec_static_constructors() override { }
void reinit(Native_capability::Raw raw) override {
_env.reinit(raw); }
void reinit_main_thread(Capability<Region_map> &stack_area_rm) override {
_env.reinit_main_thread(stack_area_rm); }
};