欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux内核之container_of

程序员文章站 2024-01-23 16:10:28
...

semaphore的释放操作代码如下

static noinline void __sched __up(struct semaphore *sem)
{
	//拿到sem等待链表中的第一个节点,对应的semaphore_waiter,线程描述符存放在那个里面
        struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list,
						struct semaphore_waiter, list);
	//从sem等待链表中摘除
        list_del(&waiter->list);
	//置up标志,使waier->task的__down_common for(;;){}循环退出,开始继续执行
        waiter->up = true;
	wake_up_process(waiter->task);
}

其中semaphore,semaphore_waiter,list_head结构如下

struct semaphore {
	raw_spinlock_t		lock;
	unsigned int		count;
	struct list_head	wait_list;
};

struct semaphore_waiter {
	struct list_head list;
	struct task_struct *task;
	bool up;
};


struct list_head {
	struct list_head *next, *prev;
};

这里面list_head就是一个双向链表的作用,就像串起珠子的线。这个线可以串任何需要串的东西,比如珠子,铜钱,贝壳……

list_head内部是用指针来串的,而在semaphore和semophore_waiter里面不是指针,这样的设计实现了刚开始那个__up()中反向查找的功能。就是根据waiter的list_head成员得到相应waiter的过程。方法就是,根据waiter中list的地址,以及list在waiter中的偏移,算出waiter的起始地址。我感觉这样的设计很巧妙。

container_of宏的具体实现分析这里很详细——https://blog.csdn.net/npy_lp/article/details/7010752

上一篇: Linux 内核宏 container_of

下一篇: