diff options
author | Lennart Poettering <lennart@poettering.net> | 2018-06-07 12:29:52 +0200 |
---|---|---|
committer | Sven Eden <yamakuzure@gmx.net> | 2018-08-24 16:47:08 +0200 |
commit | 39a0204cf1007ed10c182590b2299c688daadd42 (patch) | |
tree | 4f10e4f4b5fffa7b2ff142ae3229c842069c1b45 /src/libelogind/sd-bus/bus-track.c | |
parent | 71a053fff0eb3057822d4dec809f7078c3c9a95b (diff) |
sd-bus: also add destroy callbacks to sd_bus_track objects
This augments previous work for this for sd_bus_slot objects, and adds
the same concept to sd_bus_track objects, too.
Diffstat (limited to 'src/libelogind/sd-bus/bus-track.c')
-rw-r--r-- | src/libelogind/sd-bus/bus-track.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/src/libelogind/sd-bus/bus-track.c b/src/libelogind/sd-bus/bus-track.c index 168c6c5ac..1819eaffd 100644 --- a/src/libelogind/sd-bus/bus-track.c +++ b/src/libelogind/sd-bus/bus-track.c @@ -31,6 +31,7 @@ struct sd_bus_track { bool in_queue:1; /* In bus->track_queue? */ bool modified:1; bool recursive:1; + sd_bus_destroy_t destroy_callback; LIST_FIELDS(sd_bus_track, tracks); }; @@ -164,18 +165,21 @@ _public_ sd_bus_track* sd_bus_track_unref(sd_bus_track *track) { return NULL; assert(track->n_ref > 0); + track->n_ref--; - if (track->n_ref > 1) { - track->n_ref--; + if (track->n_ref > 0) return NULL; - } if (track->in_list) LIST_REMOVE(tracks, track->bus->tracks, track); bus_track_remove_from_queue(track); - hashmap_free_with_destructor(track->names, track_item_free); - sd_bus_unref(track->bus); + track->names = hashmap_free_with_destructor(track->names, track_item_free); + track->bus = sd_bus_unref(track->bus); + + if (track->destroy_callback) + track->destroy_callback(track->userdata); + return mfree(track); } @@ -439,6 +443,22 @@ _public_ void *sd_bus_track_set_userdata(sd_bus_track *track, void *userdata) { return ret; } +_public_ int sd_bus_track_set_destroy_callback(sd_bus_track *track, sd_bus_destroy_t callback) { + assert_return(track, -EINVAL); + + track->destroy_callback = callback; + return 0; +} + +_public_ int sd_bus_track_get_destroy_callback(sd_bus_track *track, sd_bus_destroy_t *ret) { + assert_return(track, -EINVAL); + + if (ret) + *ret = track->destroy_callback; + + return !!track->destroy_callback; +} + _public_ int sd_bus_track_set_recursive(sd_bus_track *track, int b) { assert_return(track, -EINVAL); |