- 如果strategy->current超过了strategy->ring_size,则strategy->current赋值为0
- bufnum = strategy->buffers[strategy->current];根据索引strategy->current获取bufnum
- buf = GetBufferDescriptor(bufnum - 1);根据bufnum 获取buf,如果buf的引用计数为0,使用计数小于等于1,则可以使用这个buf,否则,获取buf失败。
上述要求引用计数为0,原因见如下:
如果buffer被pin住,那么在任何情况下我们都不能使用这个buf。如果usage_count是0或者1,那么这个buffer是公平竞争(我们期待使用计数是1,因为这个buf在ring当中,usage_count会通过clock sweep算法递减)一个更高的usage_count(比1大))表明其他进程接触过这个buffer,因此我们不能够重用他。