Fix: define _LGPL_SOURCE in C files
[lttng-tools.git] / src / bin / lttng-sessiond / snapshot.c
index 5265cf5575d692f94c4f7cde7d1c3d6ea59ea40a..1060269f3a9e0b15232f07ec380e643fb027a18c 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <assert.h>
 #include <inttypes.h>
 #include <string.h>
@@ -24,6 +25,7 @@
 #include <common/defaults.h>
 
 #include "snapshot.h"
+#include "utils.h"
 
 /*
  * Return the atomically incremented value of next_output_id.
@@ -34,25 +36,26 @@ 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);
 
-       DBG2("Snapshot output initializing with max size %" PRIu64 ", name %s "
-                       "ctrl URL %s, data URL %s", max_size, name, ctrl_url, data_url);
+       memset(output, 0, sizeof(struct snapshot_output));
 
+       if (max_size == (uint64_t) -1ULL) {
+               max_size = 0;
+       }
        output->max_size = max_size;
+
        if (snapshot) {
                output->id = get_next_output_id(snapshot);
        }
@@ -74,18 +77,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) {
@@ -119,6 +116,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;
 }
@@ -187,6 +227,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.
@@ -214,11 +280,6 @@ error:
        return output;
 }
 
-struct snapshot *snapshot_alloc(void)
-{
-       return zmalloc(sizeof(struct snapshot));
-}
-
 /*
  * Initialized a snapshot object that was already allocated.
  *
@@ -262,4 +323,5 @@ void snapshot_destroy(struct snapshot *obj)
                snapshot_output_destroy(output);
        }
        rcu_read_unlock();
+       ht_cleanup_push(obj->output_ht);
 }
This page took 0.0267810000000001 seconds and 5 git commands to generate.