本文原创为freas_1990,转载请标明出处:http://www.jb51.cc/article/p-pddmndcr-yu.html
什么是pin buffer呢?很多文档和论坛上有各种不同的解释,总之是越说越神奇,越说越高深。不过,技术本身不是什么magic,只要抓住了源代码,一切都从代码里取出来。
/* * PinBuffer -- make buffer unavailable for replacement. */ void PinBuffer(BufferDesc *buf) { long b; /* Assert (buf->refcount < 25); */ if (buf->refcount == 0) { IsInQueue(buf); /* remove from freelist queue */ BufferDescriptors[buf->freeNext].freePrev = buf->freePrev; BufferDescriptors[buf->freePrev].freeNext = buf->freeNext; buf->freeNext = buf->freePrev = INVALID_DESCRIPTOR; /* mark buffer as no longer free */ buf->flags &= ~BM_FREE; } else { notinQueue(buf); } b = BufferDescriptorGetBuffer(buf) - 1; Assert(PrivateRefCount[b] >= 0); if (PrivateRefCount[b] == 0 && LastRefCount[b] == 0) buf->refcount++; PrivateRefCount[b]++; }
这是一个简单的逻辑处理函数,传入了一个指针,但是没有任何返回值。从功能上来讲,这个函数不需要返回值。但是,从debug的角度来讲,没有返回值留下了比较大的隐患。
核心的逻辑就是把*buf从freelist queue移除。
没有想象中的那么神秘吧?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。