From 48ce0824dc67fa3e6743dca02e15fc1b91c0c55c Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 8 May 2024 13:05:40 +0200 Subject: [PATCH] sd-bus: add new sd_bus_pending_method_calls() call --- man/rules/meson.build | 1 + man/sd_bus_pending_method_calls.xml | 88 +++++++++++++++++++++++++++++ src/libsystemd/libsystemd.sym | 5 ++ src/libsystemd/sd-bus/sd-bus.c | 18 ++++++ src/systemd/sd-bus.h | 2 + 5 files changed, 114 insertions(+) create mode 100644 man/sd_bus_pending_method_calls.xml diff --git a/man/rules/meson.build b/man/rules/meson.build index a9a2a25c0d7..c3e1eefd8a3 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -418,6 +418,7 @@ manpages = [ '3', ['sd_bus_path_decode', 'sd_bus_path_decode_many', 'sd_bus_path_encode_many'], ''], + ['sd_bus_pending_method_calls', '3', [], ''], ['sd_bus_process', '3', [], ''], ['sd_bus_query_sender_creds', '3', ['sd_bus_query_sender_privilege'], ''], ['sd_bus_reply_method_error', diff --git a/man/sd_bus_pending_method_calls.xml b/man/sd_bus_pending_method_calls.xml new file mode 100644 index 00000000000..063009cf941 --- /dev/null +++ b/man/sd_bus_pending_method_calls.xml @@ -0,0 +1,88 @@ + + + + + + + + sd_bus_pending_method_calls + systemd + + + + sd_bus_pending_method_calls + 3 + + + + sd_bus_pending_method_calls + + Return the number of currently pending, outgoing method calls + + + + + #include <systemd/sd-bus.h> + + + int sd_bus_pending_method_calls + sd_bus *bus + + + + + + + Description + + sd_bus_pending_method_calls() returns the number of currently pending outgoing + method calls, i.e. method calls enqueued with + sd_bus_call_async3 for + which no reply has been received yet, and which have not reached a time-out yet. + + The bus argument may be NULL, in which case zero is + returned. + + + + + Return Value + + This function returns 0 if there are no pending method calls, or a NULL bus + object was specified. On failure, a negative errno-style error code is returned. + + + Errors + + Returned errors may indicate the following problems: + + + + -ECHILD + + The bus connection has been created in a different process, library or module instance. + + + + + + + + + History + sd_bus_pending_method_calls() was added in version 257. + + + + See Also + + + systemd1 + sd-bus3 + sd_bus_call_async3 + + + + diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index 78b44534629..6874240b8a2 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -843,3 +843,8 @@ global: sd_journal_stream_fd_with_namespace; sd_event_source_get_inotify_path; } LIBSYSTEMD_255; + +LIBSYSTEMD_257 { +global: + sd_bus_pending_method_calls; +} LIBSYSTEMD_256; diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 1a642cb1978..738afe0e948 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -4471,3 +4471,21 @@ _public_ int sd_bus_enqueue_for_read(sd_bus *bus, sd_bus_message *m) { bus->rqueue[bus->rqueue_size++] = bus_message_ref_queued(m, bus); return 0; } + +_public_ int sd_bus_pending_method_calls(sd_bus *bus) { + + /* Returns the number of currently pending asynchronous method calls. This is graceful, i.e. an + * unallocated (i.e. NULL) bus connection has no method calls pending. */ + + if (!bus) + return 0; + + assert_return(bus = bus_resolve(bus), -ENOPKG); + + if (!BUS_IS_OPEN(bus->state)) + return 0; + + size_t n = ordered_hashmap_size(bus->reply_callbacks); + + return n > INT_MAX ? INT_MAX : (int) n; /* paranoid overflow check */ +} diff --git a/src/systemd/sd-bus.h b/src/systemd/sd-bus.h index f1a3311992e..2d8efe5c7e2 100644 --- a/src/systemd/sd-bus.h +++ b/src/systemd/sd-bus.h @@ -238,6 +238,8 @@ int sd_bus_add_fallback_vtable(sd_bus *bus, sd_bus_slot **slot, const char *pref int sd_bus_add_node_enumerator(sd_bus *bus, sd_bus_slot **slot, const char *path, sd_bus_node_enumerator_t callback, void *userdata); int sd_bus_add_object_manager(sd_bus *bus, sd_bus_slot **slot, const char *path); +int sd_bus_pending_method_calls(sd_bus *bus); + /* Slot object */ sd_bus_slot* sd_bus_slot_ref(sd_bus_slot *slot); -- 2.47.3