X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fcommon%2Ffd-tracker%2Ffd-tracker.c;fp=src%2Fcommon%2Ffd-tracker%2Ffd-tracker.c;h=580f20a007d420d1c3bc7d69643d616b79dba467;hb=ee90b0d2ec1d116e610531e7e5b1cf487b2b5f21;hp=3720e075cba9ef7e6a4dc56cf92b23f6e8dafa72;hpb=8c2defe6b26049980312f5bb9dfb244f796b0c6b;p=deliverable%2Flttng-tools.git diff --git a/src/common/fd-tracker/fd-tracker.c b/src/common/fd-tracker/fd-tracker.c index 3720e075c..580f20a00 100644 --- a/src/common/fd-tracker/fd-tracker.c +++ b/src/common/fd-tracker/fd-tracker.c @@ -129,6 +129,7 @@ struct unsuspendable_fd { int fd; char *name; struct cds_lfht_node tracker_node; + struct rcu_head rcu_head; }; static struct { @@ -169,14 +170,23 @@ int match_fd(struct cds_lfht_node *node, const void *key) (void *) key); } +static +void delete_unsuspendable_fd(struct rcu_head *head) +{ + struct unsuspendable_fd *fd = caa_container_of(head, + struct unsuspendable_fd, rcu_head); + + free(fd->name); + free(fd); +} + static void unsuspendable_fd_destroy(struct unsuspendable_fd *entry) { if (!entry) { return; } - free(entry->name); - free(entry); + call_rcu(&entry->rcu_head, delete_unsuspendable_fd); } static