X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Flib%2Flttng-ctl%2Fevent.c;h=1dd09046dcbc07cf15439391eec97925b52948e0;hp=541e37113b53637ebd64c336b8accc29743769c8;hb=a321667af6f25a77e32787fe89ad306786f7b29a;hpb=eb5c4f4e1670ed6637b2c36f6b474f94a2dcc948 diff --git a/src/lib/lttng-ctl/event.c b/src/lib/lttng-ctl/event.c index 541e37113..1dd09046d 100644 --- a/src/lib/lttng-ctl/event.c +++ b/src/lib/lttng-ctl/event.c @@ -3,42 +3,81 @@ * * Linux Trace Toolkit Control Library * - * Copyright (C) 2017 - Jérémie Galarneau + * Copyright (C) 2017 Jérémie Galarneau * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License, version 2.1 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: LGPL-2.1-only * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #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); + event = NULL; + 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) { int ret = 0; - struct lttcomm_event_extended_header *ext_header; + struct lttng_event_extended *event_extended; if (!event || !filter_expression) { ret = -LTTNG_ERR_INVALID; goto end; } - ext_header = event->extended.ptr; - - if (!ext_header) { + event_extended = (struct lttng_event_extended *) event->extended.ptr; + if (!event_extended) { /* * This can happen since the lttng_event structure is * used for other tasks where this pointer is never set. @@ -47,42 +86,35 @@ int lttng_event_get_filter_expression(struct lttng_event *event, goto end; } - if (ext_header->filter_len) { - *filter_expression = ((const char *) (ext_header)) + - sizeof(*ext_header); - } else { - *filter_expression = NULL; - } - + *filter_expression = event_extended->filter_expression; end: return ret; } int lttng_event_get_exclusion_name_count(struct lttng_event *event) { - int ret; - struct lttcomm_event_extended_header *ext_header; + int ret = 0; + struct lttng_event_extended *event_extended; if (!event) { ret = -LTTNG_ERR_INVALID; goto end; } - ext_header = event->extended.ptr; - if (!ext_header) { + event_extended = (struct lttng_event_extended *) event->extended.ptr; + if (!event_extended) { /* * This can happen since the lttng_event structure is * used for other tasks where this pointer is never set. */ - ret = 0; goto end; } - if (ext_header->nb_exclusions > INT_MAX) { + if (event_extended->exclusions.count > INT_MAX) { ret = -LTTNG_ERR_OVERFLOW; goto end; } - ret = (int) ext_header->nb_exclusions; + ret = (int) event_extended->exclusions.count; end: return ret; } @@ -91,30 +123,76 @@ int lttng_event_get_exclusion_name(struct lttng_event *event, size_t index, const char **exclusion_name) { int ret = 0; - struct lttcomm_event_extended_header *ext_header; - void *at; + struct lttng_event_extended *event_extended; if (!event || !exclusion_name) { ret = -LTTNG_ERR_INVALID; goto end; } - ext_header = event->extended.ptr; - if (!ext_header) { + if (index > UINT_MAX) { + ret = -LTTNG_ERR_OVERFLOW; + goto end; + } + + event_extended = (struct lttng_event_extended *) event->extended.ptr; + if (!event_extended) { + /* + * This can happen since the lttng_event structure is + * used for other tasks where this pointer is never set. + */ ret = -LTTNG_ERR_INVALID; goto end; } - if (index >= ext_header->nb_exclusions) { + if (index >= event_extended->exclusions.count) { ret = -LTTNG_ERR_INVALID; goto end; } - at = (void *) ext_header + sizeof(*ext_header); - at += ext_header->filter_len; - at += index * LTTNG_SYMBOL_NAME_LEN; - *exclusion_name = at; + *exclusion_name = event_extended->exclusions.strings + + (index * LTTNG_SYMBOL_NAME_LEN); +end: + return ret; +} + +const struct lttng_userspace_probe_location * +lttng_event_get_userspace_probe_location(const 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; }