加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

源码解释什么是pin buffer?

发布时间:2020-12-13 17:33:50 所属栏目:百科 来源:网络整理
导读:本文原创为freas_1990,转载请标明出处:http://www.jb51.cc/article/p-pddmndcr-yu.html 什么是pin buffer呢?很多文档和论坛上有各种不同的解释,总之是越说越神奇,越说越高深。不过,技术本身不是什么magic,只要抓住了源代码,一切都从代码里取出来。 /

本文原创为freas_1990,转载请标明出处:http://www.52php.cn/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移除。

没有想象中的那么神秘吧?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读