From 9b9d1f4e12e42fdced69a27685fe8b86a0f20876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Thu, 9 Mar 2023 13:32:41 +0100 Subject: [PATCH] part_block: use expanding reporter Depending on the number of partitions the current fixed size of 4096 bytes might not be sufficient for the resulting partitions report. The use of the expanding reporter allows for accomodating large reports while still keeping the resource usage down for the common case of few partitions (with potentially short names). Fixes #4782. --- repos/os/src/server/part_block/gpt.h | 4 ++-- repos/os/src/server/part_block/main.cc | 6 +++--- repos/os/src/server/part_block/mbr.h | 4 ++-- repos/os/src/server/part_block/partition_table.h | 16 ++++++++-------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/repos/os/src/server/part_block/gpt.h b/repos/os/src/server/part_block/gpt.h index 4134fea259..e305a44215 100644 --- a/repos/os/src/server/part_block/gpt.h +++ b/repos/os/src/server/part_block/gpt.h @@ -348,9 +348,9 @@ class Block::Gpt : public Block::Partition_table } /* Report the partitions */ - if (reporter.enabled()) + if (reporter.constructed()) { - Reporter::Xml_generator xml(reporter, [&] () { + reporter->generate([&] (Xml_generator &xml) { xml.attribute("type", "gpt"); uint64_t const total_blocks = block.info().block_count; diff --git a/repos/os/src/server/part_block/main.cc b/repos/os/src/server/part_block/main.cc index d5eca0ad5a..a60bba4efc 100644 --- a/repos/os/src/server/part_block/main.cc +++ b/repos/os/src/server/part_block/main.cc @@ -212,8 +212,8 @@ class Block::Main : Rpc_object>, Attached_rom_dataspace _config { _env, "config" }; - Heap _heap { _env.ram(), _env.rm() }; - Reporter _reporter { _env, "partitions" }; + Heap _heap { _env.ram(), _env.rm() }; + Constructible _reporter { }; Number_of_bytes const _io_buffer_size = _config.xml().attribute_value("io_buffer", @@ -498,7 +498,7 @@ Block::Partition_table & Block::Main::_table() report = _config.xml().sub_node("report").attribute_value ("partitions", false); if (report) - _reporter.enabled(true); + _reporter.construct(_env, "partitions", "partitions"); } catch(...) {} /* diff --git a/repos/os/src/server/part_block/mbr.h b/repos/os/src/server/part_block/mbr.h index 65ebabb4fe..a4ec695c60 100644 --- a/repos/os/src/server/part_block/mbr.h +++ b/repos/os/src/server/part_block/mbr.h @@ -215,7 +215,7 @@ struct Block::Mbr_partition_table : public Block::Partition_table Partition(0, (block_count_t)(block.info().block_count - 1))); /* report the partitions */ - if (reporter.enabled()) { + if (reporter.constructed()) { auto gen_partition_attr = [&] (Xml_generator &xml, unsigned i) { @@ -238,7 +238,7 @@ struct Block::Mbr_partition_table : public Block::Partition_table xml.attribute("file_system", fs_type); }; - Reporter::Xml_generator xml(reporter, [&] () { + reporter->generate([&] (Xml_generator &xml) { xml.attribute("type", mbr_valid ? "mbr" : ahdi_valid ? "ahdi" : diff --git a/repos/os/src/server/part_block/partition_table.h b/repos/os/src/server/part_block/partition_table.h index a9896c2e01..faa2b90ce9 100644 --- a/repos/os/src/server/part_block/partition_table.h +++ b/repos/os/src/server/part_block/partition_table.h @@ -152,10 +152,10 @@ struct Block::Partition_table : Interface return reinterpret_cast(_buffer); } }; - Env &env; - Block_connection █ - Reporter &reporter; - Sector_data data; + Env &env; + Block_connection █ + Constructible &reporter; + Sector_data data; Io_signal_handler io_sigh { env.ep(), *this, &Partition_table::handle_io }; @@ -165,10 +165,10 @@ struct Block::Partition_table : Interface if (data.current) { data.current->handle_io(); } } - Partition_table(Env &env, - Block_connection &block, - Allocator &alloc, - Reporter &r) + Partition_table(Env &env, + Block_connection &block, + Allocator &alloc, + Constructible &r) : env(env), block(block), reporter(r), data(env, block, alloc) { }