我正在尝试实现task_struct列表并将其用作FIFO。另外,我需要一个函数来遍历列表并搜索特定任务。
我的问题是list_for_each宏陷入无限循环。
以下是我的代码中的代码段:
typedef struct task_list_node {
struct list_head next;
struct task_struct *task;
} task_list_node;
task_list_node * find(struct semaphore *sem)
{
struct list_head * next;
struct list_head task_list = sem->task_list;
list_for_each(next, &task_list) {
task_list_node * elem;
// Get a pointer to the element on the list
elem = list_entry(next, task_list_node, next);
// [...]
}
return(NULL);
}
提前感谢任何提示!
答案 0 :(得分:1)
list_for_each()本身没问题。
#define list_for_each(pos,head)\ for(pos =(head) - > next; pos!=(head); pos = pos-> next)
问题是:struct list_head task_list = sem-> task_list;
您正在创建如下结构:
|--------------------------------------------------------
\/ |
head #a "sem->task_list" ---element 1 .... element #N -----
^
head #b "task_list" --------------|
list_for_each()应该在“pos”== head #a时停止,但是你没有使用头#a“sem-> task_list”进行迭代,但是头#b“task_list”,所以停止条件为“ pos“==”task_list“未到达。
应修复如下:
list_for_each(next, &sem->task_list) {