From: Jérémie Galarneau Date: Wed, 5 Feb 2020 23:13:07 +0000 (-0500) Subject: actions: Make lttng_action reference countable X-Git-Tag: v2.13.0-rc1~615 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=c852ce4e1d4ab0028ecee333a3ffc83de32f44bf actions: Make lttng_action reference countable lttng_action objects will be shared with the action executor subsystem which executes them asynchronously. This introduces an ambiguous ownership since triggers could be unregistered while an action is executing (or pending execution). Also ease the object ownership management of the group action sub actions. This allow clients to add multiple time the same action to an action group without any problem. The currently user-visible 'destroy' method simply calls the 'put' method which preserves the expected behaviour for current users (both internal and public) of the API. Signed-off-by: Jérémie Galarneau Change-Id: I2d016a9b80e418d40c72db8e155c44e96852b33f --- diff --git a/include/lttng/action/action-internal.h b/include/lttng/action/action-internal.h index 152b27eab..e4c3b7b09 100644 --- a/include/lttng/action/action-internal.h +++ b/include/lttng/action/action-internal.h @@ -16,6 +16,7 @@ #include #include #include +#include typedef bool (*action_validate_cb)(struct lttng_action *action); typedef void (*action_destroy_cb)(struct lttng_action *action); @@ -28,6 +29,7 @@ typedef ssize_t (*action_create_from_payload_cb)( struct lttng_action **action); struct lttng_action { + struct urcu_ref ref; enum lttng_action_type type; action_validate_cb validate; action_serialize_cb serialize; @@ -67,4 +69,10 @@ LTTNG_HIDDEN bool lttng_action_is_equal(const struct lttng_action *a, const struct lttng_action *b); +LTTNG_HIDDEN +void lttng_action_get(struct lttng_action *action); + +LTTNG_HIDDEN +void lttng_action_put(struct lttng_action *action); + #endif /* LTTNG_ACTION_INTERNAL_H */ diff --git a/src/common/actions/action.c b/src/common/actions/action.c index 7325a532c..1a541ce46 100644 --- a/src/common/actions/action.c +++ b/src/common/actions/action.c @@ -55,6 +55,7 @@ void lttng_action_init( action_equal_cb equal, action_destroy_cb destroy) { + urcu_ref_init(&action->ref); action->type = type; action->validate = validate; action->serialize = serialize; @@ -62,14 +63,35 @@ void lttng_action_init( action->destroy = destroy; } -void lttng_action_destroy(struct lttng_action *action) +static +void action_destroy_ref(struct urcu_ref *ref) +{ + struct lttng_action *action = + container_of(ref, struct lttng_action, ref); + + action->destroy(action); +} + +LTTNG_HIDDEN +void lttng_action_get(struct lttng_action *action) +{ + urcu_ref_get(&action->ref); +} + +LTTNG_HIDDEN +void lttng_action_put(struct lttng_action *action) { if (!action) { return; } assert(action->destroy); - action->destroy(action); + urcu_ref_put(&action->ref, action_destroy_ref); +} + +void lttng_action_destroy(struct lttng_action *action) +{ + lttng_action_put(action); } LTTNG_HIDDEN