From 00b897af8f362c360c9e116f314d593155874478 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Sun, 22 Jan 2023 19:55:20 +0000 Subject: [PATCH] LibCore: Add nice get/set_process_name() wrappers in Core::Process `Process::get_name()` and `Process::set_name()` are basically the same as `get_process_name()` and `set_process_name()`, except making use of convenient Serenity standard types and returning ErrorOr, instead of char* and errno shenanigans. `Process::set_name()` has an optional `SetThreadName` parameter, for when you also want to set the thread's name to the same thing. That's true for the two places that use `set_process_name()`. --- Userland/Libraries/LibCore/Process.cpp | 37 ++++++++++++++++++++++++++ Userland/Libraries/LibCore/Process.h | 8 ++++++ 2 files changed, 45 insertions(+) diff --git a/Userland/Libraries/LibCore/Process.cpp b/Userland/Libraries/LibCore/Process.cpp index 8ec332a465..6553f192ed 100644 --- a/Userland/Libraries/LibCore/Process.cpp +++ b/Userland/Libraries/LibCore/Process.cpp @@ -1,19 +1,23 @@ /* * Copyright (c) 2021, Andreas Kling * Copyright (c) 2022, MacDue + * Copyright (c) 2023, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #include +#include #include #include #include #include #include +#include #ifdef AK_OS_SERENITY # include +# include #endif extern char** environ; @@ -97,4 +101,37 @@ ErrorOr Process::spawn(StringView path, Span arguments return argv.spawn(); } +ErrorOr Process::get_name() +{ +#if defined(AK_OS_SERENITY) + char buffer[BUFSIZ]; + int rc = get_process_name(buffer, BUFSIZ); + if (rc != 0) + return Error::from_syscall("get_process_name"sv, -rc); + return String::from_utf8(StringView { buffer, strlen(buffer) }); +#else + // FIXME: Implement Process::get_name() for other platforms. + return String::from_utf8_short_string("???"sv); +#endif +} + +ErrorOr Process::set_name([[maybe_unused]] StringView name, [[maybe_unused]] SetThreadName set_thread_name) +{ +#if defined(AK_OS_SERENITY) + int rc = set_process_name(name.characters_without_null_termination(), name.length()); + if (rc != 0) + return Error::from_syscall("set_process_name"sv, -rc); + if (set_thread_name == SetThreadName::No) + return {}; + + rc = syscall(SC_set_thread_name, gettid(), name.characters_without_null_termination(), name.length()); + if (rc != 0) + return Error::from_syscall("set_thread_name"sv, -rc); + return {}; +#else + // FIXME: Implement Process::set_name() for other platforms. + return {}; +#endif +} + } diff --git a/Userland/Libraries/LibCore/Process.h b/Userland/Libraries/LibCore/Process.h index 54cd6a52e8..9041f0ee0d 100644 --- a/Userland/Libraries/LibCore/Process.h +++ b/Userland/Libraries/LibCore/Process.h @@ -1,6 +1,7 @@ /* * Copyright (c) 2021, Andreas Kling * Copyright (c) 2022, MacDue + * Copyright (c) 2023, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ @@ -17,6 +18,13 @@ public: static ErrorOr spawn(StringView path, Span arguments, DeprecatedString working_directory = {}); static ErrorOr spawn(StringView path, Span arguments, DeprecatedString working_directory = {}); static ErrorOr spawn(StringView path, Span arguments = {}, DeprecatedString working_directory = {}); + + static ErrorOr get_name(); + enum class SetThreadName { + No, + Yes, + }; + static ErrorOr set_name(StringView, SetThreadName = SetThreadName::No); }; }