From 88b370bda206c267f97821f16679801c92b6b0f8 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Fri, 23 Nov 2012 16:47:42 +0100 Subject: [PATCH] base-hw: Full quota upgrading in signal receiver. Fix #518 --- base-hw/src/base/signal/signal.cc | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/base-hw/src/base/signal/signal.cc b/base-hw/src/base/signal/signal.cc index 1df03d850..961548dac 100644 --- a/base-hw/src/base/signal/signal.cc +++ b/base-hw/src/base/signal/signal.cc @@ -35,12 +35,26 @@ static Signal_connection * signal_connection() *********************/ -Signal_receiver::Signal_receiver() : - _cap(signal_connection()->alloc_receiver()) +Signal_receiver::Signal_receiver() { - if (!_cap.valid()) { - PERR("%s: Failed to create receiver", __PRETTY_FUNCTION__); - while (1) ; + /* create a kernel object that corresponds to the receiver */ + bool session_upgraded = 0; + Signal_connection * const s = signal_connection(); + while (1) { + try { + _cap = s->alloc_receiver(); + break; + } catch (Signal_session::Out_of_metadata) + { + /* upgrade session quota and try again, but only once */ + if (session_upgraded) { + PDBG("Failed to alloc signal receiver"); + break; + } + PINF("upgrade quota donation for Signal session"); + env()->parent()->upgrade(s->cap(), "ram_quota=4K"); + session_upgraded = 1; + } } } @@ -75,6 +89,7 @@ Signal_context_capability Signal_receiver::manage(Signal_context * const c) } catch (Signal_session::Out_of_metadata) { /* upgrade session quota and try again, but only once */ + PINF("upgrade quota donation for Signal session"); if (session_upgraded) return Signal_context_capability(); env()->parent()->upgrade(s->cap(), "ram_quota=4K"); session_upgraded = 1;