Fix lib ring buffer compile errors
[lttng-ust.git] / liblttng-ust / lttng-ust-abi.c
index 4b8a8e71d9e5b4548f8e3e3d2c0e7e676e514c96..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,10 +330,9 @@ 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;
-       int ret;
 
        /*
         * We tolerate no failure path after event creation. It will stay
@@ -333,7 +340,6 @@ void lttng_metadata_create_events(int channel_objd)
         */
        event = ltt_event_create(channel, &metadata_params, NULL);
        if (!event) {
-               ret = -EINVAL;
                goto create_error;
        }
        return;
@@ -355,11 +361,6 @@ int lttng_abi_create_channel(int session_objd,
        int ret = 0;
        struct ltt_channel chan_priv_init;
 
-       chan_objd = objd_alloc(NULL, &lttng_channel_ops);
-       if (chan_objd < 0) {
-               ret = chan_objd;
-               goto objd_error;
-       }
        switch (channel_type) {
        case PER_CPU_CHANNEL:
                if (chan_param->output == LTTNG_UST_MMAP) {
@@ -379,7 +380,12 @@ int lttng_abi_create_channel(int session_objd,
                break;
        default:
                transport_name = "<unknown>";
-               break;
+               return -EINVAL;
+       }
+       chan_objd = objd_alloc(NULL, ops);
+       if (chan_objd < 0) {
+               ret = chan_objd;
+               goto objd_error;
        }
        memset(&chan_priv_init, 0, sizeof(chan_priv_init));
        /* Copy of session UUID for consumer (availability through shm) */
@@ -504,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;
@@ -514,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);
        }
@@ -523,10 +533,13 @@ static
 long lttng_tracepoint_list_cmd(int objd, unsigned int cmd, unsigned long arg)
 {
        struct ltt_tracepoint_list *list = objd_private(objd);
+       char *str = (char *) arg;
 
        switch (cmd) {
        case LTTNG_UST_TRACEPOINT_LIST_GET:
-               ltt_tracepoint_list_get(list, (char *) arg);
+               ltt_tracepoint_list_get(list, str);
+               if (str[0] == '\0')
+                       return -ENOENT;
                return 0;
        default:
                return -EINVAL;
@@ -831,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);
        }
@@ -895,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.029994 seconds and 4 git commands to generate.