Fix fork handling, where child shares shm with parent
[lttng-ust.git] / liblttng-ust / lttng-ust-abi.c
index ea0a12483940def937212bc152f518cef90e9c81..435c86a673c8cb2652d6b992974b7846ae119108 100644 (file)
@@ -32,6 +32,8 @@
 #include "lttng/core.h"
 #include "ltt-tracer.h"
 
+static int lttng_ust_abi_close_in_progress;
+
 static
 int lttng_abi_tracepoint_list(void);
 
@@ -322,7 +324,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 +515,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 +838,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 +916,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.02405 seconds and 4 git commands to generate.