diff --git a/repos/base/src/base/signal/signal.cc b/repos/base/src/base/signal/signal.cc index e44819d8d8..2527ac0cfd 100644 --- a/repos/base/src/base/signal/signal.cc +++ b/repos/base/src/base/signal/signal.cc @@ -295,8 +295,13 @@ Signal_context_capability Signal_receiver::manage(Signal_context *context) if (try_again) break; - PINF("upgrading quota donation for SIGNAL session"); - env()->parent()->upgrade(signal_connection()->cap(), "ram_quota=4K"); + size_t const quota = 1024*sizeof(long); + char buf[64]; + snprintf(buf, sizeof(buf), "ram_quota=%zu", quota); + + PINF("upgrading quota donation for SIGNAL session (%zu bytes)", quota); + + env()->parent()->upgrade(signal_connection()->cap(), buf); try_again = true; } } while (try_again); diff --git a/repos/base/src/core/include/signal_session_component.h b/repos/base/src/core/include/signal_session_component.h index a30db51430..8a148a8440 100644 --- a/repos/base/src/core/include/signal_session_component.h +++ b/repos/base/src/core/include/signal_session_component.h @@ -143,7 +143,8 @@ namespace Genode { Signal_source_component _source; Signal_source_capability _source_cap; Allocator_guard _md_alloc; - Tslab _contexts_slab; + Tslab _contexts_slab; Ipc_ostream *_ipc_ostream; public: diff --git a/repos/os/src/test/signal/main.cc b/repos/os/src/test/signal/main.cc index 2cb80c4067..2d90749c60 100644 --- a/repos/os/src/test/signal/main.cc +++ b/repos/os/src/test/signal/main.cc @@ -562,6 +562,7 @@ class Signal_context_destroyer : public Thread<4096> } }; + static void synchronized_context_destruction_test() { Signal_receiver receiver; @@ -598,6 +599,25 @@ static void synchronized_context_destruction_test() } +static void many_managed_contexts() +{ + for (unsigned round = 0; round < 10; ++round) { + + unsigned const num_contexts = 200 + 5*round; + printf("round %u: create and manage %u contexts\n", round, num_contexts); + + Signal_receiver rec; + + for (unsigned i = 0; i < num_contexts; ++i) { + Id_signal_context *context = new (env()->heap()) Id_signal_context(i); + rec.manage(context); + } + } + + printf("many contexts finished\n"); +} + + /** * Main program */ @@ -611,6 +631,7 @@ int main(int, char **) lazy_receivers_test(); check_context_management(); synchronized_context_destruction_test(); + many_managed_contexts(); printf("--- signalling test finished ---\n"); return 0;