Merge pull request #9221 from poettering/bus-track-destroy
add sd_bus_track and sd_event_source destroy callbacks too
This commit is contained in:
@@ -565,6 +565,10 @@ global:
|
||||
sd_bus_slot_set_floating;
|
||||
sd_bus_slot_get_destroy_callback;
|
||||
sd_bus_slot_set_destroy_callback;
|
||||
sd_bus_track_get_destroy_callback;
|
||||
sd_bus_track_set_destroy_callback;
|
||||
sd_event_add_inotify;
|
||||
sd_event_source_get_inotify_mask;
|
||||
sd_event_source_set_destroy_callback;
|
||||
sd_event_source_get_destroy_callback;
|
||||
} LIBSYSTEMD_238;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -106,6 +106,8 @@ struct sd_event_source {
|
||||
uint64_t pending_iteration;
|
||||
uint64_t prepare_iteration;
|
||||
|
||||
sd_event_destroy_t destroy_callback;
|
||||
|
||||
LIST_FIELDS(sd_event_source, sources);
|
||||
|
||||
union {
|
||||
@@ -1016,7 +1018,10 @@ static void source_free(sd_event_source *s) {
|
||||
source_disconnect(s);
|
||||
|
||||
if (s->type == SOURCE_IO && s->io.owned)
|
||||
safe_close(s->io.fd);
|
||||
s->io.fd = safe_close(s->io.fd);
|
||||
|
||||
if (s->destroy_callback)
|
||||
s->destroy_callback(s->userdata);
|
||||
|
||||
free(s->description);
|
||||
free(s);
|
||||
@@ -3775,3 +3780,19 @@ _public_ int sd_event_get_iteration(sd_event *e, uint64_t *ret) {
|
||||
*ret = e->iteration;
|
||||
return 0;
|
||||
}
|
||||
|
||||
_public_ int sd_event_source_set_destroy_callback(sd_event_source *s, sd_event_destroy_t callback) {
|
||||
assert_return(s, -EINVAL);
|
||||
|
||||
s->destroy_callback = callback;
|
||||
return 0;
|
||||
}
|
||||
|
||||
_public_ int sd_event_source_get_destroy_callback(sd_event_source *s, sd_event_destroy_t *ret) {
|
||||
assert_return(s, -EINVAL);
|
||||
|
||||
if (ret)
|
||||
*ret = s->destroy_callback;
|
||||
|
||||
return !!s->destroy_callback;
|
||||
}
|
||||
|
||||
@@ -485,6 +485,9 @@ const char* sd_bus_track_contains(sd_bus_track *track, const char *name);
|
||||
const char* sd_bus_track_first(sd_bus_track *track);
|
||||
const char* sd_bus_track_next(sd_bus_track *track);
|
||||
|
||||
int sd_bus_track_set_destroy_callback(sd_bus_track *s, sd_bus_destroy_t callback);
|
||||
int sd_bus_track_get_destroy_callback(sd_bus_track *s, sd_bus_destroy_t *ret);
|
||||
|
||||
/* Define helpers so that __attribute__((cleanup(sd_bus_unrefp))) and similar may be used. */
|
||||
_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_bus, sd_bus_unref);
|
||||
_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_bus, sd_bus_flush_close_unref);
|
||||
|
||||
@@ -80,6 +80,7 @@ typedef int (*sd_event_child_handler_t)(sd_event_source *s, const siginfo_t *si,
|
||||
typedef void* sd_event_child_handler_t;
|
||||
#endif
|
||||
typedef int (*sd_event_inotify_handler_t)(sd_event_source *s, const struct inotify_event *event, void *userdata);
|
||||
typedef void (*sd_event_destroy_t)(void *userdata);
|
||||
|
||||
int sd_event_default(sd_event **e);
|
||||
|
||||
@@ -143,6 +144,8 @@ int sd_event_source_get_time_clock(sd_event_source *s, clockid_t *clock);
|
||||
int sd_event_source_get_signal(sd_event_source *s);
|
||||
int sd_event_source_get_child_pid(sd_event_source *s, pid_t *pid);
|
||||
int sd_event_source_get_inotify_mask(sd_event_source *s, uint32_t *ret);
|
||||
int sd_event_source_set_destroy_callback(sd_event_source *s, sd_event_destroy_t callback);
|
||||
int sd_event_source_get_destroy_callback(sd_event_source *s, sd_event_destroy_t *ret);
|
||||
|
||||
/* Define helpers so that __attribute__((cleanup(sd_event_unrefp))) and similar may be used. */
|
||||
_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_event, sd_event_unref);
|
||||
|
||||
Reference in New Issue
Block a user