Ejemplo n.º 1
0
/* 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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
//-------------------------------------------------------------------------------------
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;
}