----- Original Message -----
> On Fri, 2012-03-23 at 12:14 -0400, Dave Anderson wrote:
> > Download from:
http://people.redhat.com/anderson
> >
> > Changelog:
>
> >
> > - Enhancement to the "foreach" command which adds a new
"state"
> > task-indentifier argument that filters tasks by their task
> > state.
> > The state argument may be any of the task states displayed by
> > the "ps" command: RU, IN, UN, ST, ZO, SW or DE.
> > (rabin(a)rab.in, anderson(a)redhat.com)
> >
>
> This doesn't work for RU on my system because _RUNNING_ is 0x0 and (0x0
> & 0x0) is 0x0 in this line in task.c:
>
> 5603 if ((fd->flags & FOREACH_STATE) &&
!(task_state(tc->task) & fd->state))
> 5604 continue;
>
> If I change '&' to '==', it works, but I'm not sure if
task_state(tc->task) is restricted
> to a single flag. Might need to check both, maybe?
Yeah, it can be multiple bits -- except in the case of TASK_RUNNING.
When I did the "ps" ST display overhaul to handle multiple bits being
set, I went back and changed Rabin's "foreach" patch, which originally
used "==" and therefore didn't account for multiple bits being set.
But I forgot to make a special case for TASK_RUNNING in that case.
My bad...
So it would have to be something like:
if (fd->flags & FOREACH_STATE) {
if ((fd->state == _RUNNING_) {
if (task_state(tc->task) != _RUNNING_))
continue;
} else if (!(task_state(tc->task) & fd->state))
continue;:
}
Dave
I'll also fix it so that only one state may be entered. As it is,
if multiple states are entered, only the last one is honored.
And because of the special TASK_RUNNING (0) state, it doesn't
make much sense to allow multiples.
Dave