mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-26 13:59:57 +00:00
This is a redesign of the root and parent interfaces to eliminate blocking RPC calls. - New session representation at the parent (base/session_state.h) - base-internal root proxy mechanism as migration path - Redesign of base/service.h - Removes ancient 'Connection::KEEP_OPEN' feature - Interface change of 'Child', 'Child_policy', 'Slave', 'Slave_policy' - New 'Slave::Connection' - Changed child-construction procedure to be compatible with the non-blocking parent interface and to be easier to use - The child's initial LOG session, its binary ROM session, and the linker ROM session have become part of the child's envirenment. - Session upgrading must now be performed via 'env.upgrade' instead of performing a sole RPC call the parent. To make RAM upgrades easier, the 'Connection' provides a new 'upgrade_ram' method. Issue #2120
85 lines
2.1 KiB
C++
85 lines
2.1 KiB
C++
/*
|
|
* \brief Utility for providing "session_requests" ROM to a child service
|
|
* \author Norman Feske
|
|
* \date 2016-11-10
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2016 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU General Public License version 2.
|
|
*/
|
|
|
|
#ifndef _INCLUDE__OS__SESSION_REQUESTER_H_
|
|
#define _INCLUDE__OS__SESSION_REQUESTER_H_
|
|
|
|
#include <parent/parent.h>
|
|
#include <os/dynamic_rom_session.h>
|
|
|
|
namespace Genode { class Session_requester; }
|
|
|
|
|
|
class Genode::Session_requester
|
|
{
|
|
private:
|
|
|
|
Id_space<Parent::Server> _id_space;
|
|
|
|
struct Content_producer : Dynamic_rom_session::Content_producer
|
|
{
|
|
Id_space<Parent::Server> &_id_space;
|
|
|
|
Content_producer(Id_space<Parent::Server> &id_space)
|
|
: _id_space(id_space) { }
|
|
|
|
void produce_content(char *dst, Genode::size_t dst_len) override
|
|
{
|
|
Xml_generator xml(dst, dst_len, "session_requests", [&] () {
|
|
_id_space.for_each<Session_state const>([&] (Session_state const &s) {
|
|
s.generate_session_request(xml); }); });
|
|
}
|
|
} _content_producer { _id_space };
|
|
|
|
typedef Local_service<Dynamic_rom_session> Service;
|
|
|
|
Dynamic_rom_session _session;
|
|
Service::Single_session_factory _factory { _session };
|
|
Service _service { _factory };
|
|
|
|
public:
|
|
|
|
typedef String<32> Rom_name;
|
|
|
|
static Rom_name rom_name() { return "session_requests"; }
|
|
|
|
/**
|
|
* Constructor
|
|
*
|
|
* \param ep entrypoint serving the local ROM service
|
|
* \param ram backing store for the ROM dataspace
|
|
* \param rm local address space, needed to populate the dataspace
|
|
*/
|
|
Session_requester(Rpc_entrypoint &ep, Ram_session &ram, Region_map &rm)
|
|
:
|
|
_session(ep, ram, rm, _content_producer)
|
|
{ }
|
|
|
|
/**
|
|
* Inform the child about a new version of the "session_requests" ROM
|
|
*/
|
|
void trigger_update() { _session.trigger_update(); }
|
|
|
|
/**
|
|
* ID space for sessios requests supplied to the child
|
|
*/
|
|
Id_space<Parent::Server> &id_space() { return _id_space; }
|
|
|
|
/**
|
|
* ROM service providing a single "session_requests" session
|
|
*/
|
|
Service &service() { return _service; }
|
|
};
|
|
|
|
#endif /* _INCLUDE__OS__SESSION_REQUESTER_H_ */
|