sleeplock.c void releasesleep(struct sleeplock *lk)
トップページ
jupiteroak.hatenablog.com
sleeplock.c
https://github.com/mit-pdos/xv6-public/blob/master/sleeplock.c#L34
void releasesleep(struct sleeplock *lk) { acquire(&lk->lk); lk->locked = 0; lk->pid = 0; wakeup(lk); release(&lk->lk); }
releasesleep関数は、排他制御の対象となる共有資源に関わっているスリープロックを解放します。
引数 struct sleeplock *lk
解放対象となるスリープロックのアドレスです。
処理の内容
- クリティカルセクションの入口を定める
- スリープロックを解放する
- ロックを保持しているプロセスへの参照をなくす
- スリープロックを取得しようとして休止状態になったプロセスを実行可能状態にする
- クリティカルセクションの出口を定める
クリティカルセクションの入口を定める
acquire(&lk->lk);
sleeplock構造体を排他制御するために、acquire関数を呼び出してsleeplock構造体に関連しているロックを取得し、クリティカルセクションの入口とします。