私はLinuxのスケジューラのコードを探しています:preempt_count()とPREEMPT_ACTIVE == 0はいつですか?
if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
if (unlikely(signal_pending_state(prev->state, prev))) {
prev->state = TASK_RUNNING;
} else {
deactivate_task(rq, prev, DEQUEUE_SLEEP);
prev->on_rq = 0;
私は理解しているように、prev
タスクが無停電であれば、このコードは、タスクを無効に(と実行キューから削除)します
preempt_count() & PREEMPT_ACTIVE == 0
をすることができ提供誰かがpreempt_count
のthread_info
について何を説明していますか?この条件が満たされるかどうかはいつですか?
preempt_counts上位ビットはIRQカウントのようなものに使用され、ビットの1つは、PREEMPTがアクティブであるかどうかを示すために使用されます。 –
しかし、スケジュールがスリープできるので、schedule()をIRQハンドラで呼び出すことができないと考えました。 (あなたは割り込み権利によってのみ奪取されますか?そうでなければ、あなたは予定外になるでしょうか?) –