* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
+#define _LGPL_SOURCE
#include <assert.h>
#include <inttypes.h>
#include <string.h>
#include <common/defaults.h>
#include "snapshot.h"
+#include "utils.h"
/*
* Return the atomically incremented value of next_output_id.
}
/*
- * 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. */
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) {
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;
}
if (obj->consumer) {
consumer_output_send_destroy_relayd(obj->consumer);
- consumer_destroy_output(obj->consumer);
+ consumer_output_put(obj->consumer);
}
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.
return output;
}
-struct snapshot *snapshot_alloc(void)
-{
- return zmalloc(sizeof(struct snapshot));
-}
-
/*
* Initialized a snapshot object that was already allocated.
*
snapshot_output_destroy(output);
}
rcu_read_unlock();
+ ht_cleanup_push(obj->output_ht);
}