X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-abi.c;h=76f78702db080b1dcb04a5a2dad8927cf2fe60fb;hb=2fed87aef82aaa8edfb6d8d8ac6bbf5f1e67b955;hp=ea0a12483940def937212bc152f518cef90e9c81;hpb=39f98c62fa2eb208bc24230dc2d669132e08a1fa;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-abi.c b/liblttng-ust/lttng-ust-abi.c index ea0a1248..76f78702 100644 --- a/liblttng-ust/lttng-ust-abi.c +++ b/liblttng-ust/lttng-ust-abi.c @@ -31,6 +31,14 @@ #include #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; @@ -513,7 +521,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 +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); } @@ -899,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; }