Skip to content

Commit

Permalink
fix crash on systems with pid 0
Browse files Browse the repository at this point in the history
fixes #118
  • Loading branch information
Alexander Pyhalov authored and monsta committed May 7, 2018
1 parent 6e6046a commit 103d530
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 5 deletions.
4 changes: 2 additions & 2 deletions src/procman.h
Expand Up @@ -190,8 +190,8 @@ class ProcInfo

gchar *security_context;

const guint pid;
guint ppid;
const pid_t pid;
pid_t ppid;
guint uid;

// private:
Expand Down
23 changes: 20 additions & 3 deletions src/proctable.cpp
Expand Up @@ -812,7 +812,15 @@ update_info (ProcData *procdata, ProcInfo *info)

ProcInfo::cpu_times[info->pid] = info->cpu_time = proctime.rtime;
info->nice = procuid.nice;
info->ppid = procuid.ppid;

// set the ppid only if one can exist
// i.e. pid=0 can never have a parent
if (info->pid > 0) {
info->ppid = procuid.ppid;
}

g_assert(info->pid != info->ppid);
g_assert(info->ppid != -1 || info->pid == 0);

/* get cgroup data */
get_process_cgroup_info(info);
Expand All @@ -822,11 +830,14 @@ update_info (ProcData *procdata, ProcInfo *info)


ProcInfo::ProcInfo(pid_t pid)
: tooltip(NULL),
: node(),
pixbuf(),
tooltip(NULL),
name(NULL),
arguments(NULL),
security_context(NULL),
pid(pid),
ppid(-1),
uid(-1)
{
ProcInfo * const info = this;
Expand Down Expand Up @@ -943,6 +954,8 @@ refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n)


// inserts the process in the treeview if :
// - it has no parent (ppid = -1),
// ie it is for example the [kernel] on FreeBSD
// - it is init
// - its parent is already in tree
// - its parent is unreachable
Expand All @@ -956,7 +969,7 @@ refresh_list (ProcData *procdata, const pid_t* pid_list, const guint n)
// see proctable_update_list (ProcData * const procdata)


if ((*it)->ppid == 0 or in_tree.find((*it)->ppid) != in_tree.end()) {
if ((*it)->ppid <= 0 or in_tree.find((*it)->ppid) != in_tree.end()) {
insert_info_to_tree(*it, procdata);
in_tree.insert((*it)->pid);
it = addition.erase(it);
Expand Down Expand Up @@ -1031,6 +1044,10 @@ proctable_update_list (ProcData * const procdata)
procdata->cpu_total_time = MAX(cpu.total - procdata->cpu_total_time_last, 1);
procdata->cpu_total_time_last = cpu.total;

// FIXME: not sure if glibtop always returns a sorted list of pid
// but it is important otherwise refresh_list won't find the parent
std::sort(pid_list, pid_list + proclist.number);

refresh_list (procdata, pid_list, proclist.number);

selection.restore(procdata->tree);
Expand Down

0 comments on commit 103d530

Please sign in to comment.