From 3863de95898db861baff7a43d9513083ca7b1fdf Mon Sep 17 00:00:00 2001 From: Norman Feske <norman.feske@genode-labs.com> Date: Thu, 2 Jul 2020 20:10:08 +0200 Subject: [PATCH] Input-event-bridging service The sole purpose of this service is the migration path from the use of input session interface to the event session interface. Issue #3812 --- .../recipes/src/input_event_bridge/content.mk | 2 + repos/os/recipes/src/input_event_bridge/hash | 1 + .../recipes/src/input_event_bridge/used_apis | 4 + .../os/src/server/input_event_bridge/main.cc | 96 +++++++++++++++++++ .../src/server/input_event_bridge/target.mk | 3 + 5 files changed, 106 insertions(+) create mode 100644 repos/os/recipes/src/input_event_bridge/content.mk create mode 100644 repos/os/recipes/src/input_event_bridge/hash create mode 100644 repos/os/recipes/src/input_event_bridge/used_apis create mode 100644 repos/os/src/server/input_event_bridge/main.cc create mode 100644 repos/os/src/server/input_event_bridge/target.mk diff --git a/repos/os/recipes/src/input_event_bridge/content.mk b/repos/os/recipes/src/input_event_bridge/content.mk new file mode 100644 index 0000000000..a55b5a0699 --- /dev/null +++ b/repos/os/recipes/src/input_event_bridge/content.mk @@ -0,0 +1,2 @@ +SRC_DIR = src/server/input_event_bridge +include $(GENODE_DIR)/repos/base/recipes/src/content.inc diff --git a/repos/os/recipes/src/input_event_bridge/hash b/repos/os/recipes/src/input_event_bridge/hash new file mode 100644 index 0000000000..317170c6b5 --- /dev/null +++ b/repos/os/recipes/src/input_event_bridge/hash @@ -0,0 +1 @@ +2020-07-02 7738008ffb465e667621655e8718f02290361bc0 diff --git a/repos/os/recipes/src/input_event_bridge/used_apis b/repos/os/recipes/src/input_event_bridge/used_apis new file mode 100644 index 0000000000..a2645a0156 --- /dev/null +++ b/repos/os/recipes/src/input_event_bridge/used_apis @@ -0,0 +1,4 @@ +base +os +event_session +input_session diff --git a/repos/os/src/server/input_event_bridge/main.cc b/repos/os/src/server/input_event_bridge/main.cc new file mode 100644 index 0000000000..8abd09e99c --- /dev/null +++ b/repos/os/src/server/input_event_bridge/main.cc @@ -0,0 +1,96 @@ +/* + * \brief Service for connecting an input client with an event client + * \author Norman Feske + * \date 2020-07-02 + */ + +/* + * Copyright (C) 2020 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +/* Genode includes */ +#include <event_session/event_session.h> +#include <input/component.h> +#include <input/event.h> +#include <os/static_root.h> +#include <base/component.h> +#include <base/attached_ram_dataspace.h> + +namespace Input_event_bridge { + + using namespace Genode; + + struct Event_session; + struct Main; +} + + +struct Input_event_bridge::Event_session : Rpc_object<Event::Session, Event_session> +{ + Attached_ram_dataspace _ds; + + Input::Session_component &_input_session; + + Dataspace_capability dataspace() { return _ds.cap(); } + + void submit_batch(unsigned count) + { + size_t const max_events = _ds.size() / sizeof(Input::Event); + + if (count > max_events) + warning("number of events exceeds dataspace capacity"); + + count = min(count, max_events); + + Input::Event const * const events = _ds.local_addr<Input::Event>(); + + for (unsigned i = 0; i < count; i++) + _input_session.submit(events[i]); + } + + Event_session(Env &env, Input::Session_component &input_session) + : + _ds(env.ram(), env.rm(), 4096), _input_session(input_session) + { } +}; + + +/****************** + ** Main program ** + ******************/ + +struct Input_event_bridge::Main +{ + Env &_env; + + Attached_ram_dataspace _ds { _env.ram(), _env.rm(), 4096 }; + + Input::Session_component _input_session { _env, _env.ram() }; + Event_session _event_session { _env, _input_session }; + + /* + * Attach root interfaces to the entry point + */ + Static_root<Input::Session> _input_root { _env.ep().manage(_input_session) }; + Static_root<Event::Session> _event_root { _env.ep().manage(_event_session) }; + + /** + * Constructor + */ + Main(Env &env) : _env(env) + { + _input_session.event_queue().enabled(true); + + _env.parent().announce(env.ep().manage(_input_root)); + _env.parent().announce(env.ep().manage(_event_root)); + } +}; + + +void Component::construct(Genode::Env &env) +{ + static Input_event_bridge::Main inst(env); +} diff --git a/repos/os/src/server/input_event_bridge/target.mk b/repos/os/src/server/input_event_bridge/target.mk new file mode 100644 index 0000000000..8eca320bd8 --- /dev/null +++ b/repos/os/src/server/input_event_bridge/target.mk @@ -0,0 +1,3 @@ +TARGET = input_event_bridge +SRC_CC = main.cc +LIBS = base