这是semaphore.h中的信号量结构
16 struct semaphore {
17 raw_spinlock_t lock;
18 unsigned int count;
19 struct list_head wait_list;
20 };
这是semaphore.c中的等待队列结构。
193 struct semaphore_waiter {
194 struct list_head list;
195 struct task_struct *task;
196 int up;
197 };
函数内部有以下 3 个语句。
207 struct task_struct *task = current;
208 struct semaphore_waiter waiter;
209
210 list_add_tail(&waiter.list, &sem->wait_list);
我知道 list_add_tail
会将 waiter.list
添加到 sem->wait_list
的尾部。我不明白的是,由此产生的结构。由于 waiter.list
属于 semaphore_waiter
而 sem->wait_list
属于 struct semaphore
,那么生成的列表是否为是 struct semaphore
还是 struct semaphore_waiter
类型?
最佳答案
void list_add_tail(struct list_head * new,
struct list_head * head);
将 new
添加到 head
指向的列表的开头。
请注意,内核中的大多数列表都将 next
/prev
指针作为 list_head
结构,它是 列表本身中数据的结构。
因此,当您遍历列表时(例如 p = p->next
),next
指针不会指向数据的开头(此处为 struct semaphore_waiter
),但而不是到该结构的list
成员。
要获取指向列表中包含的数据的指针,您可以使用 container_of
宏。这将返回指向包含 list
的结构的指针。
因此,假设您有一个 struct semaphore *sem
,为了简单起见,我们假设它在列表中有一个 semaphore_waiter
。我们可以获得指向该服务员的指针,例如:
struct semaphore *sem = <something>;
struct list_head *first;
struct semaphore_waiter *waiter;
// This is a pointer to the 'list' member of the first
// semaphore_waiter in the list
first = sem->wait_list.next;
// Now we "back out" from the list member to the
// (containing) semaphore_waiter itself
waiter = container_of(first, struct semaphore_waiter, list);
关于c - semaphore.c 中的等待列表实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22651692/