diff --git a/repos/os/src/test/resource_request/main.cc b/repos/os/src/test/resource_request/main.cc index 3a758dcbc..4634e8b0a 100644 --- a/repos/os/src/test/resource_request/main.cc +++ b/repos/os/src/test/resource_request/main.cc @@ -3,8 +3,8 @@ * \author Norman Feske * \date 2013-09-27 * - * This test exercises various situations where a process might need to request - * additional resources from its parent. + * This test exercises various situations where a component might need to + * request additional resources from its parent. */ /* @@ -14,50 +14,45 @@ * under the terms of the GNU General Public License version 2. */ -#include +#include #include #include -static Genode::size_t used_quota() +static void print_quota_stats(Genode::Ram_session &ram) { - return Genode::env()->ram_session()->used(); -} - - -static void print_quota_stats() -{ - Genode::log("quota: avail=", Genode::env()->ram_session()->avail(), " " - "used=", used_quota()); + Genode::log("quota: avail=", ram.avail(), " used=", ram.used()); } #define ASSERT(cond) \ if (!(cond)) { \ - Genode::error("assertion ", #cond, " failed"); \ - return -2; } + error("assertion ", #cond, " failed"); \ + throw Error(); } -int main(int argc, char **argv) +void Component::construct(Genode::Env &env) { using namespace Genode; + class Error : Exception { }; + log("--- test-resource_request started ---"); /* * Consume initial quota to let the test trigger the corner cases of * exceeded quota. */ - size_t const avail_quota = env()->ram_session()->avail(); + size_t const avail_quota = env.ram().avail(); enum { KEEP_QUOTA = 64*1024 }; size_t const wasted_quota = (avail_quota >= KEEP_QUOTA) ? avail_quota - KEEP_QUOTA : 0; if (wasted_quota) - env()->ram_session()->alloc(wasted_quota); + env.ram().alloc(wasted_quota); log("wasted available quota of ", wasted_quota, " bytes"); - print_quota_stats(); + print_quota_stats(env.ram()); /* * Out of memory while upgrading session quotas. @@ -73,20 +68,24 @@ int main(int argc, char **argv) */ log("\n-- draining signal session --"); { - enum { NUM_SIG_CTX = 2000U }; - static Signal_context sig_ctx[NUM_SIG_CTX]; - static Signal_receiver sig_rec; + struct Dummy_signal_handler : Signal_handler + { + Dummy_signal_handler(Entrypoint &ep) + : Signal_handler(ep, *this, nullptr) { } + }; + enum { NUM_SIGH = 2000U }; + static Constructible dummy_handlers[NUM_SIGH]; - for (unsigned i = 0; i < NUM_SIG_CTX; i++) - sig_rec.manage(&sig_ctx[i]); + for (unsigned i = 0; i < NUM_SIGH; i++) + dummy_handlers[i].construct(env.ep()); - print_quota_stats(); + print_quota_stats(env.ram()); - for (unsigned i = 0; i < NUM_SIG_CTX; i++) - sig_rec.dissolve(&sig_ctx[i]); + for (unsigned i = 0; i < NUM_SIGH; i++) + dummy_handlers[i].destruct(); } - print_quota_stats(); - size_t const used_quota_after_draining_session = used_quota(); + print_quota_stats(env.ram()); + size_t const used_quota_after_draining_session = env.ram().used(); /* * When creating a new session, we try to donate RAM quota to the server. @@ -94,32 +93,32 @@ int main(int argc, char **argv) * resource request to the parent. */ log("\n-- out-of-memory during session request --"); - static Ram_connection ram; - ram.ref_account(env()->ram_session_cap()); - print_quota_stats(); - size_t const used_quota_after_session_request = used_quota(); + static Ram_connection ram(env); + ram.ref_account(env.ram_session_cap()); + print_quota_stats(env.ram()); + size_t const used_quota_after_session_request = env.ram().used(); /* - * Quota transfers from the process' RAM session may result in resource + * Quota transfers from the component's RAM session may result in resource * requests, too. */ log("\n-- out-of-memory during transfer-quota --"); - int ret = env()->ram_session()->transfer_quota(ram.cap(), 512*1024); + int ret = env.ram().transfer_quota(ram.cap(), 512*1024); if (ret != 0) { error("transfer quota failed (ret = ", ret, ")"); - return -1; + throw Error(); } - print_quota_stats(); - size_t const used_quota_after_transfer = used_quota(); + print_quota_stats(env.ram()); + size_t const used_quota_after_transfer = env.ram().used(); /* * Finally, resource requests could be caused by a regular allocation, * which is the most likely case in normal scenarios. */ log("\n-- out-of-memory during RAM allocation --"); - env()->ram_session()->alloc(512*1024); - print_quota_stats(); - size_t used_quota_after_alloc = used_quota(); + env.ram().alloc(512*1024); + print_quota_stats(env.ram()); + size_t const used_quota_after_alloc = env.ram().used(); /* * Validate asserted effect of the individual steps on the used quota. @@ -129,6 +128,5 @@ int main(int argc, char **argv) ASSERT(used_quota_after_alloc > used_quota_after_transfer); log("--- finished test-resource_request ---"); - - return 0; + env.parent().exit(0); }