code:brelse - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • 释放指定的缓存块
    • 唤醒所有等待使用该缓存块的进程
    • 唤醒所有等待可用缓存块的进程
    • 清除该块 B_WANTED B_BUSY B_ASYN 标志
    • 将该块插入自由队列队尾

4866

4867 /* release the buffer, with no I/O implied.

4868  */

4869 brelse(bp)

4870 struct buf *bp;

4871 {

4872     register struct buf *rbp, **backp;

4873     register int sps;

4874

4875     rbp = bp;

4876     if (rbp->b_flags&B_WANTED)

4877          wakeup(rbp);

  • 唤醒所有等待使用该缓存块的进程
4878     if (bfreelist.b_flags&B_WANTED) {

4879          bfreelist.b_flags =& ~B_WANTED;

4880          wakeup(&bfreelist);

4881     }

  • 唤醒所有等待可用缓存块的进程
  • 这些进程在bfreelist上睡眠(bfreelist此时为空,且置标志B_WANTED),参看睡眠原因
4882     if (rbp->b_flags&B_ERROR)

4883          rbp->b_dev.d_minor = -1; /* no assoc. on error */

  • 如果该缓存块存在错误,作此操作 防止进程错误引用此块
  • (以上引自 Lions 代码分析)
4884     backp = &bfreelist.av_back;

4885     sps = PS->integ;

  • PS保存到sps
4886     spl6();
  • 处理机优先级设为6
4887     rbp->b_flags =& ~(B_WANTED|B_BUSY|B_ASYNC);

4888     (*backp)->av_forw = rbp;

4889     rbp->av_back = *backp;

4890     *backp = rbp;

4891     rbp->av_forw = &bfreelist;

  • 清除该块 B_WANTED B_BUSY B_ASYN 标志
  • 将该块插入自由队列队尾
4892     PS->integ = sps;
  • 从sps还原PS
  • 还原PS 相当于 开中断

4893 }

4894 /* ------------------------- */

Ref

Caller

⚠️ **GitHub.com Fallback** ⚠️