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が戻り値となります。
処理の内容
この関数を実行しているプロセッサ(スレッド)がロックを保持しているかを確認
r = lock->locked && lock->cpu == mycpu();
ロックが保持されている場合(lock->lockedの値が1の場合)、かつ ロックを保持しているプロセッサ(スレッド)がこの関数を実行しているプロセッサ(スレッド)である場合は(ロックを保持しているcpu構造体とmycpu関数で取得したcpu構造体が同じ場合は)、rに1が格納されます。それ以外の場合は、rに0が格納されます。
ハードウェア割り込みを有効化する
popcli();
pushcliで行った処理を復元し、ハードウェア割り込みを有効化します。
ロック保持の確認結果を戻り値としてリターンする
return r;