]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-bus: maintain a counter for incoming msgs
authorLennart Poettering <lennart@poettering.net>
Fri, 29 Mar 2019 14:40:56 +0000 (15:40 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 11 Jul 2019 10:18:51 +0000 (12:18 +0200)
Let's count incoming messages and attach the current counter when we
first read them to the message objects. This allows us to nicely order
messages later on.

src/libsystemd/sd-bus/bus-internal.h
src/libsystemd/sd-bus/bus-message.h
src/libsystemd/sd-bus/bus-socket.c
src/libsystemd/sd-bus/sd-bus.c

index 39610c5d450052a6acf38eb5f276d6800d05b913..f6289daac68485be88896cc0a8bc838ab7dd2d16 100644 (file)
@@ -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;
index a7c4f81c4bac4f0879aa894c13f299d8250e9637..ced0bb3d34a91ea1764b70669ba5376648806d03 100644 (file)
@@ -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) {
index 9221b33d487d4ab6978da48993c7b6751e44d36f..3541c411a8b42b4ff49808906dbc601454696d83 100644 (file)
@@ -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);
         }
index 978a5056103a46a1dcbc67dc8b46d6ad122343c0..ac611d29759d5e8046baada5c3c36220fe904764 100644 (file)
@@ -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)