diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-07-10 15:27:21 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-07-10 15:27:52 +0200 |
commit | 245ae479eb40872cc2dfb76c4c75cd9c6d76b33c (patch) | |
tree | 8e33060a8e7fb95e575ad9575161e23b9120c716 | |
parent | 64d9b43734e9d0f950dffc6964af3236f9adacfb (diff) | |
download | serenity-245ae479eb40872cc2dfb76c4c75cd9c6d76b33c.zip |
ProcessManager: Use CProcessStatisticsReader to get process data.
It was silly to duplicate this functionality in so many places. Now everyone
uses CProcessStatisticsReader to parse /proc/all :^)
-rw-r--r-- | Applications/ProcessManager/ProcessModel.cpp | 68 | ||||
-rw-r--r-- | Applications/ProcessManager/ProcessModel.h | 2 |
2 files changed, 22 insertions, 48 deletions
diff --git a/Applications/ProcessManager/ProcessModel.cpp b/Applications/ProcessManager/ProcessModel.cpp index ac1c872305..462fff7daa 100644 --- a/Applications/ProcessManager/ProcessModel.cpp +++ b/Applications/ProcessManager/ProcessModel.cpp @@ -3,25 +3,13 @@ #include <AK/JsonArray.h> #include <AK/JsonObject.h> #include <AK/JsonValue.h> -#include <LibCore/CFile.h> +#include <LibCore/CProcessStatisticsReader.h> #include <fcntl.h> -#include <pwd.h> #include <stdio.h> ProcessModel::ProcessModel(GraphWidget& graph) : m_graph(graph) - , m_proc_all("/proc/all") { - if (!m_proc_all.open(CIODevice::ReadOnly)) { - fprintf(stderr, "ProcessManager: Failed to open /proc/all: %s\n", m_proc_all.error_string()); - exit(1); - } - - setpwent(); - while (auto* passwd = getpwent()) - m_usernames.set(passwd->pw_uid, passwd->pw_name); - endpwent(); - m_generic_process_icon = GraphicsBitmap::load_from_file("/res/icons/gear16.png"); m_high_priority_icon = GraphicsBitmap::load_from_file("/res/icons/highpriority16.png"); m_low_priority_icon = GraphicsBitmap::load_from_file("/res/icons/lowpriority16.png"); @@ -186,7 +174,7 @@ GVariant ProcessModel::data(const GModelIndex& index, Role role) const void ProcessModel::update() { - m_proc_all.seek(0); + auto all_processes = CProcessStatisticsReader::get_all(); unsigned last_sum_nsched = 0; for (auto& it : m_processes) @@ -194,42 +182,30 @@ void ProcessModel::update() HashTable<pid_t> live_pids; unsigned sum_nsched = 0; - auto file_contents = m_proc_all.read_all(); - auto json = JsonValue::from_string({ file_contents.data(), file_contents.size() }); - json.as_array().for_each([&](auto& value) { - const JsonObject& process_object = value.as_object(); - pid_t pid = process_object.get("pid").to_u32(); - unsigned nsched = process_object.get("times_scheduled").to_u32(); + for (auto& it : all_processes) { ProcessState state; - state.pid = pid; - state.nsched = nsched; - unsigned uid = process_object.get("uid").to_u32(); + state.pid = it.value.pid; + state.nsched = it.value.nsched; + state.user = it.value.username; + state.priority = it.value.priority; + state.syscalls = it.value.syscalls; + state.state = it.value.state; + state.name = it.value.name; + state.virtual_size = it.value.virtual_size; + state.physical_size = it.value.physical_size; + sum_nsched += it.value.nsched; { - auto it = m_usernames.find((uid_t)uid); - if (it != m_usernames.end()) - state.user = (*it).value; - else - state.user = String::number(uid); + auto pit = m_processes.find(it.value.pid); + if (pit == m_processes.end()) + m_processes.set(it.value.pid, make<Process>()); } - state.priority = process_object.get("priority").to_string(); - state.syscalls = process_object.get("syscall_count").to_u32(); - state.state = process_object.get("state").to_string(); - state.name = process_object.get("name").to_string(); - state.virtual_size = process_object.get("amount_virtual").to_u32(); - state.physical_size = process_object.get("amount_resident").to_u32(); - sum_nsched += nsched; - { - auto it = m_processes.find(pid); - if (it == m_processes.end()) - m_processes.set(pid, make<Process>()); - } - auto it = m_processes.find(pid); - ASSERT(it != m_processes.end()); - (*it).value->previous_state = (*it).value->current_state; - (*it).value->current_state = state; + auto pit = m_processes.find(it.value.pid); + ASSERT(pit != m_processes.end()); + (*pit).value->previous_state = (*pit).value->current_state; + (*pit).value->current_state = state; - live_pids.set(pid); - }); + live_pids.set(it.value.pid); + } m_pids.clear(); float total_cpu_percent = 0; diff --git a/Applications/ProcessManager/ProcessModel.h b/Applications/ProcessManager/ProcessModel.h index 6f74609dc4..4371367a35 100644 --- a/Applications/ProcessManager/ProcessModel.h +++ b/Applications/ProcessManager/ProcessModel.h @@ -3,7 +3,6 @@ #include <AK/AKString.h> #include <AK/HashMap.h> #include <AK/Vector.h> -#include <LibCore/CFile.h> #include <LibGUI/GModel.h> #include <unistd.h> @@ -65,5 +64,4 @@ private: RefPtr<GraphicsBitmap> m_high_priority_icon; RefPtr<GraphicsBitmap> m_low_priority_icon; RefPtr<GraphicsBitmap> m_normal_priority_icon; - CFile m_proc_all; }; |