mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:57:36 +00:00
Kernel: Move CommandLine API to use AK::StringView instead of AK::String
The current CommandLine API unfortunately allocates Strings just to query the presence of arguments on the command line. Switch the API to use StringView instead to reduce the number of String allocations.
This commit is contained in:
parent
89dceb178b
commit
35a97884aa
2 changed files with 43 additions and 42 deletions
|
@ -50,17 +50,18 @@ UNMAP_AFTER_INIT void CommandLine::build_commandline(const String& cmdline_from_
|
||||||
m_string = builder.to_string();
|
m_string = builder.to_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT void CommandLine::add_arguments(const Vector<String>& args)
|
UNMAP_AFTER_INIT void CommandLine::add_arguments(const Vector<StringView>& args)
|
||||||
{
|
{
|
||||||
for (auto&& str : args) {
|
for (auto&& str : args) {
|
||||||
if (str == "") {
|
if (str == ""sv) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pair = str.split_limit('=', 2);
|
auto pair = str.split_view('=', false);
|
||||||
|
VERIFY(pair.size() == 2 || pair.size() == 1);
|
||||||
|
|
||||||
if (pair.size() == 1) {
|
if (pair.size() == 1) {
|
||||||
m_params.set(move(pair[0]), "");
|
m_params.set(move(pair[0]), ""sv);
|
||||||
} else {
|
} else {
|
||||||
m_params.set(move(pair[0]), move(pair[1]));
|
m_params.set(move(pair[0]), move(pair[1]));
|
||||||
}
|
}
|
||||||
|
@ -71,114 +72,114 @@ UNMAP_AFTER_INIT CommandLine::CommandLine(const String& cmdline_from_bootloader)
|
||||||
{
|
{
|
||||||
s_the = this;
|
s_the = this;
|
||||||
build_commandline(cmdline_from_bootloader);
|
build_commandline(cmdline_from_bootloader);
|
||||||
const auto& args = m_string.split(' ');
|
const auto& args = m_string.split_view(' ');
|
||||||
m_params.ensure_capacity(args.size());
|
m_params.ensure_capacity(args.size());
|
||||||
add_arguments(args);
|
add_arguments(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<String> CommandLine::lookup(const String& key) const
|
Optional<String> CommandLine::lookup(const StringView& key) const
|
||||||
{
|
{
|
||||||
return m_params.get(key);
|
return m_params.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CommandLine::contains(const String& key) const
|
bool CommandLine::contains(const StringView& key) const
|
||||||
{
|
{
|
||||||
return m_params.contains(key);
|
return m_params.contains(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool CommandLine::is_boot_profiling_enabled() const
|
UNMAP_AFTER_INIT bool CommandLine::is_boot_profiling_enabled() const
|
||||||
{
|
{
|
||||||
return contains("boot_prof");
|
return contains("boot_prof"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool CommandLine::is_ide_enabled() const
|
UNMAP_AFTER_INIT bool CommandLine::is_ide_enabled() const
|
||||||
{
|
{
|
||||||
return !contains("disable_ide");
|
return !contains("disable_ide"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool CommandLine::is_smp_enabled() const
|
UNMAP_AFTER_INIT bool CommandLine::is_smp_enabled() const
|
||||||
{
|
{
|
||||||
return lookup("smp").value_or("off") == "on";
|
return lookup("smp"sv).value_or("off"sv) == "on"sv;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool CommandLine::is_vmmouse_enabled() const
|
UNMAP_AFTER_INIT bool CommandLine::is_vmmouse_enabled() const
|
||||||
{
|
{
|
||||||
return lookup("vmmouse").value_or("on") == "on";
|
return lookup("vmmouse"sv).value_or("on") == "on"sv;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT PCIAccessLevel CommandLine::pci_access_level() const
|
UNMAP_AFTER_INIT PCIAccessLevel CommandLine::pci_access_level() const
|
||||||
{
|
{
|
||||||
auto value = lookup("pci_ecam").value_or("off");
|
auto value = lookup("pci_ecam"sv).value_or("off"sv);
|
||||||
if (value == "on")
|
if (value == "on"sv)
|
||||||
return PCIAccessLevel::MappingPerBus;
|
return PCIAccessLevel::MappingPerBus;
|
||||||
if (value == "per-device")
|
if (value == "per-device"sv)
|
||||||
return PCIAccessLevel::MappingPerDevice;
|
return PCIAccessLevel::MappingPerDevice;
|
||||||
if (value == "off")
|
if (value == "off"sv)
|
||||||
return PCIAccessLevel::IOAddressing;
|
return PCIAccessLevel::IOAddressing;
|
||||||
PANIC("Unknown PCI ECAM setting: {}", value);
|
PANIC("Unknown PCI ECAM setting: {}", value);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool CommandLine::is_legacy_time_enabled() const
|
UNMAP_AFTER_INIT bool CommandLine::is_legacy_time_enabled() const
|
||||||
{
|
{
|
||||||
return lookup("time").value_or("modern") == "legacy";
|
return lookup("time"sv).value_or("modern"sv) == "legacy"sv;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool CommandLine::is_force_pio() const
|
UNMAP_AFTER_INIT bool CommandLine::is_force_pio() const
|
||||||
{
|
{
|
||||||
return contains("force_pio");
|
return contains("force_pio"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT String CommandLine::root_device() const
|
UNMAP_AFTER_INIT String CommandLine::root_device() const
|
||||||
{
|
{
|
||||||
return lookup("root").value_or("/dev/hda");
|
return lookup("root"sv).value_or("/dev/hda"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT AcpiFeatureLevel CommandLine::acpi_feature_level() const
|
UNMAP_AFTER_INIT AcpiFeatureLevel CommandLine::acpi_feature_level() const
|
||||||
{
|
{
|
||||||
auto value = kernel_command_line().lookup("acpi").value_or("on");
|
auto value = kernel_command_line().lookup("acpi"sv).value_or("on"sv);
|
||||||
if (value == "limited")
|
if (value == "limited"sv)
|
||||||
return AcpiFeatureLevel::Limited;
|
return AcpiFeatureLevel::Limited;
|
||||||
if (value == "off")
|
if (value == "off"sv)
|
||||||
return AcpiFeatureLevel::Disabled;
|
return AcpiFeatureLevel::Disabled;
|
||||||
return AcpiFeatureLevel::Enabled;
|
return AcpiFeatureLevel::Enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT HPETMode CommandLine::hpet_mode() const
|
UNMAP_AFTER_INIT HPETMode CommandLine::hpet_mode() const
|
||||||
{
|
{
|
||||||
auto hpet_mode = lookup("hpet").value_or("periodic");
|
auto hpet_mode = lookup("hpet"sv).value_or("periodic"sv);
|
||||||
if (hpet_mode == "periodic")
|
if (hpet_mode == "periodic"sv)
|
||||||
return HPETMode::Periodic;
|
return HPETMode::Periodic;
|
||||||
if (hpet_mode == "nonperiodic")
|
if (hpet_mode == "nonperiodic"sv)
|
||||||
return HPETMode::NonPeriodic;
|
return HPETMode::NonPeriodic;
|
||||||
PANIC("Unknown HPETMode: {}", hpet_mode);
|
PANIC("Unknown HPETMode: {}", hpet_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool CommandLine::disable_ps2_controller() const
|
UNMAP_AFTER_INIT bool CommandLine::disable_ps2_controller() const
|
||||||
{
|
{
|
||||||
return contains("disable_ps2_controller");
|
return contains("disable_ps2_controller"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool CommandLine::disable_physical_storage() const
|
UNMAP_AFTER_INIT bool CommandLine::disable_physical_storage() const
|
||||||
{
|
{
|
||||||
return contains("disable_physical_storage");
|
return contains("disable_physical_storage"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool CommandLine::disable_uhci_controller() const
|
UNMAP_AFTER_INIT bool CommandLine::disable_uhci_controller() const
|
||||||
{
|
{
|
||||||
return contains("disable_uhci_controller");
|
return contains("disable_uhci_controller"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT bool CommandLine::disable_virtio() const
|
UNMAP_AFTER_INIT bool CommandLine::disable_virtio() const
|
||||||
{
|
{
|
||||||
return contains("disable_virtio");
|
return contains("disable_virtio"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
UNMAP_AFTER_INIT AHCIResetMode CommandLine::ahci_reset_mode() const
|
UNMAP_AFTER_INIT AHCIResetMode CommandLine::ahci_reset_mode() const
|
||||||
{
|
{
|
||||||
const auto ahci_reset_mode = lookup("ahci_reset_mode").value_or("controller");
|
const auto ahci_reset_mode = lookup("ahci_reset_mode"sv).value_or("controllers"sv);
|
||||||
if (ahci_reset_mode == "controller") {
|
if (ahci_reset_mode == "controllers"sv) {
|
||||||
return AHCIResetMode::ControllerOnly;
|
return AHCIResetMode::ControllerOnly;
|
||||||
} else if (ahci_reset_mode == "aggressive") {
|
} else if (ahci_reset_mode == "aggressive"sv) {
|
||||||
return AHCIResetMode::Aggressive;
|
return AHCIResetMode::Aggressive;
|
||||||
}
|
}
|
||||||
PANIC("Unknown AHCIResetMode: {}", ahci_reset_mode);
|
PANIC("Unknown AHCIResetMode: {}", ahci_reset_mode);
|
||||||
|
@ -186,12 +187,12 @@ UNMAP_AFTER_INIT AHCIResetMode CommandLine::ahci_reset_mode() const
|
||||||
|
|
||||||
UNMAP_AFTER_INIT BootMode CommandLine::boot_mode() const
|
UNMAP_AFTER_INIT BootMode CommandLine::boot_mode() const
|
||||||
{
|
{
|
||||||
const auto boot_mode = lookup("boot_mode").value_or("graphical");
|
const auto boot_mode = lookup("boot_mode"sv).value_or("graphical"sv);
|
||||||
if (boot_mode == "no-fbdev") {
|
if (boot_mode == "no-fbdevsv") {
|
||||||
return BootMode::NoFramebufferDevices;
|
return BootMode::NoFramebufferDevices;
|
||||||
} else if (boot_mode == "self-test") {
|
} else if (boot_mode == "self-test"sv) {
|
||||||
return BootMode::SelfTest;
|
return BootMode::SelfTest;
|
||||||
} else if (boot_mode == "graphical") {
|
} else if (boot_mode == "graphical"sv) {
|
||||||
return BootMode::Graphical;
|
return BootMode::Graphical;
|
||||||
}
|
}
|
||||||
PANIC("Unknown BootMode: {}", boot_mode);
|
PANIC("Unknown BootMode: {}", boot_mode);
|
||||||
|
@ -205,12 +206,12 @@ UNMAP_AFTER_INIT bool CommandLine::is_no_framebuffer_devices_mode() const
|
||||||
|
|
||||||
String CommandLine::userspace_init() const
|
String CommandLine::userspace_init() const
|
||||||
{
|
{
|
||||||
return lookup("init").value_or("/bin/SystemServer");
|
return lookup("init"sv).value_or("/bin/SystemServer"sv);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<String> CommandLine::userspace_init_args() const
|
Vector<String> CommandLine::userspace_init_args() const
|
||||||
{
|
{
|
||||||
auto init_args = lookup("init_args").value_or("").split(',');
|
auto init_args = lookup("init_args"sv).value_or(""sv).split(',');
|
||||||
if (!init_args.is_empty())
|
if (!init_args.is_empty())
|
||||||
init_args.prepend(userspace_init());
|
init_args.prepend(userspace_init());
|
||||||
|
|
||||||
|
@ -219,7 +220,7 @@ Vector<String> CommandLine::userspace_init_args() const
|
||||||
|
|
||||||
UNMAP_AFTER_INIT size_t CommandLine::switch_to_tty() const
|
UNMAP_AFTER_INIT size_t CommandLine::switch_to_tty() const
|
||||||
{
|
{
|
||||||
const auto default_tty = lookup("switch_to_tty").value_or("1");
|
const auto default_tty = lookup("switch_to_tty"sv).value_or("1"sv);
|
||||||
auto switch_tty_number = default_tty.to_uint();
|
auto switch_tty_number = default_tty.to_uint();
|
||||||
if (switch_tty_number.has_value() && switch_tty_number.value() >= 1) {
|
if (switch_tty_number.has_value() && switch_tty_number.value() >= 1) {
|
||||||
return switch_tty_number.value() - 1;
|
return switch_tty_number.value() - 1;
|
||||||
|
|
|
@ -49,8 +49,8 @@ public:
|
||||||
static void initialize();
|
static void initialize();
|
||||||
|
|
||||||
[[nodiscard]] const String& string() const { return m_string; }
|
[[nodiscard]] const String& string() const { return m_string; }
|
||||||
Optional<String> lookup(const String& key) const;
|
Optional<String> lookup(const StringView& key) const;
|
||||||
[[nodiscard]] bool contains(const String& key) const;
|
[[nodiscard]] bool contains(const StringView& key) const;
|
||||||
|
|
||||||
[[nodiscard]] bool is_boot_profiling_enabled() const;
|
[[nodiscard]] bool is_boot_profiling_enabled() const;
|
||||||
[[nodiscard]] bool is_ide_enabled() const;
|
[[nodiscard]] bool is_ide_enabled() const;
|
||||||
|
@ -76,11 +76,11 @@ public:
|
||||||
private:
|
private:
|
||||||
CommandLine(const String&);
|
CommandLine(const String&);
|
||||||
|
|
||||||
void add_arguments(const Vector<String>& args);
|
void add_arguments(const Vector<StringView>& args);
|
||||||
void build_commandline(const String& cmdline_from_bootloader);
|
void build_commandline(const String& cmdline_from_bootloader);
|
||||||
|
|
||||||
String m_string;
|
String m_string;
|
||||||
HashMap<String, String> m_params;
|
HashMap<StringView, StringView> m_params;
|
||||||
};
|
};
|
||||||
|
|
||||||
const CommandLine& kernel_command_line();
|
const CommandLine& kernel_command_line();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue