sleeplock.c int holdingsleep(struct sleeplock *lk)

トップページ
jupiteroak.hatenablog.com


sleeplock.c
https://github.com/mit-pdos/xv6-public/blob/master/sleeplock.c#L44

int holdingsleep(struct sleeplock *lk)
{
  int r;
  
  acquire(&lk->lk);
  r = lk->locked && (lk->pid == myproc()->pid);
  release(&lk->lk);
  return r;
}

holdingsleep関数は、現在実行中のプロセスがスリープロックを保持しているかを確認します。

引数 struct sleeplock *lk
確認対象となるスリープロック(sleeplock構造体変数)を指定するアドレスです。

戻り値 1 または 0
現在実行中のプロセスがスリープロックを保持している場合は、1が戻り値となります。
現在実行中のプロセスがスリープロックを保持していない場合は、0が戻り値となります。


処理の内容

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

acquire(&lk->lk);

sleeplock構造体を排他制御するために、acquire関数を呼び出してsleeplock構造体に関連しているロックを取得し、クリティカルセクションの入口とします。

この関数を実行しているプロセスがスリープロックを保持しているかを確認する

r = lk->locked && (lk->pid == myproc()->pid);

スリープロック」が取得されていて、なおかつ、現在実行中のプロセスがその「スリープロック」を取得している場合は、rに1の値が代入されます。
そうではない場合は、0の値が代入されます。
スリープロックが保持されている場合( lk->lockedの値が1の場合)、かつ ロックを保持しているプロセスがこの関数を実行しているプロセスである場合は(スリープロックを保持しているプロセスのID番号とmyproc関数で取得したプロセスのID番号が同じ場合は)、rに1が格納されます。それ以外の場合は、rに0が格納されます。

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

release(&lk->lk);

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