Update loglevel ABI: only loglevel value/enum is known by UST
[lttng-ust.git] / liblttng-ust / ltt-events.c
index 9751089c564f6830cb449eceb084200593dab2ae..911bf2929bd6a7bde214e315113163fff255e5b4 100644 (file)
@@ -20,6 +20,9 @@
 #include <sys/ipc.h>
 #include <stdint.h>
 #include <stddef.h>
+#include <inttypes.h>
+#include <time.h>
+#include "clock.h"
 
 #include <urcu-bp.h>
 #include <urcu/compiler.h>
@@ -74,7 +77,6 @@ struct ust_pending_probe {
 };
 
 static void _ltt_event_destroy(struct ltt_event *event);
-static void _ltt_loglevel_destroy(struct session_loglevel *sl);
 static void _ltt_wildcard_destroy(struct session_wildcard *sw);
 static void _ltt_channel_destroy(struct ltt_channel *chan);
 static int _ltt_event_unregister(struct ltt_event *event);
@@ -144,49 +146,11 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc)
        size_t name_len = strlen(name);
        uint32_t hash;
 
-       /*
-        * For this event, we need to lookup the loglevel. If active (in
-        * the active loglevels hash table), we must create the event.
-        */
-       if (desc->loglevel) {
-               const struct tracepoint_loglevel_entry *ev_ll;
-               struct loglevel_entry *loglevel;
-
-               ev_ll = *desc->loglevel;
-               loglevel = get_loglevel(ev_ll->identifier);
-               if (!loglevel)
-                       loglevel = get_loglevel_value(ev_ll->value);
-               if (loglevel) {
-                       struct session_loglevel *sl;
-
-                       cds_list_for_each_entry(sl, &loglevel->session_list,
-                                       session_list) {
-                               struct ltt_event *ev;
-                               int ret;
-
-                               memcpy(&event_param, &sl->event_param,
-                                               sizeof(event_param));
-                               memcpy(event_param.name,
-                                       desc->name,
-                                       sizeof(event_param.name));
-                               /* create event */
-                               ret = ltt_event_create(sl->chan,
-                                       &event_param, NULL,
-                                       &ev);
-                               if (ret) {
-                                       DBG("Error creating event");
-                                       continue;
-                               }
-                               cds_list_add(&ev->loglevel_list,
-                                       &sl->events);
-                       }
-               }
-       }
-
        /* Wildcard */
        {
                struct wildcard_entry *wildcard;
 
+                               /* TODO: check if loglevel match */
                wildcard = match_wildcard(desc->name);
                if (strcmp(desc->name, "lttng_ust:metadata") && wildcard) {
                        struct session_wildcard *sw;
@@ -225,6 +189,7 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc)
                struct ltt_event *event;
                struct ltt_channel *chan;
 
+                               /* TODO: check if loglevel match */
                if (strncmp(name, e->name, LTTNG_UST_SYM_NAME_LEN - 1))
                        continue;
                event = e->event;
@@ -259,7 +224,6 @@ struct ltt_session *ltt_session_create(void)
                return NULL;
        CDS_INIT_LIST_HEAD(&session->chan);
        CDS_INIT_LIST_HEAD(&session->events);
-       CDS_INIT_LIST_HEAD(&session->loglevels);
        CDS_INIT_LIST_HEAD(&session->wildcards);
        uuid_generate(session->uuid);
        cds_list_add(&session->list, &sessions);
@@ -270,7 +234,6 @@ void ltt_session_destroy(struct ltt_session *session)
 {
        struct ltt_channel *chan, *tmpchan;
        struct ltt_event *event, *tmpevent;
-       struct session_loglevel *loglevel, *tmploglevel;
        struct session_wildcard *wildcard, *tmpwildcard;
        int ret;
 
@@ -280,8 +243,6 @@ void ltt_session_destroy(struct ltt_session *session)
                WARN_ON(ret);
        }
        synchronize_trace();    /* Wait for in-flight events to complete */
-       cds_list_for_each_entry_safe(loglevel, tmploglevel, &session->loglevels, list)
-               _ltt_loglevel_destroy(loglevel);
        cds_list_for_each_entry_safe(wildcard, tmpwildcard, &session->wildcards, list)
                _ltt_wildcard_destroy(wildcard);
        cds_list_for_each_entry_safe(event, tmpevent, &session->events, list)
@@ -441,26 +402,6 @@ void _ltt_channel_destroy(struct ltt_channel *chan)
        chan->ops->channel_destroy(chan);
 }
 
-int ltt_loglevel_create(struct ltt_channel *chan,
-       struct lttng_ust_event *event_param,
-       struct session_loglevel **_sl)
-{
-       struct session_loglevel *sl;
-
-       sl = add_loglevel(event_param->name, chan, event_param);
-       if (!sl || IS_ERR(sl)) {
-               return PTR_ERR(sl);
-       }
-       *_sl = sl;
-       return 0;
-}
-
-static
-void _ltt_loglevel_destroy(struct session_loglevel *sl)
-{
-       _remove_loglevel(sl);
-}
-
 int ltt_wildcard_create(struct ltt_channel *chan,
        struct lttng_ust_event *event_param,
        struct session_wildcard **_sw)
@@ -527,6 +468,7 @@ int ltt_event_create(struct ltt_channel *chan,
        switch (event_param->instrumentation) {
        case LTTNG_UST_TRACEPOINT:
                event->desc = ltt_event_get(event_param->name);
+                               /* TODO: check if loglevel match */
                if (event->desc) {
                        ret = __tracepoint_probe_register(event_param->name,
                                        event->desc->probe_callback,
@@ -545,9 +487,6 @@ int ltt_event_create(struct ltt_channel *chan,
                                goto add_pending_error;
                }
                break;
-       case LTTNG_UST_TRACEPOINT_LOGLEVEL:
-               assert(0);
-               break;
        default:
                WARN_ON_ONCE(1);
        }
@@ -881,14 +820,12 @@ int _ltt_event_metadata_statedump(struct ltt_session *session,
                goto end;
 
        if (event->desc->loglevel) {
-               const struct tracepoint_loglevel_entry *ll_entry;
+               const int *ll_entry;
 
                ll_entry = *event->desc->loglevel;
                ret = lttng_metadata_printf(session,
-                       "       loglevel.identifier = \"%s\";\n"
-                       "       loglevel.value = %lld;\n",
-                       ll_entry->identifier,
-                       (long long) ll_entry->value);
+                       "       loglevel = %d;\n",
+                       ll_entry);
                if (ret)
                        goto end;
        }
@@ -987,8 +924,8 @@ int _ltt_stream_packet_context_declare(struct ltt_session *session)
 {
        return lttng_metadata_printf(session,
                "struct packet_context {\n"
-               "       uint64_t timestamp_begin;\n"
-               "       uint64_t timestamp_end;\n"
+               "       uint64_clock_monotonic_t timestamp_begin;\n"
+               "       uint64_clock_monotonic_t timestamp_end;\n"
                "       uint32_t events_discarded;\n"
                "       uint32_t content_size;\n"
                "       uint32_t packet_size;\n"
@@ -1014,11 +951,11 @@ int _ltt_event_header_declare(struct ltt_session *session)
        "       enum : uint5_t { compact = 0 ... 30, extended = 31 } id;\n"
        "       variant <id> {\n"
        "               struct {\n"
-       "                       uint27_t timestamp;\n"
+       "                       uint27_clock_monotonic_t timestamp;\n"
        "               } compact;\n"
        "               struct {\n"
        "                       uint32_t id;\n"
-       "                       uint64_t timestamp;\n"
+       "                       uint64_clock_monotonic_t timestamp;\n"
        "               } extended;\n"
        "       } v;\n"
        "} align(%u);\n"
@@ -1027,11 +964,11 @@ int _ltt_event_header_declare(struct ltt_session *session)
        "       enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;\n"
        "       variant <id> {\n"
        "               struct {\n"
-       "                       uint32_t timestamp;\n"
+       "                       uint32_clock_monotonic_t timestamp;\n"
        "               } compact;\n"
        "               struct {\n"
        "                       uint32_t id;\n"
-       "                       uint64_t timestamp;\n"
+       "                       uint64_clock_monotonic_t timestamp;\n"
        "               } extended;\n"
        "       } v;\n"
        "} align(%u);\n\n",
@@ -1040,6 +977,31 @@ int _ltt_event_header_declare(struct ltt_session *session)
        );
 }
 
+/*
+ * Approximation of NTP time of day to clock monotonic correlation,
+ * taken at start of trace.
+ * Yes, this is only an approximation. Yes, we can (and will) do better
+ * in future versions.
+ */
+static
+uint64_t measure_clock_offset(void)
+{
+       uint64_t offset, monotonic[2], realtime;
+       struct timespec rts = { 0, 0 };
+       int ret;
+
+       monotonic[0] = trace_clock_read64();
+       ret = clock_gettime(CLOCK_REALTIME, &rts);      
+       if (ret < 0)
+               return 0;
+       monotonic[1] = trace_clock_read64();
+       offset = (monotonic[0] + monotonic[1]) >> 1;
+       realtime = rts.tv_sec * 1000000000ULL;
+       realtime += rts.tv_nsec;
+       offset = realtime - offset;
+       return offset;
+}
+
 /*
  * Output metadata into this session's metadata buffers.
  */
@@ -1047,7 +1009,7 @@ static
 int _ltt_session_metadata_statedump(struct ltt_session *session)
 {
        unsigned char *uuid_c = session->uuid;
-       char uuid_s[37];
+       char uuid_s[37], clock_uuid_s[CLOCK_UUID_LEN];
        struct ltt_channel *chan;
        struct ltt_event *event;
        int ret = 0;
@@ -1103,6 +1065,56 @@ int _ltt_session_metadata_statedump(struct ltt_session *session)
        if (ret)
                goto end;
 
+       ret = lttng_metadata_printf(session,
+               "clock {\n"
+               "       name = %s;\n",
+               "monotonic"
+               );
+       if (ret)
+               goto end;
+
+       if (!trace_clock_uuid(clock_uuid_s)) {
+               ret = lttng_metadata_printf(session,
+                       "       uuid = \"%s\";\n",
+                       clock_uuid_s
+                       );
+               if (ret)
+                       goto end;
+       }
+
+       ret = lttng_metadata_printf(session,
+               "       description = \"Monotonic Clock\";\n"
+               "       freq = %" PRIu64 "; /* Frequency, in Hz */\n"
+               "       /* clock value offset from Epoch is: offset * (1/freq) */\n"
+               "       offset = %" PRIu64 ";\n"
+               "};\n\n",
+               trace_clock_freq(),
+               measure_clock_offset()
+               );
+       if (ret)
+               goto end;
+
+       ret = lttng_metadata_printf(session,
+               "typealias integer {\n"
+               "       size = 27; align = 1; signed = false;\n"
+               "       map = clock.monotonic.value;\n"
+               "} := uint27_clock_monotonic_t;\n"
+               "\n"
+               "typealias integer {\n"
+               "       size = 32; align = %u; signed = false;\n"
+               "       map = clock.monotonic.value;\n"
+               "} := uint32_clock_monotonic_t;\n"
+               "\n"
+               "typealias integer {\n"
+               "       size = 64; align = %u; signed = false;\n"
+               "       map = clock.monotonic.value;\n"
+               "} := uint64_clock_monotonic_t;\n\n",
+               lttng_alignof(uint32_t) * CHAR_BIT,
+               lttng_alignof(uint64_t) * CHAR_BIT
+               );
+       if (ret)
+               goto end;
+
        ret = _ltt_stream_packet_context_declare(session);
        if (ret)
                goto end;
This page took 0.026682 seconds and 4 git commands to generate.