// Scan the process table adding in CPU time and mem usage. // void add_child_totals(PROCINFO& pi, PROC_MAP& pm, PROC_MAP::iterator i) { PROCINFO parent = i->second; for (unsigned int j=0; j<parent.children.size(); j++) { int child_pid = parent.children[j]; PROC_MAP::iterator i2 = pm.find(child_pid); if (i2 == pm.end()) continue; PROCINFO& p = i2->second; if (p.scanned) { return; // cycle in graph - shouldn't happen } pi.kernel_time += p.kernel_time; pi.user_time += p.user_time; p.scanned = true; // only count process with most swap and memory if (p.swap_size > pi.swap_size) { pi.swap_size = p.swap_size; } if (p.working_set_size > pi.working_set_size) { pi.working_set_size = p.working_set_size; } p.is_boinc_app = true; add_child_totals(pi, pm, i2); // recursion - woo hoo! } }
static void get_descendants_aux(PROC_MAP& pm, int pid, vector<int>& pids) { PROC_MAP::iterator i = pm.find(pid); if (i == pm.end()) return; for (unsigned int j=0; j<i->second.children.size(); j++) { int child_pid = i->second.children[j]; pids.push_back(child_pid); get_descendants_aux(pm, child_pid, pids); } }
void find_children(PROC_MAP& pm) { PROC_MAP::iterator i; for (i=pm.begin(); i!=pm.end(); i++) { int parentid = i->second.parentid; PROC_MAP::iterator j = pm.find(parentid); if (j == pm.end()) continue; // should never happen j->second.children.push_back(i->first); } }
static void get_descendants_aux(PROC_MAP& pm, int pid, vector<int>& pids) { PROC_MAP::iterator i = pm.find(pid); if (i == pm.end()) return; PROCINFO& p = i->second; if (p.scanned) return; // avoid infinite recursion p.scanned = true; for (unsigned int j=0; j<p.children.size(); j++) { int child_pid = p.children[j]; pids.push_back(child_pid); get_descendants_aux(pm, child_pid, pids); } }