当我读取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;
}
你能给我解释一下吗?
在这种情况下固定只是意味着evbuffer_chain
当前正在用于读取或写入。通过查看CHAIN_PINNED
的定义以及EVBUFFER_MEM_PINNED_ANY
、EVBUFFER_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)
您可以进一步看到这些标志何时在代码中设置,比如在这里的源代码中进行写入,在这里的代码中进行读取。