sd-bus: make bus_add_match_full accept timeout

This commit is contained in:
licunlong
2023-06-15 18:15:23 +08:00
parent 24945c28db
commit bb30e58f64
4 changed files with 59 additions and 20 deletions
+36 -12
View File
@@ -876,9 +876,10 @@ _public_ int sd_bus_get_owner_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **r
int bus_add_match_internal(
sd_bus *bus,
const char *match,
uint64_t timeout_usec,
uint64_t *ret_counter) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL, *reply = NULL;
const char *e;
int r;
@@ -889,16 +890,26 @@ int bus_add_match_internal(
e = append_eavesdrop(bus, match);
r = sd_bus_call_method(
r = sd_bus_message_new_method_call(
bus,
&m,
"org.freedesktop.DBus",
"/org/freedesktop/DBus",
"org.freedesktop.DBus",
"AddMatch",
"AddMatch");
if (r < 0)
return r;
r = sd_bus_message_append(m, "s", e);
if (r < 0)
return r;
r = sd_bus_call(
bus,
m,
timeout_usec,
NULL,
&reply,
"s",
e);
&reply);
if (r < 0)
return r;
@@ -914,9 +925,12 @@ int bus_add_match_internal_async(
sd_bus_slot **ret_slot,
const char *match,
sd_bus_message_handler_t callback,
void *userdata) {
void *userdata,
uint64_t timeout_usec) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
const char *e;
int r;
assert(bus);
@@ -925,17 +939,27 @@ int bus_add_match_internal_async(
e = append_eavesdrop(bus, match);
return sd_bus_call_method_async(
r = sd_bus_message_new_method_call(
bus,
ret_slot,
&m,
"org.freedesktop.DBus",
"/org/freedesktop/DBus",
"org.freedesktop.DBus",
"AddMatch",
"AddMatch");
if (r < 0)
return r;
r = sd_bus_message_append(m, "s", e);
if (r < 0)
return r;
return sd_bus_call_async(
bus,
ret_slot,
m,
callback,
userdata,
"s",
e);
timeout_usec);
}
int bus_remove_match_internal(
+2 -2
View File
@@ -3,7 +3,7 @@
#include "sd-bus.h"
int bus_add_match_internal(sd_bus *bus, const char *match, uint64_t *ret_counter);
int bus_add_match_internal_async(sd_bus *bus, sd_bus_slot **ret, const char *match, sd_bus_message_handler_t callback, void *userdata);
int bus_add_match_internal(sd_bus *bus, const char *match, uint64_t timeout_usec, uint64_t *ret_counter);
int bus_add_match_internal_async(sd_bus *bus, sd_bus_slot **ret, const char *match, sd_bus_message_handler_t callback, void *userdata, uint64_t timeout_usec);
int bus_remove_match_internal(sd_bus *bus, const char *match);
+10
View File
@@ -389,6 +389,16 @@ int bus_attach_inotify_event(sd_bus *b);
void bus_close_inotify_fd(sd_bus *b);
void bus_close_io_fds(sd_bus *b);
int bus_add_match_full(
sd_bus *bus,
sd_bus_slot **slot,
bool asynchronous,
const char *match,
sd_bus_message_handler_t callback,
sd_bus_message_handler_t install_callback,
void *userdata,
uint64_t timeout_usec);
#define OBJECT_PATH_FOREACH_PREFIX(prefix, path) \
for (char *_slash = ({ strcpy((prefix), (path)); streq((prefix), "/") ? NULL : strrchr((prefix), '/'); }) ; \
_slash && ((_slash[(_slash) == (prefix)] = 0), true); \
+11 -6
View File
@@ -3531,14 +3531,15 @@ static int add_match_callback(
return r;
}
static int bus_add_match_full(
int bus_add_match_full(
sd_bus *bus,
sd_bus_slot **slot,
bool asynchronous,
const char *match,
sd_bus_message_handler_t callback,
sd_bus_message_handler_t install_callback,
void *userdata) {
void *userdata,
uint64_t timeout_usec) {
struct bus_match_component *components = NULL;
size_t n_components = 0;
@@ -3582,7 +3583,8 @@ static int bus_add_match_full(
&s->match_callback.install_slot,
s->match_callback.match_string,
add_match_callback,
s);
s,
timeout_usec);
if (r < 0)
return r;
@@ -3592,7 +3594,10 @@ static int bus_add_match_full(
* then make it floating. */
r = sd_bus_slot_set_floating(s->match_callback.install_slot, true);
} else
r = bus_add_match_internal(bus, s->match_callback.match_string, &s->match_callback.after);
r = bus_add_match_internal(bus,
s->match_callback.match_string,
timeout_usec,
&s->match_callback.after);
if (r < 0)
return r;
@@ -3619,7 +3624,7 @@ _public_ int sd_bus_add_match(
sd_bus_message_handler_t callback,
void *userdata) {
return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata);
return bus_add_match_full(bus, slot, false, match, callback, NULL, userdata, 0);
}
_public_ int sd_bus_add_match_async(
@@ -3630,7 +3635,7 @@ _public_ int sd_bus_add_match_async(
sd_bus_message_handler_t install_callback,
void *userdata) {
return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata);
return bus_add_match_full(bus, slot, true, match, callback, install_callback, userdata, 0);
}
static int io_callback(sd_event_source *s, int fd, uint32_t revents, void *userdata) {