/* * \brief Implementation of the SIGNAL service on the HW-core * \author Martin Stein * \date 2012-05-05 */ /* * Copyright (C) 2012-2013 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. */ /* Genode includes */ #include #include /* core includes */ #include using namespace Genode; Signal_session_component::Signal_session_component(Allocator * const md, size_t const ram_quota) : _md_alloc(md, ram_quota), _receivers_slab(Kernel::signal_receiver_size(), RECEIVERS_SB_SIZE, (Slab_block *)&_initial_receivers_sb, &_md_alloc), _contexts_slab(Kernel::signal_context_size(), CONTEXTS_SB_SIZE, (Slab_block *)&_initial_contexts_sb, &_md_alloc) { } Signal_session_component::~Signal_session_component() { PERR("%s: Not implemented", __PRETTY_FUNCTION__); while (1) ; } Signal_receiver_capability Signal_session_component::alloc_receiver() { /* create receiver kernel-object */ size_t const s = Kernel::signal_receiver_size(); void * p; if (!_receivers_slab.alloc(s, &p)) throw Out_of_metadata(); unsigned const id = Kernel::new_signal_receiver(p); if (!id) throw Out_of_metadata(); /* return reference to the new kernel-object */ Native_capability c(id, 0); return reinterpret_cap_cast(c); } Signal_context_capability Signal_session_component::alloc_context(Signal_receiver_capability r, unsigned imprint) { /* create context kernel-object */ size_t const s = Kernel::signal_context_size(); void * p; if (!_contexts_slab.alloc(s, &p)) throw Out_of_metadata(); unsigned const id = Kernel::new_signal_context(p, r.dst(), imprint); if (!id) throw Out_of_metadata(); /* return reference to the new kernel-object */ Native_capability c(id, 0); return reinterpret_cap_cast(c); } /** * FIXME should regain the kernel-object memory from kernel */ void Signal_session_component::free_context(Signal_context_capability cap) { PDBG("Not implemented"); }