Source Code (Use browser search to find items of interest.)

Class Index

ktop'OSProcessList (./kdeutils/ktop/OSProcessList.h:59)

class OSProcessList : public QList<OSProcess>
{
public:
 	enum SORTKEY
	{
		SORTBY_PID = 0,
		SORTBY_PPID,
		SORTBY_NAME, 
		SORTBY_UID,
		SORTBY_USERNAME,
		SORTBY_CPU,
		SORTBY_TIME,
		SORTBY_PRIORITY,
		SORTBY_STATUS,
		SORTBY_VMSIZE,
		SORTBY_VMRSS,
		SORTBY_VMLIB
	};	

	OSProcessList();

	virtual ~OSProcessList()
	{
		delete lastTStamps;
	}

	/**
	 * This function clears the old process list and retrieves a current one
	 * from the OS.
	 */
	bool update(void);

	/**
	 * The 'has...' functions can be used to inquire if the OS supports a
	 * specific process attribute. The return value may be hardcoded
	 * for each platform.
	 */
	bool hasName(void) const;
	bool hasCmdLine(void) const;
	bool hasUid(void) const;
	bool hasUserTime(void) const;
	bool hasSysTime(void) const;
	bool hasUserLoad(void) const;
	bool hasSysLoad(void) const;
	bool hasStatus(void) const;
	bool hasPriority(void) const;
	bool hasNiceLevel(void) const;
	bool hasVmSize(void) const;
	bool hasVmRss(void) const;
	bool hasVmLib(void) const;

	void setSortCriteria(SORTKEY sk)
	{
		sortCriteria = sk;
	}

	SORTKEY getSortCriteria(void) const
	{
		return (sortCriteria);
	}

	/**
	 * This function is needed mainly because we can have errors during the
	 * constructor execution. Since it has no return value we can call this
	 * function to find out if the class is fully operational.
	 */
	bool ok(void) const
	{
		return (!error);
	}

	/**
	 * This function can be used when calls to ok() return false to find out
	 * what has happened. The error variable is cleared after a call to
	 * getErrMessage().
	 */
	const QString& getErrMessage(void)
	{
		error = false;
		return (errMessage);
	}

private:
	/// This function is needed by the parent class to sort the list.
	virtual int compareItems(Item it1, Item it2);

	/// This variabled stores the criteria used to sort the list.
	SORTKEY sortCriteria;

	TimeStampList* lastTStamps;

	/**
	 * These variables are used for error handling. When an error has occured
	 * error is set to true and the errMessage contains a more detailed
	 * description of the problem.
	 */
	bool error;
	QString errMessage;
} ;

ktop'OSProcessList::OSProcessList() (./kdeutils/ktop/OSProcessList.cpp:62)

OSProcessList::OSProcessList()
{
	error = false;

	lastTStamps = NULL;

	sortCriteria = SORTBY_PID;
	setAutoDelete(true);

	/*
	 * Here we make sure that the kernel has been compiled with /proc
	 * support enabled. If not we generate an error message and set the
	 * error variable to true.
	 */
	DIR* dir;
	if ((dir = opendir("/proc")) == NULL)
	{
		error = true;
		errMessage = i18n("Cannot open directory \'/proc\'!\n"
						  "The kernel needs to be compiled with support\n"
						  "for /proc filesystem enabled!");
		return;
	}
	closedir(dir);
}


bool

ktop'OSProcessList::update() (./kdeutils/ktop/OSProcessList.cpp:90)

OSProcessList::update(void)
{
	// delete old process list
	clear();

	// read in current process list via the /proc filesystem entry
	DIR* dir;
	struct dirent* entry;

	TimeStampList* newTStamps = new TimeStampList;
	// If there is no old list yet, we create an empty one.
	if (!lastTStamps)
		lastTStamps = new TimeStampList;

	if ((dir = opendir("/proc")) == NULL)
	{
		error = true;
		errMessage = i18n("Cannot open directory \'/proc\'!\n"
						  "The kernel needs to be compiled with support\n"
						  "for /proc filesystem enabled!");
		return (false);
	}
	while ((entry = readdir(dir))) 
	{
		if (isdigit(entry->d_name[0]))
		{
			OSProcess* ps = new OSProcess(entry->d_name, lastTStamps,
										  newTStamps);
			if (!ps || !ps->ok())
			{
				/*
				 * Probably the process has just died or /proc/xxx/... hasn't
				 * been established yet.
				 */
				delete ps;
			}
			else
			{
				// insert process into sorted list
				inSort(ps);
			}
		}
	}
	closedir(dir);

	// make new list old one and discard the really old one
	delete lastTStamps;
	lastTStamps = newTStamps;

	return (true);
}

bool 

ktop'OSProcessList::hasName() (./kdeutils/ktop/OSProcessList.cpp:143)

OSProcessList::hasName(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasCmdLine() (./kdeutils/ktop/OSProcessList.cpp:149)

OSProcessList::hasCmdLine(void) const
{
	return (true);
}

bool 

ktop'OSProcessList::hasUid() (./kdeutils/ktop/OSProcessList.cpp:155)

OSProcessList::hasUid(void) const
{
	return (true);
}

bool 

ktop'OSProcessList::hasUserTime() (./kdeutils/ktop/OSProcessList.cpp:161)

OSProcessList::hasUserTime(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasSysTime() (./kdeutils/ktop/OSProcessList.cpp:167)

OSProcessList::hasSysTime(void) const
{
	return (true);
}

bool 

ktop'OSProcessList::hasUserLoad() (./kdeutils/ktop/OSProcessList.cpp:173)

OSProcessList::hasUserLoad(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasSysLoad() (./kdeutils/ktop/OSProcessList.cpp:179)

OSProcessList::hasSysLoad(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasStatus() (./kdeutils/ktop/OSProcessList.cpp:185)

OSProcessList::hasStatus(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasPriority() (./kdeutils/ktop/OSProcessList.cpp:191)

OSProcessList::hasPriority(void) const
{
	return (false);
}

bool

ktop'OSProcessList::hasNiceLevel() (./kdeutils/ktop/OSProcessList.cpp:197)

OSProcessList::hasNiceLevel(void) const
{
	return (true);
}

bool 

ktop'OSProcessList::hasVmSize() (./kdeutils/ktop/OSProcessList.cpp:203)

OSProcessList::hasVmSize(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasVmRss() (./kdeutils/ktop/OSProcessList.cpp:209)

OSProcessList::hasVmRss(void) const
{
	return (true);
}

bool 

ktop'OSProcessList::hasVmLib() (./kdeutils/ktop/OSProcessList.cpp:215)

OSProcessList::hasVmLib(void) const
{
	return (true);
}

#elif __FreeBSD__
/* Port to FreeBSD by Hans Petter Bieker <zerium@webindex.no>.
 *
 * Copyright 1999 Hans Petter Bieker <zerium@webindex.no>.
 */

ktop'OSProcessList::OSProcessList() (./kdeutils/ktop/OSProcessList.cpp:275)

OSProcessList::OSProcessList()
{
	error = false;

	lastTStamps = NULL;

	sortCriteria = SORTBY_PID;
	setAutoDelete(true);
}


bool

ktop'OSProcessList::update() (./kdeutils/ktop/OSProcessList.cpp:287)

OSProcessList::update(void)
{
	// delete old process list
	clear();

	int mib[3];
	mib[0] = CTL_KERN;
	mib[1] = KERN_PROC;
	mib[2] = KERN_PROC_ALL;

	size_t len;
	sysctl(mib, 3, NULL, &len, NULL, 0);

	struct kinfo_proc *p = (struct kinfo_proc *)malloc(len);
	sysctl(mib, 3, p, &len, NULL, 0);

	size_t num;
	for (num = 0; num < len / sizeof(struct kinfo_proc); num++) {
		OSProcess* ps = new OSProcess((char *)&p[num], 0, 0);

		if (!ps || !ps->ok())
		{
			error = true;
			if (ps)
				errMessage = ps->getErrMessage();
			else
				errMessage = i18n("Cannot read status of processes\n");
			delete ps;
			return (false);
		}

		// insert process into sorted list
		inSort(ps);
	}
	
	// make new list old one and discard the really old one
	free(p);

	return (true);
}

bool 

ktop'OSProcessList::hasName() (./kdeutils/ktop/OSProcessList.cpp:329)

OSProcessList::hasName(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasCmdLine() (./kdeutils/ktop/OSProcessList.cpp:335)

OSProcessList::hasCmdLine(void) const
{
	return (false);
}

bool 

ktop'OSProcessList::hasUid() (./kdeutils/ktop/OSProcessList.cpp:341)

OSProcessList::hasUid(void) const
{
	return (true);
}

bool 

ktop'OSProcessList::hasUserTime() (./kdeutils/ktop/OSProcessList.cpp:347)

OSProcessList::hasUserTime(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasSysTime() (./kdeutils/ktop/OSProcessList.cpp:353)

OSProcessList::hasSysTime(void) const
{
	return (true);
}

bool 

ktop'OSProcessList::hasUserLoad() (./kdeutils/ktop/OSProcessList.cpp:359)

OSProcessList::hasUserLoad(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasSysLoad() (./kdeutils/ktop/OSProcessList.cpp:365)

OSProcessList::hasSysLoad(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasStatus() (./kdeutils/ktop/OSProcessList.cpp:371)

OSProcessList::hasStatus(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasPriority() (./kdeutils/ktop/OSProcessList.cpp:377)

OSProcessList::hasPriority(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasNiceLevel() (./kdeutils/ktop/OSProcessList.cpp:383)

OSProcessList::hasNiceLevel(void) const
{
	return (true);
}

bool 

ktop'OSProcessList::hasVmSize() (./kdeutils/ktop/OSProcessList.cpp:389)

OSProcessList::hasVmSize(void) const
{
	return (true);
}

bool

ktop'OSProcessList::hasVmRss() (./kdeutils/ktop/OSProcessList.cpp:395)

OSProcessList::hasVmRss(void) const
{
	return (true);
}

bool 

ktop'OSProcessList::hasVmLib() (./kdeutils/ktop/OSProcessList.cpp:401)

OSProcessList::hasVmLib(void) const
{
	// FreeBSD doesn't support this!??!
	return (false);
}


ktop'OSProcessList::OSProcessList() (./kdeutils/ktop/OSProcessList.cpp:410)

OSProcessList::OSProcessList()
{

  error = true;
  errMessage = i18n("Your OS is not supported yet.  Sorry");
  return;
}

bool

ktop'OSProcessList::update() (./kdeutils/ktop/OSProcessList.cpp:419)

OSProcessList::update(void)
{
	return (false);
}

bool 

ktop'OSProcessList::hasName() (./kdeutils/ktop/OSProcessList.cpp:425)

OSProcessList::hasName(void) const
{
	return (false);
}

bool 

ktop'OSProcessList::hasCmdLine() (./kdeutils/ktop/OSProcessList.cpp:431)

OSProcessList::hasCmdLine(void) const
{
	return (false);
}

bool 

ktop'OSProcessList::hasUid() (./kdeutils/ktop/OSProcessList.cpp:437)

OSProcessList::hasUid(void) const
{
	return (false);
}

bool 

ktop'OSProcessList::hasUserTime() (./kdeutils/ktop/OSProcessList.cpp:443)

OSProcessList::hasUserTime(void) const
{
	return (false);
}

bool

ktop'OSProcessList::hasSysTime() (./kdeutils/ktop/OSProcessList.cpp:449)

OSProcessList::hasSysTime(void) const
{
	return (false);
}

bool 

ktop'OSProcessList::hasUserLoad() (./kdeutils/ktop/OSProcessList.cpp:455)

OSProcessList::hasUserLoad(void) const
{
	return (false);
}

bool

ktop'OSProcessList::hasSysLoad() (./kdeutils/ktop/OSProcessList.cpp:461)

OSProcessList::hasSysLoad(void) const
{
	return (false);
}

bool

ktop'OSProcessList::hasStatus() (./kdeutils/ktop/OSProcessList.cpp:467)

OSProcessList::hasStatus(void) const
{
	return (false);
}

bool

ktop'OSProcessList::hasPriority() (./kdeutils/ktop/OSProcessList.cpp:473)

OSProcessList::hasPriority(void) const
{
	return (false);
}

bool

ktop'OSProcessList::hasNiceLevel() (./kdeutils/ktop/OSProcessList.cpp:479)

OSProcessList::hasNiceLevel(void) const
{
	return (false);
}

bool 

ktop'OSProcessList::hasVmSize() (./kdeutils/ktop/OSProcessList.cpp:485)

OSProcessList::hasVmSize(void) const
{
	return (false);
}

bool

ktop'OSProcessList::hasVmRss() (./kdeutils/ktop/OSProcessList.cpp:491)

OSProcessList::hasVmRss(void) const
{
	return (false);
}

bool 

ktop'OSProcessList::hasVmLib() (./kdeutils/ktop/OSProcessList.cpp:497)

OSProcessList::hasVmLib(void) const
{
	return (false);
}

#endif


/*
 * The following code should be platform independant.
 */


ktop'OSProcessList::compareItems() (./kdeutils/ktop/OSProcessList.cpp:530)

OSProcessList::compareItems(Item it1, Item it2)
{
	OSProcess* item1 = (OSProcess*) it1;
	OSProcess* item2 = (OSProcess*) it2;

	/*
	 * Since the sorting criteria for the process list can vary, we have to
	 * use this rather complex function to compare two processes. Some keys
	 * use descending sorting order which is reflected by the '* -1'.
	 */
	switch (sortCriteria)
	{
	case SORTBY_PID:
		return (cmp(item1->getPid(), item2->getPid()));

	case SORTBY_PPID:
		return (cmp(item1->getPpid(), item2->getPpid()));

	case SORTBY_UID:
		return (cmp(item1->getUid(), item2->getUid()));

	case SORTBY_USERNAME:
		return (strcmp(item1->getUserName(), item2->getUserName()));

	case SORTBY_NAME:
		return (strcmp(item1->getName(), item2->getName()));

	case SORTBY_TIME:
		return (cmp(item1->getUserTime() + item1->getSysTime(),
					item2->getUserTime() + item2->getSysTime()) * -1);

	case SORTBY_PRIORITY:
		return (cmp(item1->getPriority(), item2->getPriority()));

	case SORTBY_STATUS:
		return (strcmp(item1->getStatusTxt(), item2->getStatusTxt()));

	case SORTBY_VMSIZE:
		return (cmp(item1->getVm_size(), item2->getVm_size()) * -1);

	case SORTBY_VMRSS:
		return (cmp(item1->getVm_rss(), item2->getVm_rss()) * -1);

	case SORTBY_VMLIB:
		return (cmp(item1->getVm_lib(), item2->getVm_lib()) * -1);

	case SORTBY_CPU:
	default:
		return (cmp(item1->getUserLoad() + item1->getSysLoad(),
					item2->getUserLoad() + item2->getSysLoad()) * -1);
	}

	return (0);
}