From cbd1464ee32dbdae3f350ee33fce782500177e52 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Thu, 22 Aug 2013 18:59:50 +0200 Subject: [PATCH] hw: fix in signal-ack handling in kernel ref #574 --- base-hw/src/core/kernel.cc | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/base-hw/src/core/kernel.cc b/base-hw/src/core/kernel.cc index a9a90053d5..7b6fa854d2 100644 --- a/base-hw/src/core/kernel.cc +++ b/base-hw/src/core/kernel.cc @@ -584,6 +584,15 @@ namespace Kernel */ void _deliver(); + /** + * Called by receiver when all submits have been delivered + */ + void _delivered() + { + _submits = 0; + _await_ack = 1; + } + public: /** @@ -654,9 +663,7 @@ namespace Kernel c->_submits); *(Signal::Data *)t->phys_utcb()->base() = data; t->received_signal(); - - /* reset context */ - c->_submits = 0; + c->_delivered(); } } @@ -1623,12 +1630,12 @@ void Signal_context::_deliver() { if (!_submits) return; _receiver->deliver(this); - _await_ack = 1; } void Signal_context::ack() { + assert(_await_ack); _await_ack = 0; if (!_killer) { _deliver();