mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-30 10:38:55 +00:00
base: restructure signal-submit initialization
This patch allows core's 'Signal_transmitter' implementation to sidestep the 'Env::Pd' interface and thereby adhere to a stricter layering within core. The 'Signal_transmitter' now uses - on kernels that depend on it - a dedicated (and fairly freestanding) RPC proxy mechanism for signal deliver, instead of channeling signals through the 'Pd_session::submit' RPC function.
This commit is contained in:
parent
71efb59873
commit
a1df4fee44
@ -9,6 +9,5 @@ include $(BASE_DIR)/lib/mk/base-common.inc
|
|||||||
LIBS += startup-fiasco syscall-fiasco
|
LIBS += startup-fiasco syscall-fiasco
|
||||||
|
|
||||||
SRC_CC += capability.cc capability_raw.cc
|
SRC_CC += capability.cc capability_raw.cc
|
||||||
SRC_CC += signal_submit.cc
|
|
||||||
SRC_CC += rpc_dispatch_loop.cc
|
SRC_CC += rpc_dispatch_loop.cc
|
||||||
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc
|
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
include $(BASE_DIR)/lib/mk/base.inc
|
include $(BASE_DIR)/lib/mk/base.inc
|
||||||
|
|
||||||
LIBS += syscall-fiasco timeout
|
LIBS += syscall-fiasco base-fiasco-common cxx timeout
|
||||||
|
|
||||||
SRC_CC += thread_start.cc
|
SRC_CC += thread_start.cc
|
||||||
SRC_CC += cache.cc
|
SRC_CC += cache.cc
|
||||||
SRC_CC += capability_space.cc
|
SRC_CC += capability_space.cc
|
||||||
|
SRC_CC += signal_transmitter.cc signal.cc
|
||||||
|
@ -35,6 +35,8 @@ SRC_CC += stack_area.cc \
|
|||||||
region_map_support.cc \
|
region_map_support.cc \
|
||||||
rom_session_component.cc \
|
rom_session_component.cc \
|
||||||
signal_source_component.cc \
|
signal_source_component.cc \
|
||||||
|
signal_transmitter_proxy.cc \
|
||||||
|
signal_receiver.cc \
|
||||||
thread_start.cc \
|
thread_start.cc \
|
||||||
trace_session_component.cc
|
trace_session_component.cc
|
||||||
|
|
||||||
@ -65,6 +67,8 @@ vpath region_map_component.cc $(GEN_CORE_DIR)
|
|||||||
vpath io_mem_session_component.cc $(GEN_CORE_DIR)
|
vpath io_mem_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath io_mem_session_support.cc $(GEN_CORE_DIR)
|
vpath io_mem_session_support.cc $(GEN_CORE_DIR)
|
||||||
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
||||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath dataspace_component.cc $(GEN_CORE_DIR)
|
vpath dataspace_component.cc $(GEN_CORE_DIR)
|
||||||
vpath default_log.cc $(GEN_CORE_DIR)
|
vpath default_log.cc $(GEN_CORE_DIR)
|
||||||
|
@ -9,7 +9,6 @@ include $(BASE_DIR)/lib/mk/base-common.inc
|
|||||||
LIBS += syscall-foc startup-foc
|
LIBS += syscall-foc startup-foc
|
||||||
|
|
||||||
SRC_CC += spin_lock.cc cap_map.cc
|
SRC_CC += spin_lock.cc cap_map.cc
|
||||||
SRC_CC += signal_submit.cc
|
|
||||||
SRC_CC += rpc_dispatch_loop.cc
|
SRC_CC += rpc_dispatch_loop.cc
|
||||||
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc utcb.cc
|
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc utcb.cc
|
||||||
SRC_CC += capability.cc
|
SRC_CC += capability.cc
|
||||||
|
@ -4,3 +4,4 @@ LIBS += base-foc-common syscall-foc cxx timeout
|
|||||||
|
|
||||||
SRC_CC += cap_map_remove.cc cap_alloc.cc
|
SRC_CC += cap_map_remove.cc cap_alloc.cc
|
||||||
SRC_CC += thread_start.cc
|
SRC_CC += thread_start.cc
|
||||||
|
SRC_CC += signal_transmitter.cc signal.cc
|
||||||
|
@ -34,6 +34,8 @@ SRC_CC += stack_area.cc \
|
|||||||
region_map_support.cc \
|
region_map_support.cc \
|
||||||
rom_session_component.cc \
|
rom_session_component.cc \
|
||||||
signal_source_component.cc \
|
signal_source_component.cc \
|
||||||
|
signal_transmitter_proxy.cc \
|
||||||
|
signal_receiver.cc \
|
||||||
thread_start.cc \
|
thread_start.cc \
|
||||||
trace_session_component.cc
|
trace_session_component.cc
|
||||||
|
|
||||||
@ -61,6 +63,8 @@ vpath ram_session_component.cc $(GEN_CORE_DIR)
|
|||||||
vpath region_map_component.cc $(GEN_CORE_DIR)
|
vpath region_map_component.cc $(GEN_CORE_DIR)
|
||||||
vpath rom_session_component.cc $(GEN_CORE_DIR)
|
vpath rom_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
||||||
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)
|
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)
|
||||||
vpath core_region_map.cc $(GEN_CORE_DIR)
|
vpath core_region_map.cc $(GEN_CORE_DIR)
|
||||||
vpath %.cc $(REP_DIR)/src/core
|
vpath %.cc $(REP_DIR)/src/core
|
||||||
|
@ -11,3 +11,4 @@ LIBS += syscall-hw
|
|||||||
|
|
||||||
SRC_CC += rpc_dispatch_loop.cc
|
SRC_CC += rpc_dispatch_loop.cc
|
||||||
SRC_CC += thread.cc thread_myself.cc thread_bootstrap.cc
|
SRC_CC += thread.cc thread_myself.cc thread_bootstrap.cc
|
||||||
|
SRC_CC += signal_transmitter.cc
|
||||||
|
@ -5,5 +5,6 @@ SRC_CC += env.cc
|
|||||||
SRC_CC += capability.cc
|
SRC_CC += capability.cc
|
||||||
SRC_CC += cache.cc
|
SRC_CC += cache.cc
|
||||||
SRC_CC += raw_write_string.cc
|
SRC_CC += raw_write_string.cc
|
||||||
|
SRC_CC += signal_receiver.cc
|
||||||
|
|
||||||
LIBS += startup-hw base-hw-common timeout-hw
|
LIBS += startup-hw base-hw-common cxx timeout-hw
|
||||||
|
@ -41,6 +41,8 @@ SRC_CC += ram_session_support.cc
|
|||||||
SRC_CC += region_map_component.cc
|
SRC_CC += region_map_component.cc
|
||||||
SRC_CC += rom_session_component.cc
|
SRC_CC += rom_session_component.cc
|
||||||
SRC_CC += trace_session_component.cc
|
SRC_CC += trace_session_component.cc
|
||||||
|
SRC_CC += signal_receiver.cc
|
||||||
|
SRC_CC += signal_transmitter_noinit.cc
|
||||||
SRC_CC += thread_start.cc
|
SRC_CC += thread_start.cc
|
||||||
SRC_CC += env.cc
|
SRC_CC += env.cc
|
||||||
SRC_CC += region_map_support.cc
|
SRC_CC += region_map_support.cc
|
||||||
|
@ -28,42 +28,25 @@
|
|||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
|
static Pd_session *_pd_ptr;
|
||||||
|
static Pd_session &pd()
|
||||||
|
{
|
||||||
|
if (_pd_ptr)
|
||||||
|
return *_pd_ptr;
|
||||||
|
|
||||||
|
class Missing_init_signal_thread { };
|
||||||
|
throw Missing_init_signal_thread();
|
||||||
|
}
|
||||||
|
|
||||||
namespace Genode {
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On base-hw, no signal thread is needed.
|
* On base-hw, we don't use a signal thread. We mereely save the PD session
|
||||||
|
* pointer of the passed 'env' argument.
|
||||||
*/
|
*/
|
||||||
void init_signal_thread(Env &) __attribute__((weak));
|
void Genode::init_signal_thread(Env &env) { _pd_ptr = &env.pd(); }
|
||||||
void init_signal_thread(Env &) { }
|
void Genode::destroy_signal_thread() { }
|
||||||
void destroy_signal_thread() { }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/********************
|
|
||||||
** Signal context **
|
|
||||||
********************/
|
|
||||||
|
|
||||||
void Signal_context::submit(unsigned) { Genode::error("not implemented"); }
|
|
||||||
|
|
||||||
|
|
||||||
/************************
|
|
||||||
** Signal transmitter **
|
|
||||||
************************/
|
|
||||||
|
|
||||||
void Signal_transmitter::submit(unsigned cnt)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
Trace::Signal_submit trace_event(cnt);
|
|
||||||
}
|
|
||||||
Kernel::submit_signal(Capability_space::capid(_context), cnt);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*********************
|
|
||||||
** Signal_receiver **
|
|
||||||
*********************/
|
|
||||||
|
|
||||||
Signal_receiver::Signal_receiver()
|
Signal_receiver::Signal_receiver()
|
||||||
{
|
{
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@ -72,7 +55,7 @@ Signal_receiver::Signal_receiver()
|
|||||||
Cap_quota cap_upgrade { 0 };
|
Cap_quota cap_upgrade { 0 };
|
||||||
|
|
||||||
try {
|
try {
|
||||||
_cap = internal_env().pd().alloc_signal_source();
|
_cap = pd().alloc_signal_source();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
catch (Out_of_ram) { ram_upgrade = Ram_quota { 2*1024*sizeof(long) }; }
|
catch (Out_of_ram) { ram_upgrade = Ram_quota { 2*1024*sizeof(long) }; }
|
||||||
@ -88,7 +71,7 @@ Signal_receiver::Signal_receiver()
|
|||||||
void Signal_receiver::_platform_destructor()
|
void Signal_receiver::_platform_destructor()
|
||||||
{
|
{
|
||||||
/* release server resources of receiver */
|
/* release server resources of receiver */
|
||||||
env_deprecated()->pd_session()->free_signal_source(_cap);
|
pd().free_signal_source(_cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -114,7 +97,7 @@ Signal_context_capability Signal_receiver::manage(Signal_context * const c)
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
/* use signal context as imprint */
|
/* use signal context as imprint */
|
||||||
c->_cap = env_deprecated()->pd_session()->alloc_context(_cap, (unsigned long)c);
|
c->_cap = pd().alloc_context(_cap, (unsigned long)c);
|
||||||
c->_receiver = this;
|
c->_receiver = this;
|
||||||
_contexts.insert(&c->_receiver_le);
|
_contexts.insert(&c->_receiver_le);
|
||||||
return c->_cap;
|
return c->_cap;
|
39
repos/base-hw/src/lib/base/signal_transmitter.cc
Normal file
39
repos/base-hw/src/lib/base/signal_transmitter.cc
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* \brief Implementations of the signaling framework specific for HW-core
|
||||||
|
* \author Martin Stein
|
||||||
|
* \date 2012-05-05
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2012-2017 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 <util/retry.h>
|
||||||
|
#include <base/signal.h>
|
||||||
|
#include <base/trace/events.h>
|
||||||
|
|
||||||
|
/* base-internal includes */
|
||||||
|
#include <base/internal/native_utcb.h>
|
||||||
|
#include <base/internal/native_env.h>
|
||||||
|
#include <base/internal/capability_space.h>
|
||||||
|
#include <base/internal/globals.h>
|
||||||
|
|
||||||
|
using namespace Genode;
|
||||||
|
|
||||||
|
void Genode::init_signal_transmitter(Env &) { }
|
||||||
|
|
||||||
|
|
||||||
|
void Signal_context::submit(unsigned) { Genode::error("not implemented"); }
|
||||||
|
|
||||||
|
|
||||||
|
void Signal_transmitter::submit(unsigned cnt)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
Trace::Signal_submit trace_event(cnt);
|
||||||
|
}
|
||||||
|
Kernel::submit_signal(Capability_space::capid(_context), cnt);
|
||||||
|
}
|
@ -9,7 +9,6 @@ include $(BASE_DIR)/lib/mk/base-common.inc
|
|||||||
LIBS += syscall-linux
|
LIBS += syscall-linux
|
||||||
|
|
||||||
SRC_CC += region_map_mmap.cc debug.cc
|
SRC_CC += region_map_mmap.cc debug.cc
|
||||||
SRC_CC += signal_submit.cc
|
|
||||||
SRC_CC += rpc_dispatch_loop.cc
|
SRC_CC += rpc_dispatch_loop.cc
|
||||||
SRC_CC += thread_env.cc
|
SRC_CC += thread_env.cc
|
||||||
SRC_CC += capability.cc
|
SRC_CC += capability.cc
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
|
|
||||||
include $(REP_DIR)/lib/mk/base-linux.inc
|
include $(REP_DIR)/lib/mk/base-linux.inc
|
||||||
|
|
||||||
LIBS += startup-linux base-linux-common timeout
|
LIBS += startup-linux base-linux-common cxx timeout
|
||||||
SRC_CC += thread.cc thread_myself.cc thread_linux.cc
|
SRC_CC += thread.cc thread_myself.cc thread_linux.cc
|
||||||
SRC_CC += capability_space.cc capability_raw.cc
|
SRC_CC += capability_space.cc capability_raw.cc
|
||||||
SRC_CC += attach_stack_area.cc
|
SRC_CC += attach_stack_area.cc
|
||||||
|
SRC_CC += signal_transmitter.cc signal.cc
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
SRC_CC += lx_hybrid.cc new_delete.cc capability_space.cc
|
SRC_CC += lx_hybrid.cc new_delete.cc capability_space.cc
|
||||||
|
SRC_CC += signal_transmitter.cc signal.cc
|
||||||
|
|
||||||
vpath new_delete.cc $(BASE_DIR)/src/lib/cxx
|
vpath new_delete.cc $(BASE_DIR)/src/lib/cxx
|
||||||
vpath lx_hybrid.cc $(REP_DIR)/src/lib/lx_hybrid
|
vpath lx_hybrid.cc $(REP_DIR)/src/lib/lx_hybrid
|
||||||
|
@ -24,6 +24,8 @@ SRC_CC = main.cc \
|
|||||||
core_rpc_cap_alloc.cc \
|
core_rpc_cap_alloc.cc \
|
||||||
io_mem_session_component.cc \
|
io_mem_session_component.cc \
|
||||||
signal_source_component.cc \
|
signal_source_component.cc \
|
||||||
|
signal_transmitter_proxy.cc \
|
||||||
|
signal_receiver.cc \
|
||||||
trace_session_component.cc \
|
trace_session_component.cc \
|
||||||
thread_linux.cc \
|
thread_linux.cc \
|
||||||
stack_area.cc \
|
stack_area.cc \
|
||||||
@ -54,6 +56,8 @@ vpath capability_space.cc $(GEN_CORE_DIR)
|
|||||||
vpath rpc_cap_factory_l4.cc $(GEN_CORE_DIR)
|
vpath rpc_cap_factory_l4.cc $(GEN_CORE_DIR)
|
||||||
vpath platform_services.cc $(GEN_CORE_DIR)
|
vpath platform_services.cc $(GEN_CORE_DIR)
|
||||||
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
||||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)
|
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)
|
||||||
vpath default_log.cc $(GEN_CORE_DIR)
|
vpath default_log.cc $(GEN_CORE_DIR)
|
||||||
|
@ -8,8 +8,8 @@ include $(BASE_DIR)/lib/mk/base-common.inc
|
|||||||
|
|
||||||
LIBS += startup-nova
|
LIBS += startup-nova
|
||||||
|
|
||||||
SRC_CC += signal_submit.cc
|
|
||||||
SRC_CC += thread.cc thread_myself.cc
|
SRC_CC += thread.cc thread_myself.cc
|
||||||
SRC_CC += stack.cc
|
SRC_CC += stack.cc
|
||||||
SRC_CC += cap_map.cc
|
SRC_CC += cap_map.cc
|
||||||
SRC_CC += capability.cc
|
SRC_CC += capability.cc
|
||||||
|
SRC_CC += signal_transmitter.cc
|
||||||
|
@ -3,3 +3,4 @@ include $(BASE_DIR)/lib/mk/base.inc
|
|||||||
LIBS += base-nova-common cxx timeout
|
LIBS += base-nova-common cxx timeout
|
||||||
SRC_CC += thread_start.cc
|
SRC_CC += thread_start.cc
|
||||||
SRC_CC += cache.cc
|
SRC_CC += cache.cc
|
||||||
|
SRC_CC += signal.cc
|
||||||
|
@ -39,7 +39,9 @@ SRC_CC += stack_area.cc \
|
|||||||
rom_session_component.cc \
|
rom_session_component.cc \
|
||||||
thread_start.cc \
|
thread_start.cc \
|
||||||
bios_data_area.cc \
|
bios_data_area.cc \
|
||||||
trace_session_component.cc
|
trace_session_component.cc \
|
||||||
|
signal_transmitter_noinit.cc \
|
||||||
|
signal_receiver.cc
|
||||||
|
|
||||||
INC_DIR = $(REP_DIR)/src/core/include \
|
INC_DIR = $(REP_DIR)/src/core/include \
|
||||||
$(REP_DIR)/src/include \
|
$(REP_DIR)/src/include \
|
||||||
@ -58,6 +60,8 @@ vpath pd_session_component.cc $(GEN_CORE_DIR)
|
|||||||
vpath pd_upgrade_ram_quota.cc $(GEN_CORE_DIR)
|
vpath pd_upgrade_ram_quota.cc $(GEN_CORE_DIR)
|
||||||
vpath region_map_component.cc $(GEN_CORE_DIR)
|
vpath region_map_component.cc $(GEN_CORE_DIR)
|
||||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_transmitter_noinit.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
||||||
vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86
|
vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86
|
||||||
vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86
|
vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86
|
||||||
vpath io_mem_session_component.cc $(GEN_CORE_DIR)
|
vpath io_mem_session_component.cc $(GEN_CORE_DIR)
|
||||||
|
@ -11,18 +11,23 @@
|
|||||||
* under the terms of the GNU Affero General Public License version 3.
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/* Genode includes */
|
/* Genode includes */
|
||||||
#include <base/signal.h>
|
#include <base/signal.h>
|
||||||
#include <base/log.h>
|
#include <base/log.h>
|
||||||
#include <base/trace/events.h>
|
#include <base/trace/events.h>
|
||||||
|
|
||||||
|
/* base-internal includes */
|
||||||
|
#include <base/internal/globals.h>
|
||||||
|
|
||||||
/* NOVA includes */
|
/* NOVA includes */
|
||||||
#include <nova/syscalls.h>
|
#include <nova/syscalls.h>
|
||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
|
|
||||||
|
void Genode::init_signal_transmitter(Env &) { }
|
||||||
|
|
||||||
|
|
||||||
void Signal_transmitter::submit(unsigned cnt)
|
void Signal_transmitter::submit(unsigned cnt)
|
||||||
{
|
{
|
||||||
{
|
{
|
@ -9,6 +9,5 @@ include $(BASE_DIR)/lib/mk/base-common.inc
|
|||||||
LIBS += startup-okl4 syscall-okl4
|
LIBS += startup-okl4 syscall-okl4
|
||||||
|
|
||||||
SRC_CC += capability.cc capability_raw.cc
|
SRC_CC += capability.cc capability_raw.cc
|
||||||
SRC_CC += signal_submit.cc
|
|
||||||
SRC_CC += rpc_dispatch_loop.cc
|
SRC_CC += rpc_dispatch_loop.cc
|
||||||
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc
|
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
include $(BASE_DIR)/lib/mk/base.inc
|
include $(BASE_DIR)/lib/mk/base.inc
|
||||||
|
|
||||||
LIBS += base-okl4-common syscall-okl4 timeout
|
LIBS += base-okl4-common syscall-okl4 cxx timeout
|
||||||
SRC_CC += thread_start.cc
|
SRC_CC += thread_start.cc
|
||||||
SRC_CC += cache.cc
|
SRC_CC += cache.cc
|
||||||
SRC_CC += capability_space.cc
|
SRC_CC += capability_space.cc
|
||||||
|
SRC_CC += signal_transmitter.cc
|
||||||
|
SRC_CC += signal.cc
|
||||||
|
@ -38,6 +38,8 @@ SRC_CC += stack_area.cc \
|
|||||||
region_map_support.cc \
|
region_map_support.cc \
|
||||||
rom_session_component.cc \
|
rom_session_component.cc \
|
||||||
signal_source_component.cc \
|
signal_source_component.cc \
|
||||||
|
signal_transmitter_proxy.cc \
|
||||||
|
signal_receiver.cc \
|
||||||
thread_start.cc \
|
thread_start.cc \
|
||||||
trace_session_component.cc
|
trace_session_component.cc
|
||||||
|
|
||||||
@ -61,6 +63,8 @@ vpath region_map_component.cc $(GEN_CORE_DIR)
|
|||||||
vpath io_mem_session_component.cc $(GEN_CORE_DIR)
|
vpath io_mem_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath io_mem_session_support.cc $(GEN_CORE_DIR)
|
vpath io_mem_session_support.cc $(GEN_CORE_DIR)
|
||||||
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
||||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath dataspace_component.cc $(GEN_CORE_DIR)
|
vpath dataspace_component.cc $(GEN_CORE_DIR)
|
||||||
vpath core_mem_alloc.cc $(GEN_CORE_DIR)
|
vpath core_mem_alloc.cc $(GEN_CORE_DIR)
|
||||||
|
@ -9,7 +9,6 @@ include $(BASE_DIR)/lib/mk/base-common.inc
|
|||||||
LIBS += startup-pistachio syscall-pistachio
|
LIBS += startup-pistachio syscall-pistachio
|
||||||
|
|
||||||
SRC_CC += capability.cc capability_raw.cc
|
SRC_CC += capability.cc capability_raw.cc
|
||||||
SRC_CC += signal_submit.cc
|
|
||||||
SRC_CC += rpc_dispatch_loop.cc
|
SRC_CC += rpc_dispatch_loop.cc
|
||||||
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc
|
SRC_CC += thread.cc thread_bootstrap.cc thread_myself.cc
|
||||||
|
|
||||||
|
@ -5,3 +5,5 @@ LIBS += base-pistachio-common syscall-pistachio cxx timeout
|
|||||||
SRC_CC += thread_start.cc
|
SRC_CC += thread_start.cc
|
||||||
SRC_CC += cache.cc
|
SRC_CC += cache.cc
|
||||||
SRC_CC += capability_space.cc
|
SRC_CC += capability_space.cc
|
||||||
|
SRC_CC += signal_transmitter.cc
|
||||||
|
SRC_CC += signal.cc
|
||||||
|
@ -36,6 +36,8 @@ SRC_CC = stack_area.cc \
|
|||||||
region_map_support.cc \
|
region_map_support.cc \
|
||||||
rom_session_component.cc \
|
rom_session_component.cc \
|
||||||
signal_source_component.cc \
|
signal_source_component.cc \
|
||||||
|
signal_transmitter_proxy.cc \
|
||||||
|
signal_receiver.cc \
|
||||||
thread_start.cc \
|
thread_start.cc \
|
||||||
trace_session_component.cc
|
trace_session_component.cc
|
||||||
|
|
||||||
@ -59,6 +61,8 @@ vpath capability_space.cc $(GEN_CORE_DIR)
|
|||||||
vpath io_mem_session_component.cc $(GEN_CORE_DIR)
|
vpath io_mem_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath io_mem_session_support.cc $(GEN_CORE_DIR)
|
vpath io_mem_session_support.cc $(GEN_CORE_DIR)
|
||||||
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
||||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath dataspace_component.cc $(GEN_CORE_DIR)
|
vpath dataspace_component.cc $(GEN_CORE_DIR)
|
||||||
vpath dump_alloc.cc $(GEN_CORE_DIR)
|
vpath dump_alloc.cc $(GEN_CORE_DIR)
|
||||||
|
@ -8,7 +8,6 @@ include $(BASE_DIR)/lib/mk/base-common.inc
|
|||||||
|
|
||||||
LIBS += startup-sel4 syscall-sel4
|
LIBS += startup-sel4 syscall-sel4
|
||||||
|
|
||||||
SRC_CC += signal_submit.cc
|
|
||||||
SRC_CC += rpc_dispatch_loop.cc
|
SRC_CC += rpc_dispatch_loop.cc
|
||||||
SRC_CC += thread.cc thread_myself.cc thread_bootstrap.cc
|
SRC_CC += thread.cc thread_myself.cc thread_bootstrap.cc
|
||||||
SRC_CC += capability.cc capability_raw.cc
|
SRC_CC += capability.cc capability_raw.cc
|
||||||
|
@ -3,5 +3,6 @@ include $(BASE_DIR)/lib/mk/base.inc
|
|||||||
SRC_CC += capability_space.cc
|
SRC_CC += capability_space.cc
|
||||||
SRC_CC += thread_start.cc thread_init.cc
|
SRC_CC += thread_start.cc thread_init.cc
|
||||||
SRC_CC += cache.cc
|
SRC_CC += cache.cc
|
||||||
|
SRC_CC += signal_transmitter.cc signal.cc
|
||||||
|
|
||||||
LIBS += syscall-sel4 base-sel4-common timeout
|
LIBS += syscall-sel4 base-sel4-common cxx timeout
|
||||||
|
@ -26,6 +26,8 @@ SRC_CC += \
|
|||||||
region_map_support.cc \
|
region_map_support.cc \
|
||||||
irq_session_component.cc \
|
irq_session_component.cc \
|
||||||
signal_source_component.cc \
|
signal_source_component.cc \
|
||||||
|
signal_transmitter_proxy.cc \
|
||||||
|
signal_receiver.cc \
|
||||||
trace_session_component.cc \
|
trace_session_component.cc \
|
||||||
core_region_map.cc \
|
core_region_map.cc \
|
||||||
core_mem_alloc.cc \
|
core_mem_alloc.cc \
|
||||||
@ -58,6 +60,8 @@ vpath io_mem_session_support.cc $(GEN_CORE_DIR)
|
|||||||
vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86
|
vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86
|
||||||
vpath platform_services.cc $(GEN_CORE_DIR)/spec/x86
|
vpath platform_services.cc $(GEN_CORE_DIR)/spec/x86
|
||||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
|
||||||
|
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
||||||
vpath dataspace_component.cc $(GEN_CORE_DIR)
|
vpath dataspace_component.cc $(GEN_CORE_DIR)
|
||||||
vpath core_mem_alloc.cc $(GEN_CORE_DIR)
|
vpath core_mem_alloc.cc $(GEN_CORE_DIR)
|
||||||
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)
|
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)
|
||||||
|
@ -74,6 +74,8 @@ class Genode::Entrypoint : Genode::Noncopyable
|
|||||||
Signal_proxy_component _signal_proxy {*this};
|
Signal_proxy_component _signal_proxy {*this};
|
||||||
Capability<Signal_proxy> _signal_proxy_cap = _rpc_ep->manage(&_signal_proxy);
|
Capability<Signal_proxy> _signal_proxy_cap = _rpc_ep->manage(&_signal_proxy);
|
||||||
|
|
||||||
|
bool const _signalling_initialized;
|
||||||
|
|
||||||
Reconstructible<Signal_receiver> _sig_rec;
|
Reconstructible<Signal_receiver> _sig_rec;
|
||||||
|
|
||||||
Lock _deferred_signals_mutex;
|
Lock _deferred_signals_mutex;
|
||||||
|
@ -20,7 +20,7 @@ SRC_CC += lock.cc
|
|||||||
SRC_CC += log.cc
|
SRC_CC += log.cc
|
||||||
SRC_CC += raw_output.cc
|
SRC_CC += raw_output.cc
|
||||||
SRC_CC += rpc_entrypoint.cc
|
SRC_CC += rpc_entrypoint.cc
|
||||||
SRC_CC += signal.cc signal_common.cc
|
SRC_CC += signal_common.cc
|
||||||
SRC_CC += sleep.cc
|
SRC_CC += sleep.cc
|
||||||
SRC_CC += entrypoint.cc
|
SRC_CC += entrypoint.cc
|
||||||
SRC_CC += component.cc
|
SRC_CC += component.cc
|
||||||
|
39
repos/base/src/core/include/signal_transmitter.h
Normal file
39
repos/base/src/core/include/signal_transmitter.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* \brief Initialization of core-specific signal-delivery mechanism
|
||||||
|
* \author Norman Feske
|
||||||
|
* \date 2017-05-10
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _CORE__INCLUDE__SIGNAL_TRANSMITTER_H_
|
||||||
|
#define _CORE__INCLUDE__SIGNAL_TRANSMITTER_H_
|
||||||
|
|
||||||
|
namespace Genode {
|
||||||
|
|
||||||
|
class Rpc_entrypoint;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the emission of signals originating from the component
|
||||||
|
*
|
||||||
|
* The 'ep' is the entrypoint called by the signal-source clients. On
|
||||||
|
* kernels where signals are delivered by core as IPC-reply messages, we
|
||||||
|
* need to ensure that the replies are sent by the same thread that
|
||||||
|
* received the RPC request (the 'ep' thread). Otherwise, the kernel
|
||||||
|
* (e.g., OKL4, Pistachio, L4/Fiasco) will refuse to send the reply.
|
||||||
|
*
|
||||||
|
* On other kernels, the argument is unused.
|
||||||
|
*
|
||||||
|
* Note that this function is called at a very early stage, before the
|
||||||
|
* global constructors are executed. It should merely remember the 'ep'
|
||||||
|
* argument.
|
||||||
|
*/
|
||||||
|
void init_core_signal_transmitter(Rpc_entrypoint &ep);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _CORE__INCLUDE__SIGNAL_TRANSMITTER_H_ */
|
@ -28,6 +28,7 @@
|
|||||||
/* core includes */
|
/* core includes */
|
||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
#include <core_env.h>
|
#include <core_env.h>
|
||||||
|
#include <signal_transmitter.h>
|
||||||
#include <ram_root.h>
|
#include <ram_root.h>
|
||||||
#include <rom_root.h>
|
#include <rom_root.h>
|
||||||
#include <rm_root.h>
|
#include <rm_root.h>
|
||||||
@ -59,6 +60,17 @@ Core_env * Genode::core_env()
|
|||||||
* constructor gets called when this function is used the first time.
|
* constructor gets called when this function is used the first time.
|
||||||
*/
|
*/
|
||||||
static Core_env _env;
|
static Core_env _env;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register signal-source entrypoint at core-local signal-transmitter back
|
||||||
|
* end
|
||||||
|
*/
|
||||||
|
static bool signal_transmitter_initialized;
|
||||||
|
|
||||||
|
if (!signal_transmitter_initialized)
|
||||||
|
signal_transmitter_initialized =
|
||||||
|
(init_core_signal_transmitter(*_env.entrypoint()), true);
|
||||||
|
|
||||||
return &_env;
|
return &_env;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,7 +236,8 @@ class Core_child : public Child_policy
|
|||||||
* the creation of regular threads within core is unsupported.
|
* the creation of regular threads within core is unsupported.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Genode { void init_signal_thread(Env &) { } }
|
void Genode::init_signal_thread(Env &) { }
|
||||||
|
void Genode::destroy_signal_thread() { }
|
||||||
|
|
||||||
|
|
||||||
/*******************
|
/*******************
|
||||||
|
40
repos/base/src/core/signal_receiver.cc
Normal file
40
repos/base/src/core/signal_receiver.cc
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* \brief Dummy implementation of the signal-receiver API
|
||||||
|
* \author Norman Feske
|
||||||
|
* \date 2017-05-11
|
||||||
|
*
|
||||||
|
* Core receives no signals. Therefore, we can leave the signal receiver
|
||||||
|
* blank.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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 <base/env.h>
|
||||||
|
|
||||||
|
/* base-internal includes */
|
||||||
|
#include <base/internal/globals.h>
|
||||||
|
|
||||||
|
/* core-local includes */
|
||||||
|
#include <assertion.h>
|
||||||
|
|
||||||
|
using namespace Genode;
|
||||||
|
|
||||||
|
Signal_receiver::Signal_receiver() { }
|
||||||
|
|
||||||
|
void Signal_receiver::_platform_destructor() { }
|
||||||
|
void Signal_receiver::_platform_begin_dissolve (Signal_context *) { }
|
||||||
|
void Signal_receiver::_platform_finish_dissolve(Signal_context *) { }
|
||||||
|
|
||||||
|
void Signal_receiver::unblock_signal_waiter(Rpc_entrypoint &) { ASSERT_NEVER_CALLED; }
|
||||||
|
|
||||||
|
typedef Signal_context_capability Sigh_cap;
|
||||||
|
|
||||||
|
Sigh_cap Signal_receiver::manage(Signal_context *) { ASSERT_NEVER_CALLED; }
|
||||||
|
void Signal_receiver::block_for_signal() { ASSERT_NEVER_CALLED; }
|
||||||
|
void Signal_receiver::local_submit(Signal::Data) { ASSERT_NEVER_CALLED; }
|
20
repos/base/src/core/signal_transmitter_noinit.cc
Normal file
20
repos/base/src/core/signal_transmitter_noinit.cc
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
* \brief Generic implementation parts of the signaling framework
|
||||||
|
* \author Norman Feske
|
||||||
|
* \date 2017-05-10
|
||||||
|
*
|
||||||
|
* This dummy is used on base platforms that transmit signals directly via
|
||||||
|
* the kernel instead of using core's signal-source entrypoint as a proxy.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* core-local includes */
|
||||||
|
#include <signal_transmitter.h>
|
||||||
|
|
||||||
|
void Genode::init_core_signal_transmitter(Rpc_entrypoint &) { }
|
120
repos/base/src/core/signal_transmitter_proxy.cc
Normal file
120
repos/base/src/core/signal_transmitter_proxy.cc
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* \brief Generic implementation parts of the signaling framework
|
||||||
|
* \author Norman Feske
|
||||||
|
* \date 2017-05-10
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 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 <base/env.h>
|
||||||
|
#include <base/rpc_server.h>
|
||||||
|
#include <base/trace/events.h>
|
||||||
|
|
||||||
|
/* core-local includes */
|
||||||
|
#include <signal_source_component.h>
|
||||||
|
#include <signal_transmitter.h>
|
||||||
|
|
||||||
|
/* base-internal includes */
|
||||||
|
#include <base/internal/globals.h>
|
||||||
|
|
||||||
|
using namespace Genode;
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct Signal_delivery_proxy
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Wrap pointer into struct to transmit it (core-locally) as plain-old
|
||||||
|
* data.
|
||||||
|
*/
|
||||||
|
struct Context_ptr { Signal_context_component *ptr; };
|
||||||
|
|
||||||
|
GENODE_RPC(Rpc_deliver, void, _deliver_from_ep, Context_ptr, unsigned);
|
||||||
|
GENODE_RPC_INTERFACE(Rpc_deliver);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Signal_delivery_proxy_component
|
||||||
|
:
|
||||||
|
Rpc_object<Signal_delivery_proxy, Signal_delivery_proxy_component>
|
||||||
|
{
|
||||||
|
Rpc_entrypoint &_ep;
|
||||||
|
|
||||||
|
Capability<Signal_delivery_proxy> _proxy_cap = _ep.manage(this);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* \param ep entrypoint to be used as a proxy for delivering signals
|
||||||
|
* as IPC-reply messages.
|
||||||
|
*/
|
||||||
|
Signal_delivery_proxy_component(Rpc_entrypoint &ep) : _ep(ep) { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signal_delivery_proxy RPC interface
|
||||||
|
*
|
||||||
|
* This method is executed in the context of the 'ep'. Hence, it
|
||||||
|
* can produce legitimate IPC reply messages to 'Signal_source'
|
||||||
|
* clients.
|
||||||
|
*/
|
||||||
|
void _deliver_from_ep(Context_ptr context_ptr, unsigned cnt)
|
||||||
|
{
|
||||||
|
Signal_context_component *context = context_ptr.ptr;
|
||||||
|
context->source()->submit(context, cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deliver signal via the proxy mechanism
|
||||||
|
*
|
||||||
|
* Since this method perform an RPC call to the 'ep' specified at the
|
||||||
|
* constructor, is must never be called from this ep.
|
||||||
|
*
|
||||||
|
* Called from threads other than 'ep'.
|
||||||
|
*/
|
||||||
|
void submit(Signal_context_capability cap, unsigned cnt)
|
||||||
|
{
|
||||||
|
_ep.apply(cap, [&] (Signal_context_component *context) {
|
||||||
|
|
||||||
|
if (context) {
|
||||||
|
_proxy_cap.call<Rpc_deliver>(Context_ptr{context}, cnt);
|
||||||
|
} else {
|
||||||
|
warning("invalid signal-context capability");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static Constructible<Signal_delivery_proxy_component> delivery_proxy;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Entrypoint that servces the 'Signal_source' RPC objects
|
||||||
|
*/
|
||||||
|
static Rpc_entrypoint *_ep;
|
||||||
|
|
||||||
|
|
||||||
|
void Genode::init_core_signal_transmitter(Rpc_entrypoint &ep) { _ep = &ep; }
|
||||||
|
|
||||||
|
|
||||||
|
void Genode::init_signal_transmitter(Env &)
|
||||||
|
{
|
||||||
|
if (!delivery_proxy.constructed() && _ep)
|
||||||
|
delivery_proxy.construct(*_ep);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Signal_transmitter::submit(unsigned cnt)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
Trace::Signal_submit trace_event(cnt);
|
||||||
|
}
|
||||||
|
delivery_proxy->submit(_context, cnt);
|
||||||
|
}
|
@ -2,9 +2,6 @@
|
|||||||
* \brief Interfaces to library-global objects
|
* \brief Interfaces to library-global objects
|
||||||
* \author Norman Feske
|
* \author Norman Feske
|
||||||
* \date 2016-04-29
|
* \date 2016-04-29
|
||||||
*
|
|
||||||
* \deprecated This header should be removed once we have completed the
|
|
||||||
* transition to the modernized API.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -30,6 +27,7 @@ namespace Genode {
|
|||||||
extern Ram_session *env_stack_area_ram_session;
|
extern Ram_session *env_stack_area_ram_session;
|
||||||
|
|
||||||
void init_exception_handling(Env &);
|
void init_exception_handling(Env &);
|
||||||
|
void init_signal_transmitter(Env &);
|
||||||
void init_cxx_heap(Env &);
|
void init_cxx_heap(Env &);
|
||||||
void init_ldso_phdr(Env &);
|
void init_ldso_phdr(Env &);
|
||||||
void init_signal_thread(Env &);
|
void init_signal_thread(Env &);
|
||||||
@ -37,6 +35,8 @@ namespace Genode {
|
|||||||
void init_log();
|
void init_log();
|
||||||
void exec_static_constructors();
|
void exec_static_constructors();
|
||||||
|
|
||||||
|
void destroy_signal_thread();
|
||||||
|
|
||||||
Id_space<Parent::Client> &env_session_id_space();
|
Id_space<Parent::Client> &env_session_id_space();
|
||||||
Env &internal_env();
|
Env &internal_env();
|
||||||
}
|
}
|
||||||
|
@ -272,6 +272,7 @@ namespace {
|
|||||||
Genode::inhibit_tracing = false;
|
Genode::inhibit_tracing = false;
|
||||||
|
|
||||||
Genode::call_global_static_constructors();
|
Genode::call_global_static_constructors();
|
||||||
|
Genode::init_signal_transmitter(env);
|
||||||
|
|
||||||
Component::construct(env);
|
Component::construct(env);
|
||||||
}
|
}
|
||||||
@ -282,11 +283,11 @@ namespace {
|
|||||||
Entrypoint::Entrypoint(Env &env)
|
Entrypoint::Entrypoint(Env &env)
|
||||||
:
|
:
|
||||||
_env(env),
|
_env(env),
|
||||||
_rpc_ep(&env.pd(), Component::stack_size(), initial_ep_name())
|
_rpc_ep(&env.pd(), Component::stack_size(), initial_ep_name()),
|
||||||
{
|
|
||||||
/* initialize signalling after initializing but before calling the entrypoint */
|
|
||||||
init_signal_thread(_env);
|
|
||||||
|
|
||||||
|
/* initialize signalling before creating the first signal receiver */
|
||||||
|
_signalling_initialized((init_signal_thread(env), true))
|
||||||
|
{
|
||||||
/* initialize emulation of the original synchronous root interface */
|
/* initialize emulation of the original synchronous root interface */
|
||||||
init_root_proxy(_env);
|
init_root_proxy(_env);
|
||||||
|
|
||||||
@ -317,7 +318,7 @@ Entrypoint::Entrypoint(Env &env)
|
|||||||
Entrypoint::Entrypoint(Env &env, size_t stack_size, char const *name)
|
Entrypoint::Entrypoint(Env &env, size_t stack_size, char const *name)
|
||||||
:
|
:
|
||||||
_env(env),
|
_env(env),
|
||||||
_rpc_ep(&env.pd(), stack_size, name)
|
_rpc_ep(&env.pd(), stack_size, name), _signalling_initialized(true)
|
||||||
{
|
{
|
||||||
_signal_proxy_thread.construct(env, *this);
|
_signal_proxy_thread.construct(env, *this);
|
||||||
}
|
}
|
||||||
|
@ -2,30 +2,40 @@
|
|||||||
* \brief Generic implementation parts of the signaling framework
|
* \brief Generic implementation parts of the signaling framework
|
||||||
* \author Norman Feske
|
* \author Norman Feske
|
||||||
* \author Alexander Boettcher
|
* \author Alexander Boettcher
|
||||||
|
* \date 2015-03-17
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2008-2017 Genode Labs GmbH
|
* Copyright (C) 2015-2017 Genode Labs GmbH
|
||||||
*
|
*
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
* under the terms of the GNU Affero General Public License version 3.
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
#include <base/env.h>
|
#include <base/env.h>
|
||||||
#include <base/trace/events.h>
|
#include <base/trace/events.h>
|
||||||
|
#include <base/signal.h>
|
||||||
|
|
||||||
|
/* base-internal includes */
|
||||||
|
#include <base/internal/globals.h>
|
||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
|
static Pd_session *_pd;
|
||||||
|
|
||||||
|
|
||||||
|
void Genode::init_signal_transmitter(Env &env) { _pd = &env.pd(); }
|
||||||
|
|
||||||
/************************
|
|
||||||
** Signal transmitter **
|
|
||||||
************************/
|
|
||||||
|
|
||||||
void Signal_transmitter::submit(unsigned cnt)
|
void Signal_transmitter::submit(unsigned cnt)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
Trace::Signal_submit trace_event(cnt);
|
Trace::Signal_submit trace_event(cnt);
|
||||||
}
|
}
|
||||||
env_deprecated()->pd_session()->submit(_context, cnt);
|
|
||||||
|
if (_pd)
|
||||||
|
_pd->submit(_context, cnt);
|
||||||
|
else
|
||||||
|
warning("missing call of 'init_signal_submit'");
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user