3

我最近一直在使用 Wayland 协议,许多功能都包含一个unit32_t serial参数。这是来自wayland-client-protocol.h的示例:

struct wl_shell_surface_listener {
    /**
     * ping client
     *
     * Ping a client to check if it is receiving events and sending
     * requests. A client is expected to reply with a pong request.
     */
    void (*ping)(void *data,
                 struct wl_shell_surface *wl_shell_surface,
                 uint32_t serial);
    // ...
}

此参数的目的是让客户端响应pong显示服务器,将 的值传递给它serial。服务器会将serial它通过 ping 接收到的数据pongserial它通过 ping 发送的数据进行比较。

还有许多其他函数包含这样的serial参数。此外,API 中其他函数的实现通常会在执行某些工作之前增加全局wl_display->serial属性以获取新值。我的问题是,一般意义上serial,这个serial参数的基本原理是什么?它有名字吗?例如,这是 IPC 的事情,还是事件驱动/异步编程中的常见做法?是不是有点像用于异步方法调用的 XCB“cookie”概念?这种技术是否在其他程序中找到(请引用示例)?

另一个例子是 glut,glutTimerFunc 这里讨论的是“异步调用的常用习语”。我很想知道这个成语是否有名字,以及它在哪里(请引用好)被讨论为异步/偶数驱动编程中的最佳实践或技术,例如延续或“信号和槽”。或者,例如,共享资源计数如何只是整数,但我们认为它们是“信号量”。

4

2 回答 2

1

您可能会发现很有帮助

Wayland 客户端可能执行的某些操作需要输入事件序列形式的简单形式的身份验证。例如,打开一个弹出窗口(通过右键单击召唤的上下文菜单是一种弹出窗口)的客户端可能希望从受影响的座位“抓取”服务器端的所有输入事件,直到弹出窗口被关闭。为了防止滥用此功能,服务器可以为其发送的每个输入事件分配序列号,并要求客户端在请求中包含这些序列号之一。

当服务器接收到这样的请求时,它会查找与给定序列关联的输入事件并进行判断调用。如果事件发生在很久以前,或者针对错误的表面,或者不是正确的事件类型——例如,它可以在你摆动鼠标时拒绝抓取,但在你点击时允许它们——它可以拒绝请求。

从服务器的角度来看,他们可以简单地为每个输入事件发送一个递增的整数,并记录被认为对特定用例有效的序列以供以后验证。客户端从他们的输入事件处理程序接收这些序列,并且可以简单地立即将它们传回以执行所需的操作。

https://wayland-book.com/seat.html#event-serials

于 2021-12-21T07:24:23.253 回答
0

正如Hans PassantTom Zych在评论中所说,这个论点是将一个异步调用与另一个区别开来。

我仍然对更深层次的问题感到好奇,即这种技术是否是异步/事件驱动软件中常用的一种技术,以及它是否有一个众所周知的名字。

于 2016-04-02T15:13:01.823 回答