From: Jérémie Galarneau Date: Sun, 15 Oct 2017 20:31:07 +0000 (-0400) Subject: lttng-ctl: add accessors of userspace probe location to lttng_event X-Git-Tag: v2.11.0-rc1~99 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=ef0e06bcabd5f5fcf609b60d6558c2bdded5e496 lttng-ctl: add accessors of userspace probe location to lttng_event Signed-off-by: Jérémie Galarneau --- diff --git a/include/lttng/event.h b/include/lttng/event.h index b89590dbd..0131defcc 100644 --- a/include/lttng/event.h +++ b/include/lttng/event.h @@ -24,6 +24,7 @@ extern "C" { #endif #include +#include /* * Instrumentation type of tracing event. @@ -301,6 +302,10 @@ struct lttng_event_field { extern int lttng_list_events(struct lttng_handle *handle, const char *channel_name, struct lttng_event **events); +extern struct lttng_event *lttng_event_create(void); + +extern void lttng_event_destroy(struct lttng_event *event); + /* * Get the filter expression of a specific LTTng event. * @@ -333,6 +338,26 @@ extern int lttng_event_get_exclusion_name_count(struct lttng_event *event); extern int lttng_event_get_exclusion_name(struct lttng_event *event, size_t index, const char **exclusion_name); + +/* + * Get the userspace probe location of a specific LTTng event. + * If the call is successful, then a pointer to the probe location is returned. + * If the event has no probe location a NULL pointer is returned. The caller + * does not own the returned probe location. + */ +extern struct lttng_userspace_probe_location * +lttng_event_get_userspace_probe_location(struct lttng_event *event); + +/* + * Set an LTTng event's userspace probe location. + * If the call is successful, then the probe location is set to the event. The + * ownership of the probe_location is given to the event. + * + * Returns 0 on success, or a negative LTTng error code on error. + */ +extern int lttng_event_set_userspace_probe_location(struct lttng_event *event, + struct lttng_userspace_probe_location *probe_location); + /* * List the available tracepoints of a specific lttng domain. * diff --git a/src/lib/lttng-ctl/event.c b/src/lib/lttng-ctl/event.c index 541e37113..691b4f95c 100644 --- a/src/lib/lttng-ctl/event.c +++ b/src/lib/lttng-ctl/event.c @@ -20,10 +20,59 @@ */ #define _LGPL_SOURCE -#include -#include +#include #include + +#include #include +#include +#include +#include +#include + +struct lttng_event *lttng_event_create(void) +{ + struct lttng_event *event; + struct lttng_event_extended *event_extended; + + event = zmalloc(sizeof(*event)); + if (!event) { + PERROR("Error allocating event structure"); + goto end; + } + + event_extended = zmalloc(sizeof(*event_extended)); + if (!event_extended) { + PERROR("Error allocating event extended structure"); + goto error; + } + event->extended.ptr = event_extended; +end: + return event; +error: + free(event); + goto end; +} + +void lttng_event_destroy(struct lttng_event *event) +{ + struct lttng_event_extended *event_extended; + + if (!event) { + return; + } + + event_extended = (struct lttng_event_extended *) event->extended.ptr; + + if (event_extended) { + if (event_extended->probe_location) { + lttng_userspace_probe_location_destroy( + event_extended->probe_location); + } + free(event_extended); + } + free(event); +} int lttng_event_get_filter_expression(struct lttng_event *event, const char **filter_expression) @@ -118,3 +167,44 @@ int lttng_event_get_exclusion_name(struct lttng_event *event, end: return ret; } + +struct lttng_userspace_probe_location * +lttng_event_get_userspace_probe_location(struct lttng_event *event) +{ + struct lttng_userspace_probe_location *probe_location = NULL; + struct lttng_event_extended *event_extended; + + if (!event) { + goto end; + } + + event_extended = (struct lttng_event_extended *) event->extended.ptr; + if (!event_extended) { + goto end; + } + probe_location = event_extended->probe_location; +end: + return probe_location; +} + +int lttng_event_set_userspace_probe_location(struct lttng_event *event, + struct lttng_userspace_probe_location *probe_location) +{ + int ret = 0; + struct lttng_event_extended *event_extended; + + if (!event || !probe_location) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + + event_extended = (struct lttng_event_extended *) event->extended.ptr; + assert(event_extended); + if (event_extended->probe_location) { + lttng_userspace_probe_location_destroy( + event_extended->probe_location); + } + event_extended->probe_location = probe_location; +end: + return ret; +}