summaryrefslogtreecommitdiff
path: root/src/libsystemd-bus/sd-bus.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2013-05-16 21:52:35 +0200
committerLennart Poettering <lennart@poettering.net>2013-05-16 21:58:34 +0200
commite4ee6e5cc3e8e23e1ecc0d9fa756d9cc2534d218 (patch)
tree4264b1334f465b36c7f8c726eb9bf94f00ac5550 /src/libsystemd-bus/sd-bus.c
parenteb01ba5de14859d7a94835ab9299de40132d549a (diff)
bus: make bus ref counting atomic
This is preparation to allow sd_bus_message obejcts to be processed in a different thread from their originating sd_bus object.
Diffstat (limited to 'src/libsystemd-bus/sd-bus.c')
-rw-r--r--src/libsystemd-bus/sd-bus.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/src/libsystemd-bus/sd-bus.c b/src/libsystemd-bus/sd-bus.c
index 7b937d9999..4a081778ac 100644
--- a/src/libsystemd-bus/sd-bus.c
+++ b/src/libsystemd-bus/sd-bus.c
@@ -103,7 +103,7 @@ int sd_bus_new(sd_bus **ret) {
if (!r)
return -ENOMEM;
- r->n_ref = 1;
+ r->n_ref = REFCNT_INIT;
r->input_fd = r->output_fd = -1;
r->message_version = 1;
r->negotiate_fds = true;
@@ -934,9 +934,8 @@ sd_bus *sd_bus_ref(sd_bus *bus) {
if (!bus)
return NULL;
- assert(bus->n_ref > 0);
+ assert_se(REFCNT_INC(bus->n_ref) >= 2);
- bus->n_ref++;
return bus;
}
@@ -944,10 +943,7 @@ sd_bus *sd_bus_unref(sd_bus *bus) {
if (!bus)
return NULL;
- assert(bus->n_ref > 0);
- bus->n_ref--;
-
- if (bus->n_ref <= 0)
+ if (REFCNT_DEC(bus->n_ref) <= 0)
bus_free(bus);
return NULL;