sleep_on 手続き

以下なナニについてメモ。

repeat:
	for (req=0+request ; req<NR_REQUEST+request ; req++)
		if (req->hd<0)
			break;
	if (req==NR_REQUEST+request) {
		sleep_on(&wait_for_request);
		goto repeat;
	}

request な配列要素の hd 属性が全部 -1 じゃなかった場合、sleep_on 手続きが呼び出されるんですが、wait_for_request というナニの定義が hd.c で以下。

static struct task_struct * wait_for_request=NULL;

ぬるぽ
sleep_on() 手続きの定義が sched.c で以下。

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;
}

これ、上記手続きの中の p は NULL ではない。これって current な state が TASK_UNINTERRUPTIBLE になって schedule() されるだけ、って事なのかなぁ。
結果的に request な配列のソレに空きができるのだろう、という理解で良いかなぁ。