Example #1
0
    void Monitor::procProcesses() {
        PIDList deletes;
        PIDList adds;
        unsigned long long totalTicks = 0;

        if ( fCPUTotalTicks.size() > 0 ) {
            totalTicks = fCPUTotalTicks[0];
        }

        ProcessStatHandler statHandler(fProcMap, totalTicks);
        ProcessStatMHandler statMHandler(fProcMap, fTotalMemory);
        ProcessCmdLineHandler cmdLineHandler(fProcMap, fAppNameMap);

        QStringList procList = fProcReader.getProcList();
        QStringListIterator slIterator(procList);
        pid_t pid;
        int iteration = 0;

        while ( (pid = getNextPID(slIterator, iteration)) != 0 ) {
            iteration++;
            const QString pidStr = QString::number(pid);
            QString pathStatM("/proc/" + pidStr + "/statm");
            QString pathCmdLine("/proc/" + pidStr + "/cmdline");
            QString pathStat("/proc/" + pidStr + "/stat");

            if ( !fProcMap.contains(pid) ) {
                fProcMap[pid];
                adds.append(pid);
            }

            const QString oldName = fProcMap.value(pid).getStatName();
            if ( fProcReader.readProcFile(pathStat, statHandler, 1, pid) != 0 ) {
                qCritical() << "Error reading process stat file " << pid << "\n";
                continue;
            }

            if ( !oldName.isEmpty() && oldName != fProcMap.value(pid).getStatName() ) {
                fProcMap.remove(pid);
                fProcMap[pid];
                deletes.append(pid);
                adds.append(pid);
                if ( fProcReader.readProcFile(pathStat, statHandler, 1, pid) != 0 ) {
                    qCritical() << "Error reading process stat file " << pid << "\n";
                    continue;
                }
            }

            if ( fProcReader.readProcFile(pathStatM, statMHandler, 1, pid) != 0 ) {
                qCritical() << "Error reading process mstat file " << pid << "\n";
                continue;
            }

            if ( fProcMap.value(pid).getNameState() == 0 ) {
                if ( fProcReader.readProcFile(pathCmdLine, cmdLineHandler, 1, pid) != 0 ) {
                    qCritical() << "Error reading process cmdline file " << pid << "\n";
                    continue;
                }
            }
        }

        QMapIterator<pid_t, ProcInfo> iterator(fProcMap);
        while ( iterator.hasNext() ) {
            iterator.next();
            const pid_t pid = iterator.key();
            const QString pidStr = QString::number(pid);
            QString pathStat("/proc/" + pidStr + "/stat");

            if ( !QFile::exists(pathStat) ) {
                fProcMap.remove(pid);
                deletes.append(pid);
            }
        }

        emit processChanged(&fProcMap, adds, deletes);
    }
static void GenStat(Stat& stat, const tao::json::value& v){
   StatHandler statHandler(stat);
   tao::json::sax::from_value(v, statHandler);
}