From 32e3eee48cb803c68afefd55bd33a00993969379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Mon, 12 Aug 2013 13:00:15 +0200 Subject: [PATCH] linux: add expanding Cpu_session_client --- base-linux/src/base/env/platform_env.h | 34 ++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/base-linux/src/base/env/platform_env.h b/base-linux/src/base/env/platform_env.h index a84ff9d9bd..cbda866c13 100644 --- a/base-linux/src/base/env/platform_env.h +++ b/base-linux/src/base/env/platform_env.h @@ -293,7 +293,8 @@ namespace Genode { Expanding_ram_session_client(Ram_session_capability cap) : Ram_session_client(cap), _cap(cap) { } - Ram_dataspace_capability alloc(size_t size, bool cached) { + Ram_dataspace_capability alloc(size_t size, bool cached) + { bool try_again; do { try_again = false; @@ -316,6 +317,35 @@ namespace Genode { } }; + class Expanding_cpu_session_client : public Linux_cpu_session_client + { + Cpu_session_capability _cap; + + public: + + Expanding_cpu_session_client(Cpu_session_capability cap) + : Linux_cpu_session_client(static_cap_cast(cap)), _cap(cap) { } + + Thread_capability create_thread(Name const &name, addr_t utcb = 0) { + bool try_again; + do { + try_again = false; + try { + return Linux_cpu_session_client::create_thread(name, utcb); + } + catch (Cpu_session::Out_of_metadata) { + if (try_again) + break; + PINF("upgrade quota donation for Env::CPU session"); + env()->parent()->upgrade(_cap, "ram_quota=8K"); + try_again = true; + } + } while (try_again); + + return Thread_capability(); + } + }; + /******************************* ** Platform-specific members ** @@ -324,7 +354,7 @@ namespace Genode { Ram_session_capability _ram_session_cap; Expanding_ram_session_client _ram_session_client; Cpu_session_capability _cpu_session_cap; - Linux_cpu_session_client _cpu_session_client; + Expanding_cpu_session_client _cpu_session_client; Rm_session_mmap _rm_session_mmap; Pd_session_client _pd_session_client;