このページを編集する際は、編集に関する方針に従ってください。

概要

  • kernel/sched.cにて定義
  • ある条件(completion)の完了を待ち合わせている
    • 待ちキューに自身(current)を入れ、スケジューラを呼び出し別のタスクに切り返る。
      • 再び、このタスクが選択されたとき、条件(completion)が成立されていなければ、スケジューラを呼び出し待ち合わせを行う。これを条件(completion)が成立されるまで繰り返す
    • 条件(completion)が成立された場合、待ちキューから自身(current)を削除し、終了する

引数

  • completion--待ち合わせ用オブジェクト

実装

void fastcall __sched wait_for_completion(struct completion *x) {

	might_sleep();
  • カーネル構築時のKernel hackingのCONFIG_DEBUG_SPINLOCK_SLEEPを有効にしていなければ何の処理もしない関数
	spin_lock_irq(&x->wait.lock);
	if (!x->done) {
		DECLARE_WAITQUEUE(wait, current);
		wait.flags |= WQ_FLAG_EXCLUSIVE;
		__add_wait_queue_tail(&x->wait, &wait);
		do {
			__set_current_state(TASK_UNINTERRUPTIBLE);
			spin_unlock_irq(&x->wait.lock);
  • スピンロックを開放して、外部割込みを有効する。プリエンプティブを有効にして可能であればプリエンプティブを実行する
			schedule();
			spin_lock_irq(&x->wait.lock);
		} while (!x->done);
		__remove_wait_queue(&x->wait, &wait);
	}
	x->done--;
	spin_unlock_irq(&x->wait.lock);
  • スピンロックを開放して、外部割込みを有効する。プリエンプティブを有効にして可能であればプリエンプティブを実行する

}

EXPORT_SYMBOL(wait_for_completion);

呼出元


履歴

  • 作者:ひら
  • 日付:2005/3/1
  • 対象:2.6.10
    更新日更新者更新内容

コメント



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-11-24 (火) 07:20:21 (3129d)