Пример #1
0
data_row *GetStat(void) {

	if ( !stat_record ) 
		ReadStat();

	return stat_record;

} // End of GetStat
Пример #2
0
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);
}
Пример #4
0
bool ProcFS::ReadStat(pid_t pid, Stat &stat) {
  return ReadStat(pid, pid, stat);
}