/* XXX: check for stale-ness using start_time */ SIGAR_DECLARE(int) sigar_proc_cpu_get(sigar_t *sigar, sigar_pid_t pid, sigar_proc_cpu_t *proccpu) { sigar_cache_entry_t *entry; sigar_proc_cpu_t *prev; sigar_uint64_t otime, time_now = sigar_time_now_millis(); sigar_uint64_t time_diff, total_diff; int status; if (!sigar->proc_cpu) { sigar->proc_cpu = sigar_cache_new(128); } entry = sigar_cache_get(sigar->proc_cpu, pid); if (entry->value) { prev = (sigar_proc_cpu_t *)entry->value; } else { prev = entry->value = malloc(sizeof(*prev)); SIGAR_ZERO(prev); } time_diff = time_now - prev->last_time; proccpu->last_time = prev->last_time = time_now; if (time_diff == 0) { /* we were just called within < 1 second ago. */ memcpy(proccpu, prev, sizeof(*proccpu)); return SIGAR_OK; } otime = prev->total; status = sigar_proc_time_get(sigar, pid, (sigar_proc_time_t *)proccpu); if (status != SIGAR_OK) { return status; } memcpy(prev, proccpu, sizeof(*prev)); if (proccpu->total < otime) { /* XXX this should not happen */ otime = 0; } if (otime == 0) { proccpu->percent = 0.0; /* first time called */ return SIGAR_OK; } total_diff = proccpu->total - otime; proccpu->percent = total_diff / (double)time_diff; return SIGAR_OK; }
ProcList::ProcList() { int status; sigar_t *sigar; sigar_proc_list_t proclist; unsigned long i; sigar_open(&sigar); status = sigar_proc_list_get(sigar, &proclist); if (status != SIGAR_OK) { printf("get proc list error: %d (%s)\n", status, sigar_strerror(sigar, status)); exit(1); } for (i=0; i<proclist.number; i++) { sigar_pid_t pid = proclist.data[i]; sigar_proc_mem_t proc_mem; sigar_proc_time_t proc_time; sigar_proc_state_t proc_state; status = sigar_proc_mem_get(sigar, pid, &proc_mem); if (status != SIGAR_OK) { #ifdef DEBUG printf("error: %d (%s) proc_mem(%d)\n", status, sigar_strerror(sigar, status), pid); #endif continue; } status = sigar_proc_state_get(sigar, pid, &proc_state); if (status != SIGAR_OK) { #ifdef DEBUG printf("error: %d (%s) proc_state(%d)\n", status, sigar_strerror(sigar, status), pid); #endif continue; } status = sigar_proc_time_get(sigar, pid, &proc_time); if (status != SIGAR_OK) { #ifdef DEBUG printf("error: %d (%s) proc_time(%d)\n", status, sigar_strerror(sigar, status), pid); #endif continue; } // printf("%d %s\n", (long)pid, pstate.name); //qDebug() << "name " << pstate.name << " processor " << pstate.processor; //qDebug() << lpid.setNum((long)pid); // datas << QString("PID : %1 , %2").arg(lpid.setNum((long)pid), pstate.name); Process proc; //proc = new(Process); proc.pid.setNum((long)pid); proc.state_name = proc_state.name; proc.state_state = proc_state.state; proc.state_ppid.setNum(proc_state.ppid); //proc.state_tty = proc_state.tty; proc.state_priority.setNum(proc_state.priority); proc.state_nice.setNum(proc_state.nice); proc.state_processor.setNum(proc_state.processor); proc.state_threads.setNum(proc_state.threads); proc.mem_size.setNum(proc_mem.size); proc.mem_resident.setNum(proc_mem.resident); proc.mem_share.setNum(proc_mem.share); proc.mem_minor_faults.setNum(proc_mem.minor_faults); proc.mem_major_faults.setNum(proc_mem.major_faults); proc.mem_page_faults.setNum(proc_mem.page_faults); proc.time_start_time.setNum(proc_time.start_time); qDebug() << "proc_state.name : " << proc_state.name << " : proc_time.start_time : " << proc_time.start_time; proc.time_user.setNum(proc_time.user); proc.time_sys.setNum(proc_time.sys); proc.time_total.setNum(proc_time.total); stack.push(proc); //delete(proc); } /* TEST OK while (!stack.isEmpty()) { qDebug() << "stack length : " << stack.count(); ok = .pop(); qDebug() << "name : " << ok->state_name << " " << " pid : " << ok->pid; delete(ok); } */ sigar_proc_list_destroy(sigar, &proclist); sigar_close(sigar); }
//------------------------------------------------------------------------------------- uint64 SystemInfo::getMemUsedByPID(uint32 pid) { if(pid == 0) { pid = (uint32)getProcessPID(); } int status; sigar_uint64_t total = 0; bool tryed = false; _TRYGET: if(!hasPID(pid, &_g_proclist)) { DEBUG_MSG(fmt::format("SystemInfo::getMemUsedByPID: error: not found pid({})\n", pid)); if(!tryed) { clear(); tryed = true; if(_autocreate()) goto _TRYGET; } return 0; } //for (i=0; i<(int)proclist.number; i++) { sigar_proc_state_t pstate; sigar_proc_time_t ptime; status = sigar_proc_state_get(_g_sigarproclist, pid, &pstate); if (status != SIGAR_OK) { DEBUG_MSG(fmt::format("error: {} ({}) proc_state({})\n", status, sigar_strerror(_g_sigarproclist, status), pid)); goto _END; } status = sigar_proc_time_get(_g_sigarproclist, pid, &ptime); if (status != SIGAR_OK) { DEBUG_MSG(fmt::format("error: {} ({}) proc_time({})\n", status, sigar_strerror(_g_sigarproclist, status), pid)); goto _END; } sigar_proc_mem_t proc_mem; status = sigar_proc_mem_get(_g_sigarproclist, pid, &proc_mem); if (status != SIGAR_OK) { DEBUG_MSG(fmt::format("error: {} ({}) sigar_proc_mem_get({})\n", status, sigar_strerror(_g_sigarproclist, status), pid)); goto _END; } total = proc_mem.resident; } _END: return total; }