data_row *GetStat(void) { if ( !stat_record ) ReadStat(); return stat_record; } // End of GetStat
int UpdateStat(data_row *row, time_t when) { data_row *oldrow; int pnum, p, t; time_t tslot; if ( !stat_record ) { ReadStat(); if ( !stat_record ) return 0; } // Add new slot for(pnum=0; pnum<NUMPORTS; pnum++ ) { for (p=0; p<2; p++) { for (t=0; t<3; t++) { stat_record[pnum].proto[p].type[t] += row[pnum].proto[p].type[t]; } } } if ( (when - stat_header.last ) > 1800 ) { // last update too far away // pretend last update was max half an hour ago, otherwise it takes too long stat_header.last = when - 300; } // Subtract old slots for ( tslot = stat_header.last - (stat_header.av_num * 300); tslot < when - (stat_header.av_num * 300); tslot += 300 ) { oldrow = RRD_GetDataRow(dbpath, tslot); fprintf(stderr, "Remove stat line %s\n", ctime(&tslot)); for(pnum=0; pnum<NUMPORTS; pnum++ ) { for (p=0; p<2; p++) { for (t=0; t<3; t++) { stat_record[pnum].proto[p].type[t] -= oldrow[pnum].proto[p].type[t]; } } } } stat_header.last = when; dirty = 1; return 1; } // End of UpdateStat
void GPMProcessEntry::Update ( const JFloat elapsedTime ) { itsPercentMemory = 0; #ifdef _J_HAS_PROC try { ReadStat(); ReadStatM(); JSize mem; if (GPMGetSystemMemory(&mem)) { itsPercentMemory = JFloat(itsResident * 100) / mem; } // shared across #if ReadCmdline(); // not in ctor, to make ctor faster } catch (...) { itsState = kZombie; // std::cerr << "failed to update: " << itsPID << std::endl; } #elif defined _J_HAS_SYSCTL { int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, itsPID }; kinfo_proc entry; size_t len = sizeof(entry); int result = sysctl(mib, 4, &entry, &len, NULL, 0); if (result != 0) { itsState = kZombie; } else { itsCommand = entry.kp_proc.p_comm; itsPPID = entry.kp_eproc.e_ppid; itsPriority = entry.kp_proc.p_priority; itsNice = entry.kp_proc.p_nice; itsSize = 0; itsResident = 0; itsShare = 0; itsUTime = entry.kp_proc.p_uticks; itsSTime = entry.kp_proc.p_sticks; if (entry.kp_proc.p_stat == SSLEEP) { itsState = kSleep; } else if (entry.kp_proc.p_stat == SSTOP) { itsState = kStopped; } else if (entry.kp_proc.p_stat == SZOMB) { itsState = kZombie; } else { itsState = kRun; } JSize mem; if (GPMGetSystemMemory(&mem)) { itsPercentMemory = JFloat(itsResident) / mem; } } // shared across #if ReadCmdline(); // not in ctor, to make ctor faster } #endif SetName(itsCommand); ShouldBeOpenable(HasChildren()); itsTime = (itsUTime + itsSTime) / sysconf(_SC_CLK_TCK); JSize totalTime = (itsLastUTime == 0 || itsLastSTime == 0) ? 0 : (itsUTime - itsLastUTime) + (itsSTime - itsLastSTime); itsLastUTime = itsUTime; itsLastSTime = itsSTime; itsPercentCPU = elapsedTime == 0 || itsState == kZombie ? 0 : JFloat(totalTime * 1000 / sysconf(_SC_CLK_TCK)) / (10 * elapsedTime); }
bool ProcFS::ReadStat(pid_t pid, Stat &stat) { return ReadStat(pid, pid, stat); }