[gnome-system-monitor] ProcInfos owned by ProcInfo::all, ProcInfo::find returns references now
- From: Robert Roth <robertroth src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-system-monitor] ProcInfos owned by ProcInfo::all, ProcInfo::find returns references now
- Date: Mon, 22 May 2017 16:34:54 +0000 (UTC)
commit 35d69c72c8dd5e18e6bc5d278dc90373e3a271a0
Author: Artem Vorotnikov <artem vorotnikov me>
Date: Tue Dec 27 01:09:02 2016 +0300
ProcInfos owned by ProcInfo::all, ProcInfo::find returns references now
Signed-off-by: Artem Vorotnikov <artem vorotnikov me>
https://bugzilla.gnome.org/show_bug.cgi?id=776653
src/application.h | 4 +-
src/lsof.cpp | 2 +-
src/openfiles.cpp | 7 ++---
src/prettytable.cpp | 6 +++-
src/procproperties.cpp | 2 +-
src/proctable.cpp | 68 ++++++++++++++++++++++-------------------------
6 files changed, 43 insertions(+), 46 deletions(-)
---
diff --git a/src/application.h b/src/application.h
index 7965fd8..b4c21cc 100644
--- a/src/application.h
+++ b/src/application.h
@@ -142,10 +142,10 @@ class ProcInfo
// sorted by pid. The map has a nice property : it is sorted
// by pid so this helps a lot when looking for the parent node
// as ppid is nearly always < pid.
- typedef std::map<pid_t, ProcInfo*> List;
+ typedef std::map<pid_t, ProcInfo> List;
static List all;
- static ProcInfo* find(pid_t pid);
+ static ProcInfo& find(pid_t pid);
ProcInfo(pid_t pid);
diff --git a/src/lsof.cpp b/src/lsof.cpp
index e04c448..d5ecec3 100644
--- a/src/lsof.cpp
+++ b/src/lsof.cpp
@@ -143,7 +143,7 @@ namespace
unsigned count = 0;
for (const auto& v : ProcInfo::all) {
- const auto& info = *v.second;
+ const auto& info = v.second;
MatchSet matches;
lsof.search(info, std::inserter(matches, matches.begin()));
count += matches.size();
diff --git a/src/openfiles.cpp b/src/openfiles.cpp
index 8875cbb..60baae6 100644
--- a/src/openfiles.cpp
+++ b/src/openfiles.cpp
@@ -177,10 +177,9 @@ update_openfiles_dialog (GsmTreeView *tree)
guint i;
pid_t pid = GPOINTER_TO_UINT(static_cast<pid_t*>(g_object_get_data (G_OBJECT (tree), "selected_info")));
- info = ProcInfo::find(pid);
-
- if (!info)
- return;
+ try {
+ info = &ProcInfo::find(pid);
+ } catch (const std::out_of_range&) { return; }
model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree));
diff --git a/src/prettytable.cpp b/src/prettytable.cpp
index 0d5e0bb..2563f21 100644
--- a/src/prettytable.cpp
+++ b/src/prettytable.cpp
@@ -104,13 +104,15 @@ PrettyTable::register_application(pid_t pid, Glib::RefPtr<Gdk::Pixbuf> icon)
{
/* If process already exists then set the icon. Otherwise put into hash
** table to be added later */
- if (ProcInfo* info = ProcInfo::find(pid))
+ try {
+ auto& info = ProcInfo::find(pid);
{
- info->set_icon(icon);
+ info.set_icon(icon);
// move the ref to the map
this->apps[pid] = icon;
procman_debug("WNCK OK for %u", unsigned(pid));
}
+ } catch (const std::out_of_range& e) {}
}
diff --git a/src/procproperties.cpp b/src/procproperties.cpp
index dd6b769..c1862c1 100644
--- a/src/procproperties.cpp
+++ b/src/procproperties.cpp
@@ -108,7 +108,7 @@ update_procproperties_dialog (GtkTreeView *tree)
ProcInfo *info;
pid_t pid = GPOINTER_TO_UINT(static_cast<pid_t*>(g_object_get_data (G_OBJECT (tree), "selected_info")));
- info = ProcInfo::find(pid);
+ try { info = &ProcInfo::find(pid); } catch (const std::out_of_range&) { info = nullptr; }
fill_proc_properties(tree, info);
}
diff --git a/src/proctable.cpp b/src/proctable.cpp
index 8233f5a..3de4d73 100644
--- a/src/proctable.cpp
+++ b/src/proctable.cpp
@@ -67,9 +67,9 @@ ProcInfo::List ProcInfo::all;
std::map<pid_t, guint64> ProcInfo::cpu_times;
-ProcInfo* ProcInfo::find(pid_t pid)
+ProcInfo& ProcInfo::find(pid_t pid)
{
- try { return all.at(pid); } catch (const std::out_of_range& e) { return nullptr; }
+ return all.at(pid);
}
static void
@@ -199,7 +199,7 @@ cb_refresh_icons (GtkIconTheme *theme, gpointer data)
}
for (auto& v : ProcInfo::all) {
- app->pretty_table->set_icon(*v.second);
+ app->pretty_table->set_icon(v.second);
}
cb_timeout(app);
@@ -785,7 +785,7 @@ insert_info_to_tree (ProcInfo *info, GsmApplication *app, bool forced = false)
ProcInfo *parent = 0;
if (not forced)
- parent = ProcInfo::find(info->ppid);
+ try { parent = &ProcInfo::find(info->ppid); } catch (const std::out_of_range&) { parent =
nullptr; }
if (parent) {
GtkTreePath *parent_node = gtk_tree_model_get_path(model, &parent->node);
@@ -834,33 +834,33 @@ insert_info_to_tree (ProcInfo *info, GsmApplication *app, bool forced = false)
template<typename List>
static void
remove_info_from_tree (GsmApplication *app, GtkTreeModel *model,
- ProcInfo *current, List &orphans, unsigned lvl = 0)
+ ProcInfo& current, List &orphans, unsigned lvl = 0)
{
GtkTreeIter child_node;
- if (std::find(orphans.begin(), orphans.end(), current) != orphans.end()) {
- procman_debug("[%u] %d already removed from tree", lvl, int(current->pid));
+ if (std::find(orphans.begin(), orphans.end(), ¤t) != orphans.end()) {
+ procman_debug("[%u] %d already removed from tree", lvl, int(current.pid));
return;
}
- procman_debug("[%u] pid %d, %d children", lvl, int(current->pid),
- gtk_tree_model_iter_n_children(model, ¤t->node));
+ procman_debug("[%u] pid %d, %d children", lvl, int(current.pid),
+ gtk_tree_model_iter_n_children(model, ¤t.node));
// it is not possible to iterate&erase over a treeview so instead we
// just pop one child after another and recursively remove it and
// its children
- while (gtk_tree_model_iter_children(model, &child_node, ¤t->node)) {
+ while (gtk_tree_model_iter_children(model, &child_node, ¤t.node)) {
ProcInfo *child = 0;
gtk_tree_model_get(model, &child_node, COL_POINTER, &child, -1);
- remove_info_from_tree(app, model, child, orphans, lvl + 1);
+ remove_info_from_tree(app, model, *child, orphans, lvl + 1);
}
- g_assert(not gtk_tree_model_iter_has_child(model, ¤t->node));
+ g_assert(not gtk_tree_model_iter_has_child(model, ¤t.node));
- orphans.push_back(current);
- gtk_tree_store_remove(GTK_TREE_STORE(model), ¤t->node);
- procman::poison(current->node, 0x69);
+ orphans.push_back(¤t);
+ gtk_tree_store_remove(GTK_TREE_STORE(model), ¤t.node);
+ procman::poison(current.node, 0x69);
}
@@ -977,13 +977,12 @@ refresh_list (GsmApplication *app, const pid_t* pid_list, const guint n)
guint i;
// Add or update processes in the process list
- for(i = 0; i < n; ++i) {
- ProcInfo *info = ProcInfo::find(pid_list[i]);
-
- if (!info) {
- info = new ProcInfo(pid_list[i]);
- ProcInfo::all.erase(info->pid);
- ProcInfo::all.insert({info->pid, info});
+ for (i = 0; i < n; ++i) {
+ ProcInfo* info;
+ try {
+ info = &ProcInfo::find(pid_list[i]);
+ } catch (const std::out_of_range&) {
+ info = &ProcInfo::all.emplace(pid_list[i], pid_list[i]).first->second;
addition.push_back(info);
}
@@ -997,19 +996,18 @@ refresh_list (GsmApplication *app, const pid_t* pid_list, const guint n)
const std::set<pid_t> pids(pid_list, pid_list + n);
- ProcInfo::List new_set;
- for (const auto& v : ProcInfo::all) {
- auto& info = v.second;
- if (pids.find(info->pid) == pids.end()) {
- procman_debug("ripping %d", info->pid);
+ auto it = std::begin(ProcInfo::all);
+ while (it != std::end(ProcInfo::all)) {
+ auto& info = it->second;
+ if (pids.find(info.pid) == pids.end()) {
+ procman_debug("ripping %d", info.pid);
remove_info_from_tree(app, model, info, addition);
- addition.remove(info);
- delete info;
+ addition.remove(&info);
+ it = ProcInfo::all.erase(it);
} else {
- new_set.insert({info->pid, info});
+ ++it;
}
}
- ProcInfo::all = new_set;
// INVARIANT
// pid_list == ProcInfo::all + addition
@@ -1060,7 +1058,8 @@ refresh_list (GsmApplication *app, const pid_t* pid_list, const guint n)
continue;
}
- ProcInfo *parent = ProcInfo::find((*it)->ppid);
+ ProcInfo* parent;
+ try { parent = &ProcInfo::find((*it)->ppid); } catch (const std::out_of_range&) { parent =
nullptr; }
// if the parent is unreachable
if (not parent) {
// or std::find(addition.begin(), addition.end(), parent) == addition.end()) {
@@ -1080,7 +1079,7 @@ refresh_list (GsmApplication *app, const pid_t* pid_list, const guint n)
}
- for (auto& v : ProcInfo::all) update_info_mutable_cols(v.second);
+ for (auto& v : ProcInfo::all) update_info_mutable_cols(&v.second);
}
void
@@ -1152,9 +1151,6 @@ proctable_update (GsmApplication *app)
void
proctable_free_table (GsmApplication * const app)
{
- for (auto& v : ProcInfo::all)
- delete v.second;
-
ProcInfo::all.clear();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]