parent
b35484b8b0
commit
0f8803245a
|
@ -18,7 +18,7 @@ SRC_CC += child/child.cc
|
||||||
SRC_CC += process/process.cc
|
SRC_CC += process/process.cc
|
||||||
SRC_CC += elf/elf_binary.cc
|
SRC_CC += elf/elf_binary.cc
|
||||||
SRC_CC += lock/lock.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 += server/server.cc server/common.cc
|
||||||
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
|
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
|
||||||
SRC_CC += env/utcb.cc
|
SRC_CC += env/utcb.cc
|
||||||
|
|
|
@ -18,7 +18,7 @@ SRC_CC += child/child.cc
|
||||||
SRC_CC += process/process.cc
|
SRC_CC += process/process.cc
|
||||||
SRC_CC += elf/elf_binary.cc
|
SRC_CC += elf/elf_binary.cc
|
||||||
SRC_CC += lock/lock.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 += server/server.cc server/common.cc
|
||||||
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.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 += elf/elf_binary.cc
|
||||||
SRC_CC += lock/lock.cc
|
SRC_CC += lock/lock.cc
|
||||||
SRC_CC += env/spin_lock.cc env/cap_map.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 += server/server.cc server/common.cc
|
||||||
SRC_CC += thread/thread.cc thread/thread_bootstrap.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 += process/process.cc
|
||||||
SRC_CC += elf/elf_binary.cc
|
SRC_CC += elf/elf_binary.cc
|
||||||
SRC_CC += lock/lock.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 += server/server.cc server/common.cc
|
||||||
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.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 += elf/elf_binary.cc
|
||||||
SRC_CC += lock/lock.cc
|
SRC_CC += lock/lock.cc
|
||||||
SRC_CC += env/rm_session_mmap.cc env/debug.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
|
SRC_CC += server/server.cc server/common.cc
|
||||||
|
|
||||||
INC_DIR += $(REP_DIR)/src/base/lock $(BASE_DIR)/src/base/lock
|
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 += process/process.cc
|
||||||
SRC_CC += elf/elf_binary.cc
|
SRC_CC += elf/elf_binary.cc
|
||||||
SRC_CC += lock/lock.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 += server/server.cc
|
||||||
SRC_CC += thread/thread.cc thread/thread_context.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 += process/process.cc
|
||||||
SRC_CC += elf/elf_binary.cc
|
SRC_CC += elf/elf_binary.cc
|
||||||
SRC_CC += lock/lock.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 += server/server.cc server/common.cc
|
||||||
|
|
||||||
INC_DIR += $(REP_DIR)/src/base/lock
|
INC_DIR += $(REP_DIR)/src/base/lock
|
||||||
|
|
|
@ -18,7 +18,7 @@ SRC_CC += child/child.cc
|
||||||
SRC_CC += process/process.cc
|
SRC_CC += process/process.cc
|
||||||
SRC_CC += elf/elf_binary.cc
|
SRC_CC += elf/elf_binary.cc
|
||||||
SRC_CC += lock/lock.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 += server/server.cc server/common.cc
|
||||||
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
|
SRC_CC += thread/thread.cc thread/thread_bootstrap_empty.cc
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,12 @@
|
||||||
#include <base/semaphore.h>
|
#include <base/semaphore.h>
|
||||||
#include <signal_session/signal_session.h>
|
#include <signal_session/signal_session.h>
|
||||||
|
|
||||||
|
/* only needed for base-hw */
|
||||||
|
namespace Kernel { struct Signal_receiver; }
|
||||||
|
|
||||||
namespace Genode {
|
namespace Genode {
|
||||||
|
|
||||||
|
class Signal_source;
|
||||||
class Signal_receiver;
|
class Signal_receiver;
|
||||||
class Signal_context;
|
class Signal_context;
|
||||||
class Signal_context_registry;
|
class Signal_context_registry;
|
||||||
|
@ -79,6 +83,7 @@ namespace Genode {
|
||||||
*/
|
*/
|
||||||
Signal(Data data);
|
Signal(Data data);
|
||||||
|
|
||||||
|
friend class Kernel::Signal_receiver;
|
||||||
friend class Signal_receiver;
|
friend class Signal_receiver;
|
||||||
friend class Signal_context;
|
friend class Signal_context;
|
||||||
|
|
||||||
|
@ -218,7 +223,17 @@ namespace Genode {
|
||||||
{
|
{
|
||||||
private:
|
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
|
* List of associated contexts
|
||||||
|
|
|
@ -22,8 +22,10 @@
|
||||||
namespace Genode {
|
namespace Genode {
|
||||||
|
|
||||||
class Signal_context;
|
class Signal_context;
|
||||||
|
class Signal_receiver;
|
||||||
|
|
||||||
|
|
||||||
|
typedef Capability<Signal_receiver> Signal_receiver_capability;
|
||||||
typedef Capability<Signal_context> Signal_context_capability;
|
typedef Capability<Signal_context> Signal_context_capability;
|
||||||
typedef Capability<Signal_source> Signal_source_capability;
|
typedef Capability<Signal_source> Signal_source_capability;
|
||||||
|
|
||||||
|
|
|
@ -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_transmitter(Signal_context_capability context)
|
|
||||||
: _context(context) { }
|
|
||||||
|
|
||||||
|
|
||||||
void Signal_transmitter::context(Signal_context_capability context)
|
|
||||||
{
|
|
||||||
_context = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Signal_transmitter::submit(unsigned cnt)
|
void Signal_transmitter::submit(unsigned cnt)
|
||||||
{
|
{
|
||||||
signal_connection()->submit(_context, 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)
|
Signal_context_capability Signal_receiver::manage(Signal_context *context)
|
||||||
{
|
{
|
||||||
if (context->_receiver)
|
if (context->_receiver)
|
||||||
|
|
Loading…
Reference in New Issue