code:brelse - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 释放指定的缓存块
- 唤醒所有等待使用该缓存块的进程
- 唤醒所有等待可用缓存块的进程
- 清除该块 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;
4881 }
4882 if (rbp->b_flags&B_ERROR)
4883 rbp->b_dev.d_minor = -1; /* no assoc. on error */
4884 backp = &bfreelist.av_back;
- 如果该缓存块存在错误,作此操作 防止进程错误引用此块
- (以上引自 Lions 代码分析)
4885 sps = PS->integ;
4886 spl6();
- PS保存到sps
4887 rbp->b_flags =& ~(B_WANTED|B_BUSY|B_ASYNC);
- 处理机优先级设为6
4888 (*backp)->av_forw = rbp;
4889 rbp->av_back = *backp;
4890 *backp = rbp;
4891 rbp->av_forw = &bfreelist;
4892 PS->integ = sps;
- 清除该块 B_WANTED B_BUSY B_ASYN 标志
- 将该块插入自由队列队尾
4893 }
4894 /* ------------------------- */