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 な配列のソレに空きができるのだろう、という理解で良いかなぁ。