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

Source

  • 标志 缓存块与设备的读写操作完成
    • 若缓存块为异步I/O,释放该块
    • 若缓存块为同步I/O,则唤醒所有等待该块的进程

5014

5015 /* Mark I/O complete on a buffer, release it if i/o is

5016  * asynchronous, and wake up anyone waiting for it.

5017  */

5018 iodone(bp)

5019 struct buf *bp;

5020 {

5021     register struct buf *rbp;

5022

5023     rbp = bp;

5024     if(rbp->b_flags*B_MAP)

5025          mapfree(rbp);

  • 此处为PDP11/70对应的函数,不作讨论
5026     rbp->b_flags =| B_DONE;
  • 置缓存块 B_DONE标志
5027     if (rbp->b_flags&B_ASYNC)

5028          brelse(rbp);

  • 若缓存块为异步I/O,则释放该块
5029     else {

5030          rbp->b_flags =& ~B_WANTED;

5031          wakeup(rbp);

  • 若缓存块为同步I/O
    • 清B_WANTED标志
    • 唤醒 所有等待该缓存块的进程
5032     }

5033 }

5034 /* ------------------------- */

Ref

Caller

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