mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-07 19:34:56 +00:00
parent
b35484b8b0
commit
0f8803245a
@ -18,7 +18,7 @@ SRC_CC += child/child.cc
|
||||
SRC_CC += process/process.cc
|
||||
SRC_CC += elf/elf_binary.cc
|
||||
SRC_CC += lock/lock.cc
|
||||
SRC_CC += signal/signal.cc
|
||||
SRC_CC += signal/signal.cc signal/common.cc
|
||||
SRC_CC += server/server.cc server/common.cc
|
||||
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
|
||||
SRC_CC += env/utcb.cc
|
||||
|
@ -18,7 +18,7 @@ SRC_CC += child/child.cc
|
||||
SRC_CC += process/process.cc
|
||||
SRC_CC += elf/elf_binary.cc
|
||||
SRC_CC += lock/lock.cc
|
||||
SRC_CC += signal/signal.cc
|
||||
SRC_CC += signal/signal.cc signal/common.cc
|
||||
SRC_CC += server/server.cc server/common.cc
|
||||
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
|
||||
|
||||
|
@ -18,7 +18,7 @@ SRC_CC += process/process.cc
|
||||
SRC_CC += elf/elf_binary.cc
|
||||
SRC_CC += lock/lock.cc
|
||||
SRC_CC += env/spin_lock.cc env/cap_map.cc
|
||||
SRC_CC += signal/signal.cc
|
||||
SRC_CC += signal/signal.cc signal/common.cc
|
||||
SRC_CC += server/server.cc server/common.cc
|
||||
SRC_CC += thread/thread.cc thread/thread_bootstrap.cc
|
||||
|
||||
|
@ -18,7 +18,7 @@ SRC_CC += child/child.cc
|
||||
SRC_CC += process/process.cc
|
||||
SRC_CC += elf/elf_binary.cc
|
||||
SRC_CC += lock/lock.cc
|
||||
SRC_CC += signal/signal.cc
|
||||
SRC_CC += signal/signal.cc signal/common.cc
|
||||
SRC_CC += server/server.cc server/common.cc
|
||||
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
|
||||
|
||||
|
@ -17,7 +17,7 @@ SRC_CC += process/process.cc
|
||||
SRC_CC += elf/elf_binary.cc
|
||||
SRC_CC += lock/lock.cc
|
||||
SRC_CC += env/rm_session_mmap.cc env/debug.cc
|
||||
SRC_CC += signal/signal.cc
|
||||
SRC_CC += signal/signal.cc signal/common.cc
|
||||
SRC_CC += server/server.cc server/common.cc
|
||||
|
||||
INC_DIR += $(REP_DIR)/src/base/lock $(BASE_DIR)/src/base/lock
|
||||
|
@ -16,7 +16,7 @@ SRC_CC += child/child.cc
|
||||
SRC_CC += process/process.cc
|
||||
SRC_CC += elf/elf_binary.cc
|
||||
SRC_CC += lock/lock.cc
|
||||
SRC_CC += signal/signal.cc
|
||||
SRC_CC += signal/signal.cc signal/common.cc
|
||||
SRC_CC += server/server.cc
|
||||
SRC_CC += thread/thread.cc thread/thread_context.cc
|
||||
|
||||
|
@ -18,7 +18,7 @@ SRC_CC += child/child.cc
|
||||
SRC_CC += process/process.cc
|
||||
SRC_CC += elf/elf_binary.cc
|
||||
SRC_CC += lock/lock.cc
|
||||
SRC_CC += signal/signal.cc
|
||||
SRC_CC += signal/signal.cc signal/common.cc
|
||||
SRC_CC += server/server.cc server/common.cc
|
||||
|
||||
INC_DIR += $(REP_DIR)/src/base/lock
|
||||
|
@ -18,7 +18,7 @@ SRC_CC += child/child.cc
|
||||
SRC_CC += process/process.cc
|
||||
SRC_CC += elf/elf_binary.cc
|
||||
SRC_CC += lock/lock.cc
|
||||
SRC_CC += signal/signal.cc
|
||||
SRC_CC += signal/signal.cc signal/common.cc
|
||||
SRC_CC += server/server.cc server/common.cc
|
||||
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
|
||||
|
||||
|
@ -20,8 +20,12 @@
|
||||
#include <base/semaphore.h>
|
||||
#include <signal_session/signal_session.h>
|
||||
|
||||
/* only needed for base-hw */
|
||||
namespace Kernel { struct Signal_receiver; }
|
||||
|
||||
namespace Genode {
|
||||
|
||||
class Signal_source;
|
||||
class Signal_receiver;
|
||||
class Signal_context;
|
||||
class Signal_context_registry;
|
||||
@ -79,6 +83,7 @@ namespace Genode {
|
||||
*/
|
||||
Signal(Data data);
|
||||
|
||||
friend class Kernel::Signal_receiver;
|
||||
friend class Signal_receiver;
|
||||
friend class Signal_context;
|
||||
|
||||
@ -218,7 +223,17 @@ namespace Genode {
|
||||
{
|
||||
private:
|
||||
|
||||
Semaphore _signal_available; /* signal(s) awaiting to be picked up */
|
||||
/**
|
||||
* Semaphore used to indicate that signal(s) are ready to be picked
|
||||
* up. This is needed for platforms other than 'base-hw' only.
|
||||
*/
|
||||
Semaphore _signal_available;
|
||||
|
||||
/**
|
||||
* Provides the kernel-object name via the 'dst' method. This is
|
||||
* needed for 'base-hw' only.
|
||||
*/
|
||||
Signal_receiver_capability _cap;
|
||||
|
||||
/**
|
||||
* List of associated contexts
|
||||
|
@ -22,10 +22,12 @@
|
||||
namespace Genode {
|
||||
|
||||
class Signal_context;
|
||||
class Signal_receiver;
|
||||
|
||||
|
||||
typedef Capability<Signal_context> Signal_context_capability;
|
||||
typedef Capability<Signal_source> Signal_source_capability;
|
||||
typedef Capability<Signal_receiver> Signal_receiver_capability;
|
||||
typedef Capability<Signal_context> Signal_context_capability;
|
||||
typedef Capability<Signal_source> Signal_source_capability;
|
||||
|
||||
|
||||
struct Signal_session : Session
|
||||
|
73
base/src/base/signal/common.cc
Normal file
73
base/src/base/signal/common.cc
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
* \brief Platform-independent part of signal framework
|
||||
* \author Norman Feske
|
||||
* \author Christian Prochaska
|
||||
* \author Martin Stein
|
||||
* \date 2013-02-21
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 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 <base/signal.h>
|
||||
|
||||
using namespace Genode;
|
||||
|
||||
|
||||
/************
|
||||
** Signal **
|
||||
************/
|
||||
|
||||
Signal::Signal(Signal const &other) { _inc_ref(); }
|
||||
|
||||
|
||||
Signal & Signal::operator=(Signal const &other)
|
||||
{
|
||||
if ((_data.context == other._data.context) &&
|
||||
(_data.num == other._data.num))
|
||||
return *this;
|
||||
|
||||
_dec_ref_and_unlock();
|
||||
|
||||
_data.context = other._data.context;
|
||||
_data.num = other._data.num;
|
||||
|
||||
_inc_ref();
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
Signal::~Signal() { _dec_ref_and_unlock(); };
|
||||
|
||||
|
||||
/************************
|
||||
** Signal_transmitter **
|
||||
************************/
|
||||
|
||||
Signal_transmitter::Signal_transmitter(Signal_context_capability context)
|
||||
: _context(context) { }
|
||||
|
||||
|
||||
void Signal_transmitter::context(Signal_context_capability context) {
|
||||
_context = context; }
|
||||
|
||||
|
||||
/*********************
|
||||
** Signal_receiver **
|
||||
*********************/
|
||||
|
||||
Signal_receiver::~Signal_receiver()
|
||||
{
|
||||
Lock::Guard list_lock_guard(_contexts_lock);
|
||||
|
||||
/* disassociate contexts from the receiver */
|
||||
for (List_element<Signal_context> *le; (le = _contexts.first()); )
|
||||
_unsynchronized_dissolve(le->object());
|
||||
}
|
||||
|
@ -198,49 +198,10 @@ Signal::Signal(Signal::Data data) : _data(data)
|
||||
}
|
||||
|
||||
|
||||
Signal::Signal(Signal const &other) : _data(other._data)
|
||||
{
|
||||
_inc_ref();
|
||||
}
|
||||
|
||||
|
||||
Signal::~Signal()
|
||||
{
|
||||
_dec_ref_and_unlock();
|
||||
}
|
||||
|
||||
|
||||
Signal &Signal::operator=(Signal const &other)
|
||||
{
|
||||
if ((_data.context == other._data.context)
|
||||
&& (_data.num == other._data.num))
|
||||
return *this;
|
||||
|
||||
_dec_ref_and_unlock();
|
||||
|
||||
_data.context = other._data.context;
|
||||
_data.num = other._data.num;
|
||||
|
||||
_inc_ref();
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
/************************
|
||||
** Signal transmitter **
|
||||
************************/
|
||||
|
||||
Signal_transmitter::Signal_transmitter(Signal_context_capability context)
|
||||
: _context(context) { }
|
||||
|
||||
|
||||
void Signal_transmitter::context(Signal_context_capability context)
|
||||
{
|
||||
_context = context;
|
||||
}
|
||||
|
||||
|
||||
void Signal_transmitter::submit(unsigned cnt)
|
||||
{
|
||||
signal_connection()->submit(_context, cnt);
|
||||
@ -275,16 +236,6 @@ Signal_receiver::Signal_receiver()
|
||||
}
|
||||
|
||||
|
||||
Signal_receiver::~Signal_receiver()
|
||||
{
|
||||
Lock::Guard list_lock_guard(_contexts_lock);
|
||||
|
||||
/* disassociate contexts from the receiver */
|
||||
for (List_element<Signal_context> *le; (le = _contexts.first()); )
|
||||
_unsynchronized_dissolve(le->object());
|
||||
}
|
||||
|
||||
|
||||
Signal_context_capability Signal_receiver::manage(Signal_context *context)
|
||||
{
|
||||
if (context->_receiver)
|
||||
|
Loading…
x
Reference in New Issue
Block a user