static void list_update(list_t *list, lwp_info_t *lwp) { id_info_t *id; if (list->l_head == NULL) { /* first element */ list->l_head = list->l_tail = id = Zalloc(sizeof (id_info_t)); goto update; } for (id = list->l_head; id; id = id->id_next) { if ((list->l_type == LT_USERS) && (id->id_uid != lwp->li_info.pr_uid)) continue; if ((list->l_type == LT_TASKS) && (id->id_taskid != lwp->li_info.pr_taskid)) continue; if ((list->l_type == LT_PROJECTS) && (id->id_projid != lwp->li_info.pr_projid)) continue; if ((list->l_type == LT_ZONES) && (id->id_zoneid != lwp->li_info.pr_zoneid)) continue; id->id_nproc++; id->id_taskid = lwp->li_info.pr_taskid; id->id_projid = lwp->li_info.pr_projid; id->id_zoneid = lwp->li_info.pr_zoneid; if (lwp->li_flags & LWP_REPRESENT) { id->id_size += lwp->li_info.pr_size; id->id_rssize += lwp->li_info.pr_rssize; } id->id_pctcpu += FRC2PCT(lwp->li_info.pr_lwp.pr_pctcpu); if (opts.o_outpmode & OPT_LWPS) id->id_time += TIME2SEC(lwp->li_info.pr_lwp.pr_time); else id->id_time += TIME2SEC(lwp->li_info.pr_time); id->id_pctmem += FRC2PCT(lwp->li_info.pr_pctmem); id->id_key += lwp->li_key; total_cpu += FRC2PCT(lwp->li_info.pr_lwp.pr_pctcpu); total_mem += FRC2PCT(lwp->li_info.pr_pctmem); return; } id = list->l_tail; id->id_next = Zalloc(sizeof (id_info_t)); id->id_next->id_prev = list->l_tail; id->id_next->id_next = NULL; list->l_tail = id->id_next; id = list->l_tail; update: id->id_uid = lwp->li_info.pr_uid; id->id_projid = lwp->li_info.pr_projid; id->id_taskid = lwp->li_info.pr_taskid; id->id_zoneid = lwp->li_info.pr_zoneid; id->id_nproc++; if (lwp->li_flags & LWP_REPRESENT) { id->id_size = lwp->li_info.pr_size; id->id_rssize = lwp->li_info.pr_rssize; } id->id_pctcpu = FRC2PCT(lwp->li_info.pr_lwp.pr_pctcpu); if (opts.o_outpmode & OPT_LWPS) id->id_time = TIME2SEC(lwp->li_info.pr_lwp.pr_time); else id->id_time = TIME2SEC(lwp->li_info.pr_time); id->id_pctmem = FRC2PCT(lwp->li_info.pr_pctmem); id->id_key = lwp->li_key; total_cpu += id->id_pctcpu; total_mem += id->id_pctmem; list->l_count++; }
static ulong_t get_time(void *lwp) { return ((ulong_t)TIME2SEC(((lwp_info_t *)lwp)->li_info.pr_lwp.pr_time)); }
/* * Calculate a process' statistics from its lwp statistics. */ static void id_update(id_info_t *id, lwp_info_t *lwp, int l_type) { char usrname[LOGNAME_MAX+1]; char projname[PROJNAME_MAX+1]; /* * When an id is processed first time in an update run its * id_alive flag set to false. * The next values are gauges, their old values from the previous * calculation should be set to null. * The names and timestamp must be set once. */ if (id->id_alive == B_FALSE) { id->id_hpsize = 0; id->id_size = 0; id->id_rssize = 0; id->id_pctmem = 0; id->id_timestamp = 0; id->id_time = 0; id->id_pctcpu = 0; id->id_nlwps = 0; id->id_nproc = 0; id->id_pid = (int)-1; id->id_taskid = lwp->li_psinfo->pr_taskid; id->id_projid = lwp->li_psinfo->pr_projid; id->id_psetid = lwp->li_lwpsinfo->pr_bindpset; id->id_uid = lwp->li_psinfo->pr_uid; if (l_type == LT_USERS) { getusrname(id->id_uid, usrname, LOGNAME_MAX+1); id->id_name = Realloc(id->id_name, strlen(usrname) + 1); (void) strcpy(id->id_name, usrname); } else if (l_type == LT_PROJECTS) { getprojname(id->id_projid, projname, PROJNAME_MAX); id->id_name = Realloc(id->id_name, strlen(projname) + 1); (void) strcpy(id->id_name, projname); } else { id->id_name = nullstr; } id->id_timestamp = get_timestamp(); /* mark this id as changed in this update run */ id->id_alive = B_TRUE; } if (lwp->li_psinfo->pr_nlwp > 0) { id->id_nlwps++; } /* * The next values are calculated only one time for each pid. */ if ((id->id_pid != lwp->li_psinfo->pr_pid) && (lwp->rlwpid == lwp->li_lwpsinfo->pr_lwpid)) { id->id_nproc++; id->id_hpsize += (lwp->li_hpsize/1024); id->id_size += lwp->li_psinfo->pr_size; id->id_rssize += lwp->li_psinfo->pr_rssize; id->id_pctmem += FRC2PCT(lwp->li_psinfo->pr_pctmem); id->id_pid = lwp->li_psinfo->pr_pid; if (l_type == LT_PROCESS) total_mem += FRC2PCT(lwp->li_psinfo->pr_pctmem); } id->id_pctcpu += FRC2PCT(lwp->li_lwpsinfo->pr_pctcpu); if (l_type == LT_PROCESS) total_cpu += FRC2PCT(lwp->li_lwpsinfo->pr_pctcpu); id->id_time += TIME2SEC(lwp->li_lwpsinfo->pr_time); id->id_usr += lwp->li_usr; id->id_sys += lwp->li_sys; id->id_ttime += lwp->li_ttime; id->id_tpftime += lwp->li_tpftime; id->id_dpftime += lwp->li_dpftime; id->id_kpftime += lwp->li_kpftime; id->id_lck += lwp->li_lck; id->id_slp += lwp->li_slp; id->id_lat += lwp->li_lat; id->id_stime += lwp->li_stime; id->id_minf += lwp->li_minf; id->id_majf += lwp->li_majf; id->id_nswap += lwp->li_nswap; id->id_inblk += lwp->li_inblk; id->id_oublk += lwp->li_oublk; id->id_msnd += lwp->li_msnd; id->id_mrcv += lwp->li_mrcv; id->id_sigs += lwp->li_sigs; id->id_vctx += lwp->li_vctx; id->id_ictx += lwp->li_ictx; id->id_scl += lwp->li_scl; id->id_ioch += lwp->li_ioch; }