diff --git a/src/libsystemd/sd-bus/bus-internal.h b/src/libsystemd/sd-bus/bus-internal.h index 39610c5d45..f6289daac6 100644 --- a/src/libsystemd/sd-bus/bus-internal.h +++ b/src/libsystemd/sd-bus/bus-internal.h @@ -226,6 +226,7 @@ struct sd_bus { size_t wqueue_allocated; uint64_t cookie; + uint64_t read_counter; /* A counter for each incoming msg */ char *unique_name; uint64_t unique_id; diff --git a/src/libsystemd/sd-bus/bus-message.h b/src/libsystemd/sd-bus/bus-message.h index a7c4f81c4b..ced0bb3d34 100644 --- a/src/libsystemd/sd-bus/bus-message.h +++ b/src/libsystemd/sd-bus/bus-message.h @@ -128,6 +128,8 @@ struct sd_bus_message { size_t header_offsets[_BUS_MESSAGE_HEADER_MAX]; unsigned n_header_offsets; + + uint64_t read_counter; }; static inline bool BUS_MESSAGE_NEED_BSWAP(sd_bus_message *m) { diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c index 9221b33d48..3541c411a8 100644 --- a/src/libsystemd/sd-bus/bus-socket.c +++ b/src/libsystemd/sd-bus/bus-socket.c @@ -1146,6 +1146,7 @@ static int bus_socket_make_message(sd_bus *bus, size_t size) { bus->n_fds = 0; if (t) { + t->read_counter = ++bus->read_counter; bus->rqueue[bus->rqueue_size++] = bus_message_ref_queued(t, bus); sd_bus_message_unref(t); } diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 978a505610..ac611d2975 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -484,6 +484,7 @@ static int synthesize_connected_signal(sd_bus *bus) { return r; bus_message_set_sender_local(bus, m); + m->read_counter = ++bus->read_counter; r = bus_seal_synthetic_message(bus, m); if (r < 0) @@ -2422,6 +2423,8 @@ static int process_timeout(sd_bus *bus) { if (r < 0) return r; + m->read_counter = ++bus->read_counter; + r = bus_seal_synthetic_message(bus, m); if (r < 0) return r; @@ -2524,6 +2527,7 @@ static int process_reply(sd_bus *bus, sd_bus_message *m) { synthetic_reply->realtime = m->realtime; synthetic_reply->monotonic = m->monotonic; synthetic_reply->seqnum = m->seqnum; + synthetic_reply->read_counter = m->read_counter; r = bus_seal_synthetic_message(bus, synthetic_reply); if (r < 0) @@ -2866,6 +2870,8 @@ static int process_closing_reply_callback(sd_bus *bus, struct reply_callback *c) if (r < 0) return r; + m->read_counter = ++bus->read_counter; + r = bus_seal_synthetic_message(bus, m); if (r < 0) return r; @@ -2930,6 +2936,7 @@ static int process_closing(sd_bus *bus, sd_bus_message **ret) { return r; bus_message_set_sender_local(bus, m); + m->read_counter = ++bus->read_counter; r = bus_seal_synthetic_message(bus, m); if (r < 0)