loader: API transition

Ref #1987
This commit is contained in:
Norman Feske 2017-01-04 15:05:37 +01:00
parent b7474bceff
commit 3ae19a9eb7
5 changed files with 180 additions and 164 deletions

View File

@ -24,7 +24,6 @@
#include <pd_session/connection.h>
#include <region_map/client.h>
namespace Loader {
using namespace Genode;
@ -32,91 +31,97 @@ namespace Loader {
typedef Registered<Parent_service> Parent_service;
typedef Registry<Parent_service> Parent_services;
class Child : public Child_policy
{
private:
Env &_env;
Session_label const _label;
Name const _binary_name;
size_t const _ram_quota;
Parent_services &_parent_services;
Service &_local_nitpicker_service;
Service &_local_rom_service;
Service &_local_cpu_service;
Service &_local_pd_service;
Genode::Child _child;
public:
Child(Env &env,
Name const &binary_name,
Session_label const &label,
size_t ram_quota,
Parent_services &parent_services,
Service &local_rom_service,
Service &local_cpu_service,
Service &local_pd_service,
Service &local_nitpicker_service,
Signal_context_capability fault_sigh)
:
_env(env),
_label(label),
_binary_name(binary_name),
_ram_quota(Genode::Child::effective_ram_quota(ram_quota)),
_parent_services(parent_services),
_local_nitpicker_service(local_nitpicker_service),
_local_rom_service(local_rom_service),
_local_cpu_service(local_cpu_service),
_local_pd_service(local_pd_service),
_child(_env.rm(), _env.ep().rpc_ep(), *this)
{ }
~Child() { }
/****************************
** Child-policy interface **
****************************/
Name name() const override { return _label; }
Binary_name binary_name() const override { return _binary_name; }
Ram_session &ref_ram() override { return _env.ram(); }
Ram_session_capability ref_ram_cap() const override { return _env.ram_session_cap(); }
void init(Ram_session &ram, Ram_session_capability ram_cap) override
{
ram.ref_account(ref_ram_cap());
ref_ram().transfer_quota(ram_cap, _ram_quota);
}
Service &resolve_session_request(Service::Name const &name,
Session_state::Args const &args) override
{
if (name == "Nitpicker") return _local_nitpicker_service;
if (name == "ROM") return _local_rom_service;
if (name == "CPU") return _local_cpu_service;
if (name == "PD") return _local_pd_service;
/* populate session-local parent service registry on demand */
Service *service = nullptr;
_parent_services.for_each([&] (Parent_service &s) {
if (s.name() == name)
service = &s; });
if (service)
return *service;
return *new (env()->heap()) Parent_service(_parent_services, name);
}
};
class Child;
}
class Loader::Child : public Child_policy
{
private:
Env &_env;
Allocator &_alloc;
Session_label const _label;
Name const _binary_name;
size_t const _ram_quota;
Parent_services &_parent_services;
Service &_local_nitpicker_service;
Service &_local_rom_service;
Service &_local_cpu_service;
Service &_local_pd_service;
Genode::Child _child;
public:
Child(Env &env,
Allocator &alloc,
Name const &binary_name,
Session_label const &label,
size_t ram_quota,
Parent_services &parent_services,
Service &local_rom_service,
Service &local_cpu_service,
Service &local_pd_service,
Service &local_nitpicker_service,
Signal_context_capability fault_sigh)
:
_env(env),
_alloc(alloc),
_label(label),
_binary_name(binary_name),
_ram_quota(Genode::Child::effective_ram_quota(ram_quota)),
_parent_services(parent_services),
_local_nitpicker_service(local_nitpicker_service),
_local_rom_service(local_rom_service),
_local_cpu_service(local_cpu_service),
_local_pd_service(local_pd_service),
_child(_env.rm(), _env.ep().rpc_ep(), *this)
{ }
~Child() { }
/****************************
** Child-policy interface **
****************************/
Name name() const override { return _label; }
Binary_name binary_name() const override { return _binary_name; }
Ram_session &ref_ram() override { return _env.ram(); }
Ram_session_capability ref_ram_cap() const override { return _env.ram_session_cap(); }
void init(Ram_session &ram, Ram_session_capability ram_cap) override
{
ram.ref_account(ref_ram_cap());
ref_ram().transfer_quota(ram_cap, _ram_quota);
}
Service &resolve_session_request(Service::Name const &name,
Session_state::Args const &args) override
{
if (name == "Nitpicker") return _local_nitpicker_service;
if (name == "ROM") return _local_rom_service;
if (name == "CPU") return _local_cpu_service;
if (name == "PD") return _local_pd_service;
/* populate session-local parent service registry on demand */
Service *service = nullptr;
_parent_services.for_each([&] (Parent_service &s) {
if (s.name() == name)
service = &s; });
if (service)
return *service;
return *new (_alloc) Parent_service(_parent_services, name);
}
};
#endif /* _CHILD_H_ */

View File

@ -39,9 +39,10 @@ class Input::Session_component : public Rpc_object<Session>
{
private:
Session_client _real_input;
Motion_delta &_motion_delta;
Event * const _ev_buf;
Session_client _real_input;
Motion_delta &_motion_delta;
Attached_dataspace _ev_ds;
Event * const _ev_buf;
Genode::Signal_context_capability _sigh;
@ -50,18 +51,15 @@ class Input::Session_component : public Rpc_object<Session>
/**
* Constructor
*/
Session_component(Session_capability real_input,
Session_component(Region_map &rm,
Session_capability real_input,
Motion_delta &motion_delta)
:
_real_input(real_input), _motion_delta(motion_delta),
_ev_buf(env()->rm_session()->attach(_real_input.dataspace()))
_ev_ds(rm, _real_input.dataspace()),
_ev_buf(_ev_ds.local_addr<Event>())
{ }
/**
* Destructor
*/
~Session_component() { env()->rm_session()->detach(_ev_buf); }
/*****************************
** Input session interface **

View File

@ -160,6 +160,7 @@ class Loader::Session_component : public Rpc_object<Session>
struct Local_nitpicker_factory : Local_service<Nitpicker::Session_component>::Factory
{
Entrypoint &_ep;
Region_map &_rm;
Ram_session &_ram;
Area _max_size;
@ -169,8 +170,8 @@ class Loader::Session_component : public Rpc_object<Session>
Constructible<Nitpicker::Session_component> session;
Local_nitpicker_factory(Entrypoint &ep, Ram_session &ram)
: _ep(ep), _ram(ram) { }
Local_nitpicker_factory(Entrypoint &ep, Region_map &rm, Ram_session &ram)
: _ep(ep), _rm(rm), _ram(ram) { }
void constrain_geometry(Area size) { _max_size = size; }
@ -186,7 +187,7 @@ class Loader::Session_component : public Rpc_object<Session>
throw Parent::Service_denied();
}
session.construct(_ep, _ram, _max_size,
session.construct(_ep, _rm, _ram, _max_size,
_parent_view, view_ready_sigh, args.string());
return *session;
}
@ -212,7 +213,7 @@ class Loader::Session_component : public Rpc_object<Session>
Local_rom_service _rom_service { _rom_factory };
Local_cpu_service _cpu_service { _env };
Local_pd_service _pd_service { _env };
Local_nitpicker_factory _nitpicker_factory { _env.ep(), _local_ram };
Local_nitpicker_factory _nitpicker_factory { _env.ep(), _env.rm(), _local_ram };
Local_nitpicker_service _nitpicker_service { _nitpicker_factory };
Signal_context_capability _fault_sigh;
Constructible<Child> _child;
@ -264,7 +265,7 @@ class Loader::Session_component : public Rpc_object<Session>
* on demand. Revert those allocations.
*/
_parent_services.for_each([&] (Parent_service &service) {
destroy(env()->heap(), &service); });
destroy(_md_alloc, &service); });
}
@ -337,7 +338,7 @@ class Loader::Session_component : public Rpc_object<Session>
: _ram_quota;
try {
_child.construct(_env, binary_name.string(),
_child.construct(_env, _md_alloc, binary_name.string(),
prefixed_label(_label, Session_label(label.string())),
ram_quota, _parent_services, _rom_service,
_cpu_service, _pd_service, _nitpicker_service,
@ -397,17 +398,17 @@ namespace Loader { struct Main; }
struct Loader::Main
{
Env &env;
Env &_env;
Heap heap { env.ram(), env.rm() };
Heap _heap { _env.ram(), _env.rm() };
Attached_rom_dataspace config { env, "config" };
Attached_rom_dataspace _config { _env, "config" };
Root root { env, config.xml(), heap };
Root _root { _env, _config.xml(), _heap };
Main(Env &env) : env(env)
Main(Env &env) : _env(env)
{
env.parent().announce(env.ep().manage(root));
_env.parent().announce(_env.ep().manage(_root));
}
};

View File

@ -18,18 +18,20 @@
/* Genode includes */
#include <util/arg_string.h>
#include <util/misc_math.h>
#include <base/signal.h>
#include <os/attached_ram_dataspace.h>
#include <base/component.h>
#include <base/attached_ram_dataspace.h>
#include <nitpicker_session/connection.h>
#include <nitpicker_session/nitpicker_session.h>
/* local includes */
#include <input.h>
namespace Nitpicker { class Session_component; }
namespace Nitpicker {
using namespace Genode;
class Session_component;
}
class Nitpicker::Session_component : public Genode::Rpc_object<Session>
class Nitpicker::Session_component : public Rpc_object<Session>
{
private:
@ -37,9 +39,9 @@ class Nitpicker::Session_component : public Genode::Rpc_object<Session>
* Signal handler to be notified once the geometry of the view is
* known.
*/
Genode::Signal_context_capability _view_ready_sigh;
Signal_context_capability _view_ready_sigh;
Genode::Entrypoint &_ep;
Entrypoint &_ep;
Area _max_size;
@ -63,17 +65,16 @@ class Nitpicker::Session_component : public Genode::Rpc_object<Session>
Input::Motion_delta _motion_delta;
Input::Session_component _proxy_input;
Input::Session_capability _proxy_input_cap;
Input::Session_component _proxy_input;
static long _session_arg(const char *arg, const char *key) {
return Genode::Arg_string::find_arg(arg, key).long_value(0); }
return Arg_string::find_arg(arg, key).long_value(0); }
/*
* Command buffer
*/
typedef Nitpicker::Session::Command_buffer Command_buffer;
Genode::Attached_ram_dataspace _command_ds;
Attached_ram_dataspace _command_ds;
Command_buffer &_command_buffer = *_command_ds.local_addr<Command_buffer>();
void _propagate_view_offset()
@ -96,7 +97,7 @@ class Nitpicker::Session_component : public Genode::Rpc_object<Session>
_virt_view_geometry = command.geometry.rect;
if (!_virt_view_geometry_defined)
Genode::Signal_transmitter(_view_ready_sigh).submit();
Signal_transmitter(_view_ready_sigh).submit();
_virt_view_geometry_defined = true;
@ -121,13 +122,13 @@ class Nitpicker::Session_component : public Genode::Rpc_object<Session>
case Command::OP_TO_BACK:
{
Genode::warning("OP_TO_BACK not implemented");
warning("OP_TO_BACK not implemented");
return;
}
case Command::OP_BACKGROUND:
{
Genode::warning("OP_BACKGROUND not implemented");
warning("OP_BACKGROUND not implemented");
return;
}
@ -148,12 +149,13 @@ class Nitpicker::Session_component : public Genode::Rpc_object<Session>
/**
* Constructor
*/
Session_component(Genode::Entrypoint &ep,
Genode::Ram_session &ram,
Area max_size,
Nitpicker::View_capability parent_view,
Genode::Signal_context_capability view_ready_sigh,
const char *args)
Session_component(Entrypoint &ep,
Region_map &rm,
Ram_session &ram,
Area max_size,
Nitpicker::View_capability parent_view,
Signal_context_capability view_ready_sigh,
char const *args)
:
_view_ready_sigh(view_ready_sigh),
_ep(ep),
@ -165,11 +167,11 @@ class Nitpicker::Session_component : public Genode::Rpc_object<Session>
/* create nitpicker view */
_view_handle(_nitpicker.create_view(_parent_view_handle)),
_proxy_input(_nitpicker.input_session(), _motion_delta),
_proxy_input_cap(_ep.manage(_proxy_input)),
_proxy_input(rm, _nitpicker.input_session(), _motion_delta),
_command_ds(&ram, sizeof(Command_buffer))
{
_ep.manage(_proxy_input);
_ep.manage(*this);
}
@ -191,7 +193,7 @@ class Nitpicker::Session_component : public Genode::Rpc_object<Session>
Input::Session_capability input_session() override
{
return _proxy_input_cap;
return _proxy_input.cap();
}
View_handle create_view(View_handle) override
@ -213,7 +215,7 @@ class Nitpicker::Session_component : public Genode::Rpc_object<Session>
void release_view_handle(View_handle) override { }
Genode::Dataspace_capability command_dataspace() override
Dataspace_capability command_dataspace() override
{
return _command_ds.cap();
}
@ -238,14 +240,14 @@ class Nitpicker::Session_component : public Genode::Rpc_object<Session>
_nitpicker.mode().format());
}
void mode_sigh(Genode::Signal_context_capability) override { }
void mode_sigh(Signal_context_capability) override { }
void buffer(Framebuffer::Mode mode, bool use_alpha) override
{
_nitpicker.buffer(mode, use_alpha);
}
void focus(Genode::Capability<Session>) override { }
void focus(Capability<Session>) override { }
/**
* Return geometry of loader view
@ -253,11 +255,11 @@ class Nitpicker::Session_component : public Genode::Rpc_object<Session>
Area loader_view_size() const
{
int const width = _max_size.valid()
? Genode::min(_virt_view_geometry.w(), _max_size.w())
? min(_virt_view_geometry.w(), _max_size.w())
: _virt_view_geometry.w();
int const height = _max_size.valid()
? Genode::min(_virt_view_geometry.h(), _max_size.h())
? min(_virt_view_geometry.h(), _max_size.h())
: _virt_view_geometry.h();
return Area(width, height);

View File

@ -11,42 +11,52 @@
* under the terms of the GNU General Public License version 2.
*/
#include <base/printf.h>
#include <base/sleep.h>
#include <base/component.h>
#include <loader_session/connection.h>
#include <timer_session/connection.h>
namespace Test {
using namespace Genode;
struct Main;
}
int main(int argc, char **argv)
struct Test::Main
{
Loader::Connection loader(8*1024*1024);
Env &_env;
static Genode::Signal_receiver sig_rec;
Loader::Connection _loader { _env, 8*1024*1024 };
Timer::Connection _timer { _env };
Genode::Signal_context sig_ctx;
Loader::Area _size;
Loader::Point _pos;
loader.view_ready_sigh(sig_rec.manage(&sig_ctx));
loader.start("testnit", "test-label");
sig_rec.wait_for_signal();
Loader::Area size = loader.view_size();
Timer::Connection timer;
while (1) {
for (unsigned i = 0; i < 10; i++) {
loader.view_geometry(Loader::Rect(Loader::Point(50*i, 50*i), size),
Loader::Point(0, 0));
timer.msleep(1000);
}
void _handle_view_ready()
{
_size = _loader.view_size();
_timer.trigger_periodic(250*1000);
}
Genode::sleep_forever();
Signal_handler<Main> _view_ready_handler {
_env.ep(), *this, &Main::_handle_view_ready };
return 0;
}
void _handle_timer()
{
_loader.view_geometry(Loader::Rect(_pos, _size), Loader::Point(0, 0));
_pos = Loader::Point((_pos.x() + 50) % 500, (_pos.y() + 30) % 300);
}
Signal_handler<Main> _timer_handler {
_env.ep(), *this, &Main::_handle_timer };
Main(Env &env) : _env(env)
{
_loader.view_ready_sigh(_view_ready_handler);
_timer.sigh(_timer_handler);
_loader.start("testnit", "test-label");
}
};
void Component::construct(Genode::Env &env) { static Test::Main main(env); }