X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fsnapshot.c;h=f9366b36e5cab2ea27f8474af7286a4437a7d050;hb=e8fcabef14e1e2ce8d159c68c5585931df1216b4;hp=77255fa2c597f0440e72e8585be486c64e6ef369;hpb=6dc3064a30b0cc7cfa9fdd22da1963525dfb7388;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/snapshot.c b/src/bin/lttng-sessiond/snapshot.c index 77255fa2c..f9366b36e 100644 --- a/src/bin/lttng-sessiond/snapshot.c +++ b/src/bin/lttng-sessiond/snapshot.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -24,6 +25,7 @@ #include #include "snapshot.h" +#include "utils.h" /* * Return the atomically incremented value of next_output_id. @@ -34,28 +36,33 @@ static inline unsigned long get_next_output_id(struct snapshot *snapshot) } /* - * Initialize a snapshot output object using the given parameters. The name - * value and url can be NULL. + * Initialized snapshot output with the given values. * * Return 0 on success or else a negative value. */ -int snapshot_output_init(uint64_t max_size, const char *name, - const char *ctrl_url, const char *data_url, +static int output_init(uint64_t max_size, const char *name, + struct lttng_uri *uris, size_t nb_uri, struct consumer_output *consumer, struct snapshot_output *output, struct snapshot *snapshot) { - int ret = 0, nb_uri, i; - struct lttng_uri *uris = NULL; + int ret = 0, i; - assert(output); + memset(output, 0, sizeof(struct snapshot_output)); + /* + * max_size of -1ULL means unset. Set to default (unlimited). + */ + if (max_size == (uint64_t) -1ULL) { + max_size = 0; + } output->max_size = max_size; + if (snapshot) { output->id = get_next_output_id(snapshot); } lttng_ht_node_init_ulong(&output->node, (unsigned long) output->id); - if (name) { + if (name && name[0] != '\0') { strncpy(output->name, name, sizeof(output->name)); } else { /* Set default name. */ @@ -71,18 +78,12 @@ int snapshot_output_init(uint64_t max_size, const char *name, goto end; } - /* Create an array of URIs from URLs. */ - nb_uri = uri_parse_str_urls(ctrl_url, data_url, &uris); - if (nb_uri < 0) { - ret = nb_uri; - goto error; - } - output->consumer = consumer_copy_output(consumer); if (!output->consumer) { ret = -ENOMEM; goto error; } + output->consumer->snapshot = 1; /* No URL given. */ if (nb_uri == 0) { @@ -116,6 +117,49 @@ int snapshot_output_init(uint64_t max_size, const char *name, error: end: + return ret; +} + +/* + * Initialize a snapshot output object using the given parameters and URI(s). + * The name value and uris can be NULL. + * + * Return 0 on success or else a negative value. + */ +int snapshot_output_init_with_uri(uint64_t max_size, const char *name, + struct lttng_uri *uris, size_t nb_uri, + struct consumer_output *consumer, struct snapshot_output *output, + struct snapshot *snapshot) +{ + return output_init(max_size, name, uris, nb_uri, consumer, output, + snapshot); +} + +/* + * Initialize a snapshot output object using the given parameters. The name + * value and url can be NULL. + * + * Return 0 on success or else a negative value. + */ +int snapshot_output_init(uint64_t max_size, const char *name, + const char *ctrl_url, const char *data_url, + struct consumer_output *consumer, struct snapshot_output *output, + struct snapshot *snapshot) +{ + int ret = 0, nb_uri; + struct lttng_uri *uris = NULL; + + /* Create an array of URIs from URLs. */ + nb_uri = uri_parse_str_urls(ctrl_url, data_url, &uris); + if (nb_uri < 0) { + ret = nb_uri; + goto error; + } + + ret = output_init(max_size, name, uris, nb_uri, consumer, output, + snapshot); + +error: free(uris); return ret; } @@ -184,6 +228,32 @@ void snapshot_output_destroy(struct snapshot_output *obj) free(obj); } +/* + * RCU read side lock MUST be acquired before calling this since the returned + * pointer is in a RCU hash table. + * + * Return the reference on success or else NULL. + */ +struct snapshot_output *snapshot_find_output_by_name(const char *name, + struct snapshot *snapshot) +{ + struct lttng_ht_iter iter; + struct snapshot_output *output = NULL; + + assert(snapshot); + assert(name); + + cds_lfht_for_each_entry(snapshot->output_ht->ht, &iter.iter, output, + node.node) { + if (!strncmp(output->name, name, strlen(name))) { + return output; + } + } + + /* Not found */ + return NULL; +} + /* * RCU read side lock MUST be acquired before calling this since the returned * pointer is in a RCU hash table. @@ -211,11 +281,6 @@ error: return output; } -struct snapshot *snapshot_alloc(void) -{ - return zmalloc(sizeof(struct snapshot)); -} - /* * Initialized a snapshot object that was already allocated. * @@ -259,4 +324,5 @@ void snapshot_destroy(struct snapshot *obj) snapshot_output_destroy(output); } rcu_read_unlock(); + ht_cleanup_push(obj->output_ht); }