カーネルが現在実行しているタスクとは別のタスクを一時停止することはできますか? 現在のタスクを停止するには、非アクティブに設定してスケジュールを呼び出すことができますが、別のタスクはどうでしょうか?
私が現在持っているもの:
void disable_thread(struct task_struct *tsk) {
if (tsk->state == TASK_RUNNING) {
/*
* A running task - mark it stopped and wait for it to be descheduled
*/
tsk->state = TASK_INTERRUPTIBLE;
wait_task_inactive(tsk, TASK_INTERRUPTIBLE);
} else if (tsk->state == TASK_INTERRUPTIBLE || tsk->state == TASK_UNINTERRUPTIBLE) {
/*
* // TODO: what to do with tasks already waiting for something else?
*/
} else {
/*
* This task's state seems to indicate that it's dead, no need to disable it anymore.
*/
}
}
実行中のスレッドの停止はこのように機能するように見えますが、スレッドが既に何か他のことを待機している場合 (たとえば、ロックの取得を待機している場合)、ロックを取得しても再起動しないようにするにはどうすればよいでしょうか?
セキュリティ機能を実装しており、必要に応じてより多くのコンテキストを提供できます。
前もって感謝します。