Messages in this thread Patch in this message |  | | | Date | Wed, 1 Sep 2004 10:32:18 -0700 | | From | William Lee Irwin III <> | | Subject | [4/7] fix loop termination condition in do_each_task_pid()/while_each_task_pid() |
| |
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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |