diff --git a/Userland/Applications/SystemMonitor/ProcessModel.cpp b/Userland/Applications/SystemMonitor/ProcessModel.cpp index 9310688d9c..119913ea45 100644 --- a/Userland/Applications/SystemMonitor/ProcessModel.cpp +++ b/Userland/Applications/SystemMonitor/ProcessModel.cpp @@ -433,16 +433,16 @@ void ProcessModel::update() HashTable live_tids; u64 total_time_scheduled_diff = 0; - if (all_processes.has_value()) { + if (!all_processes.is_error()) { if (m_has_total_scheduled_time) - total_time_scheduled_diff = all_processes->total_time_scheduled - m_total_time_scheduled; + total_time_scheduled_diff = all_processes.value().total_time_scheduled - m_total_time_scheduled; - m_total_time_scheduled = all_processes->total_time_scheduled; - m_total_time_scheduled_kernel = all_processes->total_time_scheduled_kernel; + m_total_time_scheduled = all_processes.value().total_time_scheduled; + m_total_time_scheduled_kernel = all_processes.value().total_time_scheduled_kernel; m_has_total_scheduled_time = true; - for (size_t i = 0; i < all_processes->processes.size(); ++i) { - auto const& process = all_processes->processes[i]; + for (size_t i = 0; i < all_processes.value().processes.size(); ++i) { + auto const& process = all_processes.value().processes[i]; NonnullOwnPtr* process_state = nullptr; for (size_t i = 0; i < m_processes.size(); ++i) { auto* other_process = &m_processes.ptr_at(i); @@ -549,7 +549,7 @@ void ProcessModel::update() on_cpu_info_change(m_cpus); if (on_state_update) - on_state_update(all_processes.has_value() ? all_processes->processes.size() : 0, m_threads.size()); + on_state_update(!all_processes.is_error() ? all_processes.value().processes.size() : 0, m_threads.size()); // FIXME: This is a rather hackish way of invalidating indices. // It would be good if GUI::Model had a way to orchestrate removal/insertion while preserving indices. diff --git a/Userland/Demos/CatDog/CatDog.cpp b/Userland/Demos/CatDog/CatDog.cpp index 66d6e16e31..5d217726e0 100644 --- a/Userland/Demos/CatDog/CatDog.cpp +++ b/Userland/Demos/CatDog/CatDog.cpp @@ -12,8 +12,8 @@ void CatDog::timer_event(Core::TimerEvent&) { - auto maybe_proc_info = Core::ProcessStatisticsReader::get_all(m_proc_all); - if (maybe_proc_info.has_value()) { + auto maybe_proc_info = Core::ProcessStatisticsReader::get_all(*m_proc_all); + if (!maybe_proc_info.is_error()) { auto proc_info = maybe_proc_info.release_value(); auto maybe_paint_program = proc_info.processes.first_matching([](auto& process) { diff --git a/Userland/Demos/CatDog/CatDog.h b/Userland/Demos/CatDog/CatDog.h index 8857b6e4c6..96b698af7b 100644 --- a/Userland/Demos/CatDog/CatDog.h +++ b/Userland/Demos/CatDog/CatDog.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -72,7 +73,7 @@ private: bool m_up, m_down, m_left, m_right; bool m_roaming { true }; - RefPtr m_proc_all; + NonnullOwnPtr m_proc_all; NonnullRefPtr m_alert = *Gfx::Bitmap::try_load_from_file("/res/icons/catdog/alert.png"sv).release_value_but_fixme_should_propagate_errors(); NonnullRefPtr m_artist = *Gfx::Bitmap::try_load_from_file("/res/icons/catdog/artist.png"sv).release_value_but_fixme_should_propagate_errors(); @@ -126,7 +127,7 @@ private: CatDog() : m_temp_pos { 0, 0 } - , m_proc_all(MUST(Core::File::open("/sys/kernel/processes", Core::OpenMode::ReadOnly))) + , m_proc_all(MUST(Core::Stream::File::open("/sys/kernel/processes"sv, Core::Stream::OpenMode::Read))) { set_image_by_main_state(); } diff --git a/Userland/DevTools/Profiler/main.cpp b/Userland/DevTools/Profiler/main.cpp index c06a6057dc..fe3bad2b65 100644 --- a/Userland/DevTools/Profiler/main.cpp +++ b/Userland/DevTools/Profiler/main.cpp @@ -352,8 +352,8 @@ bool generate_profile(pid_t& pid) DeprecatedString process_name; auto all_processes = Core::ProcessStatisticsReader::get_all(); - if (all_processes.has_value()) { - auto& processes = all_processes->processes; + if (!all_processes.is_error()) { + auto& processes = all_processes.value().processes; if (auto it = processes.find_if([&](auto& entry) { return entry.pid == pid; }); it != processes.end()) process_name = it->name; else diff --git a/Userland/Libraries/LibCore/ProcessStatisticsReader.cpp b/Userland/Libraries/LibCore/ProcessStatisticsReader.cpp index c5f79f6d2e..8f2ea44cc0 100644 --- a/Userland/Libraries/LibCore/ProcessStatisticsReader.cpp +++ b/Userland/Libraries/LibCore/ProcessStatisticsReader.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include #include @@ -16,29 +15,14 @@ namespace Core { HashMap ProcessStatisticsReader::s_usernames; -Optional ProcessStatisticsReader::get_all(RefPtr& proc_all_file, bool include_usernames) +ErrorOr ProcessStatisticsReader::get_all(Core::Stream::SeekableStream& proc_all_file, bool include_usernames) { - if (proc_all_file) { - if (!proc_all_file->seek(0, Core::SeekMode::SetPosition)) { - warnln("ProcessStatisticsReader: Failed to refresh /sys/kernel/processes: {}", proc_all_file->error_string()); - return {}; - } - } else { - proc_all_file = Core::File::construct("/sys/kernel/processes"); - if (!proc_all_file->open(Core::OpenMode::ReadOnly)) { - warnln("ProcessStatisticsReader: Failed to open /sys/kernel/processes: {}", proc_all_file->error_string()); - return {}; - } - } + TRY(proc_all_file.seek(0, Core::Stream::SeekMode::SetPosition)); AllProcessesStatistics all_processes_statistics; - auto file_contents = proc_all_file->read_all(); - auto json = JsonValue::from_string(file_contents); - if (json.is_error()) - return {}; - - auto& json_obj = json.value().as_object(); + auto file_contents = TRY(proc_all_file.read_all()); + auto json_obj = TRY(JsonValue::from_string(file_contents)).as_object(); json_obj.get("processes"sv).as_array().for_each([&](auto& value) { const JsonObject& process_object = value.as_object(); Core::ProcessStatistics process; @@ -104,10 +88,10 @@ Optional ProcessStatisticsReader::get_all(RefPtr ProcessStatisticsReader::get_all(bool include_usernames) +ErrorOr ProcessStatisticsReader::get_all(bool include_usernames) { - RefPtr proc_all_file; - return get_all(proc_all_file, include_usernames); + auto proc_all_file = TRY(Core::Stream::File::open("/sys/kernel/processes"sv, Core::Stream::OpenMode::Read)); + return get_all(*proc_all_file, include_usernames); } DeprecatedString ProcessStatisticsReader::username_from_uid(uid_t uid) diff --git a/Userland/Libraries/LibCore/ProcessStatisticsReader.h b/Userland/Libraries/LibCore/ProcessStatisticsReader.h index 1de6a7c03b..a5d4c9a679 100644 --- a/Userland/Libraries/LibCore/ProcessStatisticsReader.h +++ b/Userland/Libraries/LibCore/ProcessStatisticsReader.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include namespace Core { @@ -72,8 +72,8 @@ struct AllProcessesStatistics { class ProcessStatisticsReader { public: - static Optional get_all(RefPtr&, bool include_usernames = true); - static Optional get_all(bool include_usernames = true); + static ErrorOr get_all(Core::Stream::SeekableStream&, bool include_usernames = true); + static ErrorOr get_all(bool include_usernames = true); private: static DeprecatedString username_from_uid(uid_t); diff --git a/Userland/Libraries/LibCore/SessionManagement.cpp b/Userland/Libraries/LibCore/SessionManagement.cpp index acbe29e828..fb78e5dfae 100644 --- a/Userland/Libraries/LibCore/SessionManagement.cpp +++ b/Userland/Libraries/LibCore/SessionManagement.cpp @@ -22,14 +22,12 @@ static ErrorOr get_proc(Core::AllProcessesStatis ErrorOr root_session_id(Optional force_sid) { - auto stats = Core::ProcessStatisticsReader::get_all(false); - if (!stats.has_value()) - return Error::from_string_literal("Failed to get all process statistics"); + auto stats = TRY(Core::ProcessStatisticsReader::get_all(false)); pid_t sid = (force_sid.has_value()) ? force_sid.value() : TRY(System::getsid()); while (true) { - pid_t parent = TRY(get_proc(stats.value(), sid))->ppid; - pid_t parent_sid = TRY(get_proc(stats.value(), parent))->sid; + pid_t parent = TRY(get_proc(stats, sid))->ppid; + pid_t parent_sid = TRY(get_proc(stats, parent))->sid; if (parent_sid == 0) break; diff --git a/Userland/Libraries/LibGUI/RunningProcessesModel.cpp b/Userland/Libraries/LibGUI/RunningProcessesModel.cpp index f4bc37124f..d0af1001a0 100644 --- a/Userland/Libraries/LibGUI/RunningProcessesModel.cpp +++ b/Userland/Libraries/LibGUI/RunningProcessesModel.cpp @@ -21,7 +21,7 @@ void RunningProcessesModel::update() m_processes.clear(); auto all_processes = Core::ProcessStatisticsReader::get_all(); - if (all_processes.has_value()) { + if (!all_processes.is_error()) { for (auto& it : all_processes.value().processes) { Process process; process.pid = it.pid; diff --git a/Userland/Services/WindowServer/Window.cpp b/Userland/Services/WindowServer/Window.cpp index 8619863ef7..f07c97484c 100644 --- a/Userland/Services/WindowServer/Window.cpp +++ b/Userland/Services/WindowServer/Window.cpp @@ -1073,15 +1073,13 @@ ErrorOr> Window::compute_title_username(ConnectionFro { if (!client) return Error::from_string_literal("Tried to compute title username without a client"); - auto stats = Core::ProcessStatisticsReader::get_all(true); - if (!stats.has_value()) - return Error::from_string_literal("Failed to get all process statistics"); + auto stats = TRY(Core::ProcessStatisticsReader::get_all(true)); pid_t client_pid = TRY(client->socket().peer_pid()); - auto client_stat = stats.value().processes.first_matching([&](auto& stat) { return stat.pid == client_pid; }); + auto client_stat = stats.processes.first_matching([&](auto& stat) { return stat.pid == client_pid; }); if (!client_stat.has_value()) return Error::from_string_literal("Failed to find client process stat"); pid_t login_session_pid = TRY(Core::SessionManagement::root_session_id(client_pid)); - auto login_session_stat = stats.value().processes.first_matching([&](auto& stat) { return stat.pid == login_session_pid; }); + auto login_session_stat = stats.processes.first_matching([&](auto& stat) { return stat.pid == login_session_pid; }); if (!login_session_stat.has_value()) return Error::from_string_literal("Failed to find login process stat"); if (login_session_stat.value().uid == client_stat.value().uid) diff --git a/Userland/Utilities/killall.cpp b/Userland/Utilities/killall.cpp index 280afe7cc6..a2e57d1f27 100644 --- a/Userland/Utilities/killall.cpp +++ b/Userland/Utilities/killall.cpp @@ -21,11 +21,9 @@ static void print_usage_and_exit() static ErrorOr kill_all(DeprecatedString const& process_name, unsigned const signum) { - auto all_processes = Core::ProcessStatisticsReader::get_all(); - if (!all_processes.has_value()) - return 1; + auto all_processes = TRY(Core::ProcessStatisticsReader::get_all()); - for (auto& process : all_processes.value().processes) { + for (auto& process : all_processes.processes) { if (process.name == process_name) { TRY(Core::System::kill(process.pid, signum)); } diff --git a/Userland/Utilities/lsof.cpp b/Userland/Utilities/lsof.cpp index 2e829c01c1..5d38b6e24d 100644 --- a/Userland/Utilities/lsof.cpp +++ b/Userland/Utilities/lsof.cpp @@ -141,11 +141,9 @@ ErrorOr serenity_main(Main::Arguments arguments) } outln("{:28} {:>4} {:>4} {:10} {:>4} {}", "COMMAND", "PID", "PGID", "USER", "FD", "NAME"); - auto all_processes = Core::ProcessStatisticsReader::get_all(); - if (!all_processes.has_value()) - return 1; + auto all_processes = TRY(Core::ProcessStatisticsReader::get_all()); if (arg_pid == -1) { - for (auto& process : all_processes.value().processes) { + for (auto& process : all_processes.processes) { if (process.pid == 0) continue; auto open_files = get_open_files_by_pid(process.pid); @@ -170,7 +168,7 @@ ErrorOr serenity_main(Main::Arguments arguments) return 0; for (auto& file : open_files) { - display_entry(file, *all_processes->processes.find_if([&](auto& entry) { return entry.pid == arg_pid; })); + display_entry(file, *all_processes.processes.find_if([&](auto& entry) { return entry.pid == arg_pid; })); } } diff --git a/Userland/Utilities/netstat.cpp b/Userland/Utilities/netstat.cpp index 02f18540b2..50cdf124cc 100644 --- a/Userland/Utilities/netstat.cpp +++ b/Userland/Utilities/netstat.cpp @@ -58,11 +58,9 @@ ErrorOr serenity_main(Main::Arguments arguments) HashMap programs; if (flag_program) { - auto processes = Core::ProcessStatisticsReader::get_all(); - if (!processes.has_value()) - return 1; + auto processes = TRY(Core::ProcessStatisticsReader::get_all()); - for (auto& proc : processes.value().processes) { + for (auto& proc : processes.processes) { programs.set(proc.pid, proc.name); } } diff --git a/Userland/Utilities/pgrep.cpp b/Userland/Utilities/pgrep.cpp index d7929c91e5..82a5e83c12 100644 --- a/Userland/Utilities/pgrep.cpp +++ b/Userland/Utilities/pgrep.cpp @@ -38,12 +38,10 @@ ErrorOr serenity_main(Main::Arguments args) return 1; } - auto all_processes = Core::ProcessStatisticsReader::get_all(); - if (!all_processes.has_value()) - return 1; + auto all_processes = TRY(Core::ProcessStatisticsReader::get_all()); Vector matches; - for (auto& it : all_processes.value().processes) { + for (auto& it : all_processes.processes) { auto result = re.match(it.name, PosixFlags::Global); if (result.success ^ invert_match) { matches.append(it.pid); diff --git a/Userland/Utilities/pidof.cpp b/Userland/Utilities/pidof.cpp index 5ab63027c6..64b437b21a 100644 --- a/Userland/Utilities/pidof.cpp +++ b/Userland/Utilities/pidof.cpp @@ -18,11 +18,9 @@ static ErrorOr pid_of(DeprecatedString const& process_name, bool single_sho { bool displayed_at_least_one = false; - auto all_processes = Core::ProcessStatisticsReader::get_all(); - if (!all_processes.has_value()) - return 1; + auto all_processes = TRY(Core::ProcessStatisticsReader::get_all()); - for (auto& it : all_processes.value().processes) { + for (auto& it : all_processes.processes) { if (it.name == process_name) { if (!omit_pid || it.pid != pid) { out(displayed_at_least_one ? " {}"sv : "{}"sv, it.pid); diff --git a/Userland/Utilities/pkill.cpp b/Userland/Utilities/pkill.cpp index 057a8fd73f..754cf3d693 100644 --- a/Userland/Utilities/pkill.cpp +++ b/Userland/Utilities/pkill.cpp @@ -34,10 +34,7 @@ ErrorOr serenity_main(Main::Arguments args) args_parser.add_positional_argument(pattern, "Process name to search for", "process-name"); args_parser.parse(args); - auto all_processes = Core::ProcessStatisticsReader::get_all(); - if (!all_processes.has_value()) { - return 1; - } + auto all_processes = TRY(Core::ProcessStatisticsReader::get_all()); PosixOptions options {}; if (case_insensitive) { @@ -50,7 +47,7 @@ ErrorOr serenity_main(Main::Arguments args) } Vector matched_processes; - for (auto& process : all_processes.value().processes) { + for (auto& process : all_processes.processes) { auto result = re.match(process.name, PosixFlags::Global); if (result.success) { matched_processes.append(process); diff --git a/Userland/Utilities/ps.cpp b/Userland/Utilities/ps.cpp index bfce160cf3..8bddf29722 100644 --- a/Userland/Utilities/ps.cpp +++ b/Userland/Utilities/ps.cpp @@ -98,11 +98,9 @@ ErrorOr serenity_main(Main::Arguments arguments) cmd_column = add_column("CMD", Alignment::Left); } - auto all_processes = Core::ProcessStatisticsReader::get_all(); - if (!all_processes.has_value()) - return 1; + auto all_processes = TRY(Core::ProcessStatisticsReader::get_all()); - auto& processes = all_processes.value().processes; + auto& processes = all_processes.processes; if (!pid_list.is_empty()) { every_process_flag = true; diff --git a/Userland/Utilities/top.cpp b/Userland/Utilities/top.cpp index d121ffcf30..490c673fac 100644 --- a/Userland/Utilities/top.cpp +++ b/Userland/Utilities/top.cpp @@ -89,14 +89,12 @@ struct Snapshot { u64 total_time_scheduled_kernel { 0 }; }; -static Snapshot get_snapshot() +static ErrorOr get_snapshot() { - auto all_processes = Core::ProcessStatisticsReader::get_all(); - if (!all_processes.has_value()) - return {}; + auto all_processes = TRY(Core::ProcessStatisticsReader::get_all()); Snapshot snapshot; - for (auto& process : all_processes.value().processes) { + for (auto& process : all_processes.processes) { for (auto& thread : process.threads) { ThreadData thread_data; thread_data.tid = thread.tid; @@ -126,8 +124,8 @@ static Snapshot get_snapshot() } } - snapshot.total_time_scheduled = all_processes->total_time_scheduled; - snapshot.total_time_scheduled_kernel = all_processes->total_time_scheduled_kernel; + snapshot.total_time_scheduled = all_processes.total_time_scheduled; + snapshot.total_time_scheduled_kernel = all_processes.total_time_scheduled_kernel; return snapshot; } @@ -216,7 +214,7 @@ ErrorOr serenity_main(Main::Arguments arguments) enable_nonblocking_stdin(); Vector threads; - auto prev = get_snapshot(); + auto prev = TRY(get_snapshot()); usleep(10000); for (;;) { if (g_window_size_changed) { @@ -224,7 +222,7 @@ ErrorOr serenity_main(Main::Arguments arguments) g_window_size_changed = false; } - auto current = get_snapshot(); + auto current = TRY(get_snapshot()); auto total_scheduled_diff = current.total_time_scheduled - prev.total_time_scheduled; printf("\033[3J\033[H\033[2J"); diff --git a/Userland/Utilities/w.cpp b/Userland/Utilities/w.cpp index 1c905dae80..5e3f0a7dc9 100644 --- a/Userland/Utilities/w.cpp +++ b/Userland/Utilities/w.cpp @@ -33,11 +33,7 @@ ErrorOr serenity_main(Main::Arguments) return 1; } - auto process_statistics = Core::ProcessStatisticsReader::get_all(); - if (!process_statistics.has_value()) { - warnln("Error: Could not get process statistics"); - return 1; - } + auto process_statistics = TRY(Core::ProcessStatisticsReader::get_all()); auto now = time(nullptr); @@ -70,7 +66,7 @@ ErrorOr serenity_main(Main::Arguments) DeprecatedString what = "n/a"; - for (auto& process : process_statistics.value().processes) { + for (auto& process : process_statistics.processes) { if (process.tty == tty && process.pid == process.pgid) what = process.name; }