#include <lttng/location-internal.h>
#include <common/macros.h>
#include <stdlib.h>
+#include <common/error.h>
static
struct lttng_trace_archive_location *lttng_trace_archive_location_create(
goto end;
}
+ urcu_ref_init(&location->ref);
location->type = type;
end:
return location;
}
-LTTNG_HIDDEN
-void lttng_trace_archive_location_destroy(
- struct lttng_trace_archive_location *location)
+static
+void trace_archive_location_destroy_ref(struct urcu_ref *ref)
{
- if (!location) {
- return;
- }
+ struct lttng_trace_archive_location *location =
+ container_of(ref, struct lttng_trace_archive_location, ref);
switch (location->type) {
case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL:
free(location);
}
-LTTNG_HIDDEN
+void lttng_trace_archive_location_get(struct lttng_trace_archive_location *location)
+{
+ urcu_ref_get(&location->ref);
+}
+
+void lttng_trace_archive_location_put(struct lttng_trace_archive_location *location)
+{
+ if (!location) {
+ return;
+ }
+
+ urcu_ref_put(&location->ref, trace_archive_location_destroy_ref);
+}
+
struct lttng_trace_archive_location *lttng_trace_archive_location_local_create(
const char *absolute_path)
{
end:
return location;
error:
- lttng_trace_archive_location_destroy(location);
+ lttng_trace_archive_location_put(location);
return NULL;
}
-LTTNG_HIDDEN
struct lttng_trace_archive_location *lttng_trace_archive_location_relay_create(
const char *host,
enum lttng_trace_archive_location_relay_protocol_type protocol,
end:
return location;
error:
- lttng_trace_archive_location_destroy(location);
+ lttng_trace_archive_location_put(location);
return NULL;
}
-LTTNG_HIDDEN
ssize_t lttng_trace_archive_location_create_from_buffer(
const struct lttng_buffer_view *view,
struct lttng_trace_archive_location **location)
location_comm_view = lttng_buffer_view_from_view(view, 0,
sizeof(*location_comm));
- if (!location_comm_view.data) {
+ if (!lttng_buffer_view_is_valid(&location_comm_view)) {
goto error;
}
+
offset += location_comm_view.size;
- location_comm = (const struct lttng_trace_archive_location_comm *) view->data;
+ location_comm = (const struct lttng_trace_archive_location_comm *) location_comm_view.data;
switch ((enum lttng_trace_archive_location_type) location_comm->type) {
case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL:
lttng_buffer_view_from_view(view, offset,
location_comm->types.local.absolute_path_len);
- if (!absolute_path_view.data) {
+ if (!lttng_buffer_view_is_valid(&absolute_path_view)) {
goto error;
}
+
if (absolute_path_view.data[absolute_path_view.size - 1] != '\0') {
goto error;
}
offset + hostname_view.size,
location_comm->types.relay.relative_path_len);
- if (!hostname_view.data || !relative_path_view.data) {
+ if (!lttng_buffer_view_is_valid(&hostname_view) ||
+ !lttng_buffer_view_is_valid(
+ &relative_path_view)) {
goto error;
}
+
if (hostname_view.data[hostname_view.size - 1] != '\0') {
goto error;
}
return -1;
}
-LTTNG_HIDDEN
ssize_t lttng_trace_archive_location_serialize(
const struct lttng_trace_archive_location *location,
struct lttng_dynamic_buffer *buffer)