From 70aa98d837f374b22c6b418e8d8b8db604b066f4 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Wed, 18 Mar 2015 17:42:02 +0100 Subject: [PATCH] hw: fix bug in cancellation of 'await_signal' There were two bugs. First, the caller of Kernel::await_signal wasn't re-activated for scheduling. Second, the caller did not memorize that he doesn't wait on a receiver anymore which had bad side effects on further signal handling. Fix #1459 --- repos/base-hw/src/core/kernel/signal_receiver.cc | 5 ++++- repos/base-hw/src/core/kernel/thread.cc | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/repos/base-hw/src/core/kernel/signal_receiver.cc b/repos/base-hw/src/core/kernel/signal_receiver.cc index 8a25a6cd3..8ff35588f 100644 --- a/repos/base-hw/src/core/kernel/signal_receiver.cc +++ b/repos/base-hw/src/core/kernel/signal_receiver.cc @@ -33,7 +33,10 @@ Signal_ack_handler::~Signal_ack_handler() void Signal_handler::_cancel_waiting() { - if (_receiver) { _receiver->_handler_cancelled(this); } + if (_receiver) { + _receiver->_handler_cancelled(this); + _receiver = 0; + } } diff --git a/repos/base-hw/src/core/kernel/thread.cc b/repos/base-hw/src/core/kernel/thread.cc index 12c2eee7a..7bebe62ae 100644 --- a/repos/base-hw/src/core/kernel/thread.cc +++ b/repos/base-hw/src/core/kernel/thread.cc @@ -114,6 +114,8 @@ bool Thread::_resume() return true; case AWAITS_SIGNAL: Signal_handler::cancel_waiting(); + user_arg_0(-1); + _become_active(); return true; case AWAITS_SIGNAL_CONTEXT_KILL: Signal_context_killer::cancel_waiting();