Fix lib ring buffer compile errors
[lttng-ust.git] / liblttng-ust / lttng-ust-abi.c
index cddfee900e5a039d202f69e2e2ac921e4ce10af2..76f78702db080b1dcb04a5a2dad8927cf2fe60fb 100644 (file)
 #include <lttng/usterr-signal-safe.h>
 #include "lttng/core.h"
 #include "ltt-tracer.h"
+#include "tracepoint-internal.h"
+
+struct ltt_tracepoint_list {
+       struct tracepoint_iter iter;
+       int got_first;
+};
+
+static int lttng_ust_abi_close_in_progress;
 
 static
 int lttng_abi_tracepoint_list(void);
@@ -241,9 +249,9 @@ static
 long lttng_abi_tracer_version(int objd,
        struct lttng_ust_tracer_version *v)
 {
-       v->version = LTTNG_UST_VERSION;
+       v->major = LTTNG_UST_MAJOR;
+       v->minor = LTTNG_UST_MINOR;
        v->patchlevel = LTTNG_UST_PATCHLEVEL;
-       v->sublevel = LTTNG_UST_SUBLEVEL;
        return 0;
 }
 
@@ -322,7 +330,7 @@ void lttng_metadata_create_events(int channel_objd)
        struct ltt_channel *channel = objd_private(channel_objd);
        static struct lttng_ust_event metadata_params = {
                .instrumentation = LTTNG_UST_TRACEPOINT,
-               .name = "lttng_metadata",
+               .name = "lttng_ust:metadata",
        };
        struct ltt_event *event;
 
@@ -502,6 +510,7 @@ static
 void ltt_tracepoint_list_get(struct ltt_tracepoint_list *list,
                char *tp_list_entry)
 {
+next:
        if (!list->got_first) {
                tracepoint_iter_start(&list->iter);
                list->got_first = 1;
@@ -512,6 +521,9 @@ copy:
        if (!list->iter.tracepoint) {
                tp_list_entry[0] = '\0';        /* end of list */
        } else {
+               if (!strcmp((*list->iter.tracepoint)->name,
+                               "lttng_ust:metadata"))
+                       goto next;
                memcpy(tp_list_entry, (*list->iter.tracepoint)->name,
                        LTTNG_UST_SYM_NAME_LEN);
        }
@@ -832,7 +844,21 @@ int lttng_rb_release(int objd)
                buf = priv->buf;
                channel = priv->ltt_chan;
                free(priv);
-               channel->ops->buffer_read_close(buf, channel->handle);
+               /*
+                * If we are at ABI exit, we don't want to close the
+                * buffer opened for read: it is being shared between
+                * the parent and child (right after fork), and we don't
+                * want the child to close it for the parent. For a real
+                * exit, we don't care about marking it as closed, as
+                * the consumer daemon (if there is one) will do fine
+                * even if we don't mark it as "closed" for reading on
+                * our side.
+                * We only mark it as closed if it is being explicitely
+                * released by the session daemon with an explicit
+                * release command.
+                */
+               if (!lttng_ust_abi_close_in_progress)
+                       channel->ops->buffer_read_close(buf, channel->handle);
 
                return lttng_ust_objd_unref(channel->objd);
        }
@@ -896,5 +922,7 @@ static const struct lttng_ust_objd_ops lttng_event_ops = {
 
 void lttng_ust_abi_exit(void)
 {
+       lttng_ust_abi_close_in_progress = 1;
        objd_table_destroy();
+       lttng_ust_abi_close_in_progress = 0;
 }
This page took 0.025075 seconds and 4 git commands to generate.