電子書籍の厳選無料作品が豊富!

Linuxカーネルのコンパイルヘッダーの中に、
#define __acquire(x) __context__(1)

#define __release(x) __context__(-1)
みたいな記述があるのですが、スケジューラの本体の中で、

static inline void task_rq_unlock(runqueue_t *rq, unsigned long *flags)
__releases(rq->lock)
{
spin_unlock_irqrestore(&rq->lock, *flags);
}



static inline runqueue_t *task_rq_lock(task_t *p, unsigned long *flags)
__acquires(rq->lock)
{
struct runqueue *rq;

repeat_lock_task:
local_irq_save(*flags);
rq = task_rq(p);
spin_lock(&rq->lock);
if (unlikely(rq != task_rq(p))) {
spin_unlock_irqrestore(&rq->lock, *flags);
goto repeat_lock_task;
}
return rq;
}

のような使われ方をしている所があるのですが、
コンテキスト1の中に入ったり、そこから出たりと言うことをしていると思うのですが、
それらの記述を上記のように呼び出される関数定義のブラケット{}の外側(最初)に書いた場合、
動作的にはどのような意味があるのでしょうか?

Linuxカーネルに詳しく方、ご教示願えればと思います。

A 回答 (1件)

sparseというC用のコードチェッカのための記述のようです。


ロックとアンロックが対応しているか確認するようです。
https://linux.die.net/man/1/sparse の中の -Wcontext の項目を参照
    • good
    • 0
この回答へのお礼

情報ありがとうございます。
助かりました。

お礼日時:2021/01/25 03:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!