XCB:如何 "free" XID 由 xcb_generate_id 分配

XCB: How to "free" XID allocated by xcb_generate_id

(1)在XCB中,我们必须在一些请求之前手动分配XID。例如,

xcb_window_t win = xcb_generate_id(conn);
xcb_create_window(conn, XCB_COPY_FROM_PARENT, win, ...);

那么,我们应该如何释放(或取消分配)XID?调用 xcb_destroy_window 就足够了吗?

(2) 如果 xcb_create_window 失败怎么办?例如,

xcb_generic_cookie_t cookie = xcb_create_window_checked(conn, XCB_COPY_FROM_PARENT, win, ...);
if(xcb_request_check(conn, cookie)) ... // xcb_create_window failed.

在上面的示例中,xcb_create_window 失败了。因此,XID win 已分配但未使用。 win 这种情况我们应该怎么办?

Is it enough to invoke xcb_destroy_window?

是的。可悲的是,我没有任何权威文档可以link,所以我只能说“相信我”。

这是问题 1 的简单答案。答案 2...呃,我想它没有简单的答案。所以我猜你需要“全部真相”。

当 X11 客户端连接到 X11 服务器时,它会被分配一个 XID 范围以供使用。这些是服务器响应中的 resource-id-baseresource-id-mask 字段:https://www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html#server_response

从概念上讲,这两个字段描述的内容类似于“从 0x100 到 0x200 的所有 XID 都是给你的”。

xcb_generate_id() 现在只需 returns 这个范围的下一个条目并将其标记为已使用。因此,在第一次调用并保持上面的示例之后,“从 0x101 到 0x200 的所有 XID”仍然可用。

这是一个非常简单的数据结构,无法将 return XID 设为“不再使用”。

那么,使用完所有 XID 后会发生什么?为此,存在 XC-MISC 扩展名:https://www.x.org/releases/X11R7.7/doc/xcmiscproto/xc-misc.html

当没有 XID 时,libxcb 将发送 XCMiscGetXIDRange 请求以获取“新”批次的 XID,然后开始分发它们。

我在引号中写了“新”,因为它实际上是原始 XID 范围的 sub-range:X11 服务器知道它最初分配给此客户端的范围。它知道正在使用哪些 XID。因此,它可以选择一个免费范围并return它给客户端。

由于这种机制,libxcb 不必以任何方式跟踪使用过的 XID。东西自动运行。