spinlock.c int holding(struct spinlock *lock)

トップページ
jupiteroak.hatenablog.com


spinlock.c
https://github.com/mit-pdos/xv6-public/blob/master/spinlock.c#L89

int holding(struct spinlock *lock)
{
int r;
pushcli(); 
r = lock->locked && lock->cpu == mycpu();
popcli();
return r; 
}

holding関数は、この関数を実行しているプロセッサ(スレッド)が引数で渡されたロックを保持しているかを確認します。

引数 struct spinlock *lock
確認対象となるロック(spinlock構造体)を指定するアドレスです。

戻り値
holding関数を実行しているプロセッサ(スレッド)がロックを保持している場合は、1が戻り値となります。
holding関数を実行しているプロセッサ(スレッド)がロックを保持していない場合は、0が戻り値となります。


処理の内容

ハードウェア割り込みを無効化する

pushcli();

デッドロックを避けるために、pushcli関数を呼び出してハードウェア割り込みを無効化します。

この関数を実行しているプロセッサ(スレッド)がロックを保持しているかを確認

r = lock->locked && lock->cpu == mycpu();

ロックが保持されている場合(lock->lockedの値が1の場合)、かつ ロックを保持しているプロセッサ(スレッド)がこの関数を実行しているプロセッサ(スレッド)である場合は(ロックを保持しているcpu構造体とmycpu関数で取得したcpu構造体が同じ場合は)、rに1が格納されます。それ以外の場合は、rに0が格納されます。

ハードウェア割り込みを有効化する

popcli();

pushcliで行った処理を復元し、ハードウェア割り込みを有効化します。

ロック保持の確認結果を戻り値としてリターンする

return r;