[4/7] fix loop termination condition in do_each_task_pid()/while_each_task_pid()

From: William Lee Irwin III
Date: Wed Sep 01 2004 - 12:39:59 EST


On Wed, Sep 01, 2004 at 10:30:27AM -0700, William Lee Irwin III wrote:
> Macros must parenthesize their arguments when they appear as
> expressions not surrounded by other bracketing symbols. This patch
> parenthesizes the task argument to do_each_task_pid() and
> while_each_task_pid() where needed. This kind of iteration macro
> doesn't need multiple evaluation fixes.

Now that the basic syntactic issues with the macros have been dealt
with, the semantic issue of properly terminating the list iteration
remains. The following patch introduces a local variable __list__ in
do_each_task_pid() to store the virtual address of the list head of the
leader of the collision chain so that the iteration may be properly
terminated.


Index: kirill-2.6.9-rc1-mm2/include/linux/pid.h
===================================================================
--- kirill-2.6.9-rc1-mm2.orig/include/linux/pid.h 2004-09-01 09:07:48.266432168 -0700
+++ kirill-2.6.9-rc1-mm2/include/linux/pid.h 2004-09-01 09:12:08.394886632 -0700
@@ -42,7 +42,9 @@

#define do_each_task_pid(who, type, task) \
do { \
+ struct list_head *__list__; \
if ((task = find_task_by_pid_type(type, who))) { \
+ __list__ = &(task)->pids[type].pid_list; \
prefetch((task)->pids[type].pid_list.next); \
do {

@@ -50,7 +52,7 @@
task = pid_task((task)->pids[type].pid_list.next,\
type); \
prefetch((task)->pids[type].pid_list.next); \
- } while ((task)->pids[type].hash_list.next); \
+ } while ((task)->pids[type].pid_list.next != __list__); \
} \
} while (0)

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/