*参照元 [#nfbde2cd] #backlinks *説明 [#r49ca18b] -パス: [[linux-2.6.33/kernel/hrtimer.c]] -FIXME: これは何? --説明 **引数 [#rb0cff3c] -ktime_t *expires -- --[[linux-2.6.33/ktime_t]] -unsigned long delta -- -const enum hrtimer_mode mode -- --[[linux-2.6.33/hrtimer_mode]] **返り値 [#k8e1a8fd] -int -- **参考 [#n00b834d] *実装 [#u0d4c447] /** * schedule_hrtimeout_range - sleep until timeout * @expires: timeout value (ktime_t) * @delta: slack in expires timeout (ktime_t) * @mode: timer mode, HRTIMER_MODE_ABS or HRTIMER_MODE_REL * * Make the current task sleep until the given expiry time has * elapsed. The routine will return immediately unless * the current task state has been set (see set_current_state()). * * The @delta argument gives the kernel the freedom to schedule the * actual wakeup to a time that is both power and performance friendly. * The kernel give the normal best effort behavior for "@expires+@delta", * but may decide to fire the timer earlier, but no earlier than @expires. * * You can set the task state as follows - * * %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to * pass before the routine returns. * * %TASK_INTERRUPTIBLE - the routine may return early if a signal is * delivered to the current task. * * The current task state is guaranteed to be TASK_RUNNING when this * routine returns. * * Returns 0 when the timer has expired otherwise -EINTR */ int __sched schedule_hrtimeout_range(ktime_t *expires, unsigned long delta, const enum hrtimer_mode mode) { struct hrtimer_sleeper t; - --[[linux-2.6.33/hrtimer_sleeper]] /* * Optimize when a zero timeout value is given. It does not * matter whether this is an absolute or a relative time. */ if (expires && !expires->tv64) { __set_current_state(TASK_RUNNING); return 0; } - --[[linux-2.6.33/__set_current_state()]] - --[[linux-2.6.33/TASK_RUNNING]] /* * A NULL parameter means "inifinte" */ if (!expires) { schedule(); __set_current_state(TASK_RUNNING); return -EINTR; } - --[[linux-2.6.33/schedule()]] hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, mode); hrtimer_set_expires_range_ns(&t.timer, *expires, delta); - --[[linux-2.6.33/hrtimer_init_on_stack()]] - --[[linux-2.6.33/CLOCK_MONOTONIC]] hrtimer_init_sleeper(&t, current); - --[[linux-2.6.33/hrtimer_init_sleeper()]] - --[[linux-2.6.33/current(global)]] hrtimer_start_expires(&t.timer, mode); if (!hrtimer_active(&t.timer)) t.task = NULL; - --[[linux-2.6.33/hrtimer_start_expires()]] - --[[linux-2.6.33/hrtimer_active()]] if (likely(t.task)) schedule(); - --[[linux-2.6.33/likely()]] hrtimer_cancel(&t.timer); destroy_hrtimer_on_stack(&t.timer); - --[[linux-2.6.33/hrtimer_cancel()]] - --[[linux-2.6.33/destroy_hrtimer_on_stack()]] __set_current_state(TASK_RUNNING); return !t.task ? 0 : -EINTR; } EXPORT_SYMBOL_GPL(schedule_hrtimeout_range); -GPL ライセンスのモジュールにのみシンボルを公開する。 -GPL のモジュールにのみシンボルを公開する。 --[[linux-2.6.33/EXPORT_SYMBOL_GPL()]] *コメント [#g6f3fd2e]