什么是sd-bus中的'slot'(C语言)

时间:2017-04-14 15:44:48

标签: linux dbus systemd

systemd的sd-bus.h文件中有几个API,可选择使用slot参数。以下是一些例子:

int sd_bus_call_async(sd_bus *bus, sd_bus_slot **slot, sd_bus_message *m, sd_bus_message_handler_t callback, void *userdata, uint64_t usec);
int sd_bus_add_filter(sd_bus *bus, sd_bus_slot **slot, sd_bus_message_handler_t callback, void *userdata);
int sd_bus_add_fallback(sd_bus *bus, sd_bus_slot **slot, const char *prefix, sd_bus_message_handler_t callback, void *userdata);

如果调用代码指定NULL,那么它就变成了“浮动插槽”,我猜这意味着调用代码不需要担心它。

我看到的大多数示例源代码都是这个示例项目:https://github.com/tasleson/dbus-signals/blob/6d0e43d02d24ed51a17ce7df15a3a0a64ec0170d/spamsignals.c#L160

需要一个插槽,然后有一段时间它会取消插槽。但它实际上并没有对它做任何事情。

2 个答案:

答案 0 :(得分:3)

通过自己的插槽会使你的sd-bus-match生活纠缠在其中一个插槽中。这样,当你取消参考插槽时,你也在摧毁这场比赛 否则,传递NULL会将您的匹配生命绑定到总线对象本身 您列出的其他功能也是如此:
*带插槽的sd_bus_call_async可让您选择通过取消插槽来销毁异步调用。
 带插槽的* sd_bus_add_filter会在您取消参考插槽时破坏过滤器 我不确定sd_bus_add_fallback,因为我从来没有听说过 检查插槽未被引用时调用的函数:https://github.com/systemd/systemd/blob/a7753693547233e4a1d6e10b1a8f6515a477f227/src/libsystemd/sd-bus/bus-slot.c#L68

答案 1 :(得分:3)

Federico是正确的,但也许更多细节会有所帮助?插槽本质上是一个不透明的句柄,可以让您管理附加到sd_bus句柄的对象的生命周期(vtable,匹配规则,过滤器等)。当您想要添加某些内容然后将其删除时,这非常有用。

如果要添加的对象将在进程的生命周期内保留,并且/或者将sd_bus句柄附加到,则应该传递NULL。