sleep_on()函数主要是为了在一个进程所请求的资源忙的时候进行进程调度,并把该进程放到等待队列上等待一段时间。代码如下:
void sleep_on(struct task_struct **p)
{
struct task_struct *tmp;
if (!p)
return;
if (current == &(init_task.task))
panic("task[0] trying to sleep");
tmp = *p;
*p = current;
current->state = TASK_UNINTERRUPTIBLE;
schedule();
if (tmp)
tmp->state=0;
}
分析:首先应该理解下这个tmp的作用,在这段函数中主要用到三个指针:*p,current和tmp,其中*p指向等待队列的头,也就是最近被放入等待队列的任务,current指向当前任务,tmp是在任务内核堆栈上建立的一个临时指针。在sleep的入口处,会让
tmp = *p;
*p= current;
这样的话tmp指向原来的头,*p指向新的头,这样就相当于串联起一个链表一样的结构,通过*p可以找到第一个等待任务,再通过第一个任务里面的tmp结构又可以找到下一个等待任务。下图可以帮助理解: