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); }; }