int get_next_process()

in OpsWorks/sample-cookbooks/cpulimit-ruby/files/default/cpulimit-master/src/process_iterator_freebsd.c [62:102]


int get_next_process(struct process_iterator *it, struct process *p) {
	if (it->i == it->count)
	{
		return -1;
	}
	if (it->filter->pid != 0 && !it->filter->include_children)
	{
		if (get_single_process(it->kd, it->filter->pid, p) != 0)
		{
			it->i = it->count = 0;
			return -1;
		}
		it->i = it->count = 1;
		return 0;
	}
	while (it->i < it->count)
	{
		struct kinfo_proc *kproc = &(it->procs[it->i]);
		if (kproc->ki_flag & P_SYSTEM)
		{
			// skip system processes
			it->i++;
			continue;
		}
		if (it->filter->pid != 0 && it->filter->include_children)
		{
			kproc2proc(it->kd, kproc, p);
			it->i++;
			if (p->pid != it->filter->pid && p->ppid != it->filter->pid)
				continue;
			return 0;
		}
		else if (it->filter->pid == 0)
		{
			kproc2proc(it->kd, kproc, p);
			it->i++;
			return 0;
		}
	}
	return -1;
}