int get_next_process()

in OpsWorks/sample-cookbooks/cpulimit-ruby/files/default/cpulimit-master/src/process_iterator_apple.c [90:128]


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) {
		struct proc_taskallinfo ti;
		if (get_process_pti(it->filter->pid, &ti) != 0) {
			it->i = it->count = 0;
			return -1;
		}
		it->i = it->count = 1;
		return pti2proc(&ti, p);
	}
	while (it->i < it->count) {
		struct proc_taskallinfo ti;
		if (get_process_pti(it->pidlist[it->i], &ti) != 0) {
			it->i++;
			continue;
		}
		if (ti.pbsd.pbi_flags & PROC_FLAG_SYSTEM) {
			it->i++;
			continue;
		}
		if (it->filter->pid != 0 && it->filter->include_children) {
			pti2proc(&ti, p);
			it->i++;
			if (p->pid != it->pidlist[it->i - 1]) // I don't know why this can happen
				continue;
			if (p->pid != it->filter->pid && p->ppid != it->filter->pid)
				continue;
			return 0;
		}
		else if (it->filter->pid == 0)
		{
			pti2proc(&ti, p);
			it->i++;
			return 0;
		}
	}
	return -1;
}