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

概要

  • kernel/wait.cにて定義
  • 引数で渡された待ちキューヘ(排他起動:同時に1つしか起床しない)待ちキューエントリを追加する
    • すでに待ちキューへつながれている場合は、再度待ちキューへつなぐことはしない

引数

  • q--待ちキューヘッド(待ちキューの識別に用いる)
  • wait--待ちキューのエントリ
  • state--タスクのステート
    ステータスの名前値(10進)値(2進)説明
    TASK_RUNNING00CPU上で実行中、実行待ち状態
    TASK_INTERRUPTIBLE11待機状態。シグナルによる待機状態解除可能
    TASK_UNINTERRUPTIBLE210待機状態。シグナルによる待機状態解除不可
    TASK_STOPPED4100実行の停止中
    TASK_TRACED81000停止状態
    EXIT_ZOMBIE161 0000メモリ解放待ち
    EXIT_DEAD3210 0000即座に解放
    • 走行不可:-1
    • 走行可:0
    • 停止:0〜

実装

void fastcall prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state) {

	unsigned long flags;
	wait->flags |= WQ_FLAG_EXCLUSIVE;
  • 待ちキューエントリのWQ_FLAG_EXCLUSIVEフラグをセットする
    • flagsでWQ_FLAG_EXCLUSIVEが立っていると、同時に1つしか起床しない
	spin_lock_irqsave(&q->lock, flags);
  • スピンロックq->lockの取得を試み、取得に成功した場合、外部割り込みを無効化しEFLAGSを引数flagsへ設定する
	if (list_empty(&wait->task_list))
		__add_wait_queue_tail(q, wait);
  • リストwait->task_listが空であるか調べる
  • 待ちキューqの末尾にエントリwaitを追加する
	/*
	 * don't alter the task state if this is just going to
	 * queue an async wait queue callback
	 */
	if (is_sync_wait(wait))
		set_current_state(state);
  • waitが同期待ちキューエントリであるか調べる
  • カレントタスクのステートにstateを設定
	spin_unlock_irqrestore(&q->lock, flags);
  • スピンロックq->lockを開放し、flagsをEFLAGSを書き戻し、可能であればプリエンプションする

}

EXPORT_SYMBOL(prepare_to_wait_exclusive);

呼出元

履歴

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

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-11-13 (日) 23:34:23 (310d)