Do not install usterr-signal-safe
[lttng-ust.git] / liblttng-ust / lttng-ust-abi.c
index ea0a12483940def937212bc152f518cef90e9c81..76af511f582836553ee4d5622ed204432ddfe1b4 100644 (file)
 #include <urcu/compiler.h>
 #include <urcu/list.h>
 #include <lttng/ust-events.h>
-#include <lttng/usterr-signal-safe.h>
-#include "lttng/core.h"
+#include <lttng/ust-version.h>
+#include <usterr-signal-safe.h>
+#include <helper.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 +250,9 @@ static
 long lttng_abi_tracer_version(int objd,
        struct lttng_ust_tracer_version *v)
 {
-       v->version = LTTNG_UST_VERSION;
-       v->patchlevel = LTTNG_UST_PATCHLEVEL;
-       v->sublevel = LTTNG_UST_SUBLEVEL;
+       v->major = LTTNG_UST_MAJOR_VERSION;
+       v->minor = LTTNG_UST_MINOR_VERSION;
+       v->patchlevel = LTTNG_UST_PATCHLEVEL_VERSION;
        return 0;
 }
 
@@ -322,7 +331,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;
 
@@ -513,7 +522,8 @@ copy:
        if (!list->iter.tracepoint) {
                tp_list_entry[0] = '\0';        /* end of list */
        } else {
-               if (!strcmp((*list->iter.tracepoint)->name, "lttng:metadata"))
+               if (!strcmp((*list->iter.tracepoint)->name,
+                               "lttng_ust:metadata"))
                        goto next;
                memcpy(tp_list_entry, (*list->iter.tracepoint)->name,
                        LTTNG_UST_SYM_NAME_LEN);
@@ -835,7 +845,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);
        }
@@ -899,5 +923,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.036305 seconds and 4 git commands to generate.