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構造体に関連しているロックを取得し、クリティカルセクションの入口とします。

スリープロックを解放する

lk->locked = 0;

スリープロックlkのlockedメンバの値を0にします。

ロックを保持しているプロセスへの参照をなくす

lk->pid = 0;

スリープロックを解放したので、現在この処理を実行しているプロセスへの参照をなくすために、pidメンバを0で初期化します。

スリープロックを取得しようとして休止状態になったプロセスを実行可能状態にする

wakeup(lk);

wakeup関数を呼び出して、スリープロックを取得しようとして休止状態(p->state = SLEEPING;)になったプロセスを、実行可能状態(p->state = RUNNABLE)にします。

クリティカルセクションの出口を定める

release(&lk->lk);

release関数を呼び出してsleeplock構造体に関連しているロックを解放し、クリティカルセクションの出口とします。