在这种情况下,“固定”是啥意思?

Posted

技术标签:

【中文标题】在这种情况下,“固定”是啥意思?【英文标题】:What does "pinned" mean in this case?在这种情况下,“固定”是什么意思? 【发布时间】:2016-01-14 07:38:30 【问题描述】:

当我阅读 libevent 的源代码时, 我看到了这条评论,但我不明白“固定”的含义?

    /* Make sure that none of the chains we need to copy from is pinned. */
remaining = size - chain->off;
EVUTIL_ASSERT(remaining >= 0);
for (tmp=chain->next; tmp; tmp=tmp->next) 
    if (CHAIN_PINNED(tmp))
        goto done;
    if (tmp->off >= (size_t)remaining)
        break;
    remaining -= tmp->off;

你能给我解释一下吗?

【问题讨论】:

也许CHAIN_PINNED 的定义有一些文档/解释。 不是真的,我得到的最接近的是users.sosdg.org/~qiyong/mxr/source/external/bsd/libevent/dist/…:“使用给定标志固定单个缓冲区链。固定块在取消固定之前可能无法移动或释放。”这是“pin”的常见用法:标记一段数据以保留在内存中。就像“在里面插一个别针,这样它就不能移动了”。 告诉我们CHAIN_PINNED的定义,也许我们可以帮助你 谢谢^^。那么在这种情况下,如果一个缓冲链被钉住了,当我调用上面这段代码时,我什至不能在钉住的缓冲链中得到一个字节数据,对吧? 【参考方案1】:

在这种情况下固定只是意味着evbuffer_chain 当前正在用于读取或写入。通过查看 CHAIN_PINNED 的定义和 EVBUFFER_MEM_PINNED_ANYEVBUFFER_MEM_PINNED_W 和 'EVBUFFER_MEM_PINNED_R' 的定义,您会看到它正在检查 evenbuffer_chain 的标志,以了解它是否正在用于读取或写入,如下所示:

buffer.c:

#define CHAIN_PINNED(ch)  (((ch)->flags & EVBUFFER_MEM_PINNED_ANY) != 0)

evbuffer-internal.h:

#define EVBUFFER_MEM_PINNED_R   0x0010
#define EVBUFFER_MEM_PINNED_W   0x0020
#define EVBUFFER_MEM_PINNED_ANY (EVBUFFER_MEM_PINNED_R|EVBUFFER_MEM_PINNED_W)

您可以进一步查看这些标志何时在here in the source for writing 和here in the source for reading 等代码中设置。

【讨论】:

以上是关于在这种情况下,“固定”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

在这种情况下,我怎么知道 _root 是啥意思?

在这种情况下,&(和号)符号是啥意思?

跨域是啥意思,JSONP 在这种情况下代表啥?

在这种情况下,“状态”是啥意思? (关于在 cookie 中存储 JWT 的讨论)

关于 ReadFile() WinAPI,GetLastError 抛出错误 183。在这种情况下,“ERROR_ALREADY_EXISTS”是啥意思?

依赖/依赖是啥意思?