SoW-2020-0002: Trace Hit Counters
[lttng-tools.git] / src / bin / lttng-sessiond / ust-registry.h
index 12614c5d531e08979ea7a20b3eae003e6bd19de7..1e3d2fc6be97380e6d11f118141bab5993309d1c 100644 (file)
@@ -35,6 +35,10 @@ struct ust_registry_session {
        uint32_t next_channel_id;
        /* Once this value reaches UINT32_MAX, no more id can be allocated. */
        uint32_t used_channel_id;
+       /* Next map ID available for a newly registered map. */
+       uint32_t next_map_id;
+       /* Once this value reaches UINT32_MAX, no more id can be allocated. */
+       uint32_t used_map_id;
        /* Next enumeration ID available. */
        uint64_t next_enum_id;
        /* Universal unique identifier used by the tracer. */
@@ -97,6 +101,12 @@ struct ust_registry_session {
         * be accessed with a RCU read side lock acquired.
         */
        struct lttng_ht *channels;
+
+       /*
+        * Hash table containing maps sent by the UST tracer. MUST
+        * be accessed with a RCU read side lock acquired.
+        */
+       struct lttng_ht *maps;
        /*
         * Unique key to identify the metadata on the consumer side.
         */
@@ -162,6 +172,45 @@ struct ust_registry_channel {
        struct rcu_head rcu_head;
 };
 
+struct ust_registry_map_key_ht_entry {
+       struct lttng_map_key *key;
+       struct lttng_ht_node_u64 node;
+};
+
+struct ust_registry_map_index_ht_entry {
+       uint64_t index;
+       char *formated_key;
+       struct lttng_ht_node_str node;
+};
+
+struct ust_registry_map {
+       uint64_t key;
+       /* Id set when replying to a register map. */
+       uint32_t map_id;
+
+       /* Indicates if this map registry has already been registered. */
+       unsigned int register_done;
+
+       /*
+        * Hash table containing events sent by the UST tracer. MUST be accessed
+        * with a RCU read side lock acquired.
+        */
+       struct lttng_ht *events_ht;
+       /* Next event ID available for a newly registered event. */
+       uint32_t next_event_id;
+       /* Once this value reaches UINT32_MAX, no more id can be allocated. */
+       uint32_t used_event_id;
+
+       /* tracer_token -> ust_registry_map_key_ht_entry */
+       struct lttng_ht *tracer_token_to_map_key_ht;
+       /* format key -> ust_registry_map_index_ht_entry */
+       struct lttng_ht *key_string_to_bucket_index_ht;
+
+       struct lttng_ht_node_u64 node;
+       /* For delayed reclaim */
+       struct rcu_head rcu_head;
+};
+
 /*
  * Event registered from a UST tracer sent to the session daemon. This is
  * indexed and matched by <event_name/signature>.
@@ -170,7 +219,7 @@ struct ust_registry_event {
        int id;
        /* Both objd are set by the tracer. */
        int session_objd;
-       int channel_objd;
+       int container_objd;
        /* Name of the event returned by the tracer. */
        char name[LTTNG_UST_SYM_NAME_LEN];
        char *signature;
@@ -220,7 +269,7 @@ static inline int ust_registry_is_max_id(uint32_t id)
  * Return a unique channel ID. If max is reached, the used_event_id counter is
  * returned.
  */
-static inline uint32_t ust_registry_get_next_event_id(
+static inline uint32_t ust_registry_channel_get_next_event_id(
                struct ust_registry_channel *r)
 {
        if (ust_registry_is_max_id(r->used_event_id)) {
@@ -231,6 +280,26 @@ static inline uint32_t ust_registry_get_next_event_id(
        return r->next_event_id++;
 }
 
+/*
+ * Return next available event id and increment the used counter. The
+ * ust_registry_is_max_id function MUST be called before in order to validate
+ * if the maximum number of IDs have been reached. If not, it is safe to call
+ * this function.
+ *
+ * Return a unique map ID. If max is reached, the used_event_id counter is
+ * returned.
+ */
+static inline uint32_t ust_registry_map_get_next_event_id(
+               struct ust_registry_map *r)
+{
+       if (ust_registry_is_max_id(r->used_event_id)) {
+               return r->used_event_id;
+       }
+
+       r->used_event_id++;
+       return r->next_event_id++;
+}
+
 /*
  * Return next available channel id and increment the used counter. The
  * ust_registry_is_max_id function MUST be called before in order to validate
@@ -251,6 +320,26 @@ static inline uint32_t ust_registry_get_next_chan_id(
        return r->next_channel_id++;
 }
 
+/*
+ * Return next available map id and increment the used counter. The
+ * ust_registry_is_max_id function MUST be called before in order to validate
+ * if the maximum number of IDs have been reached. If not, it is safe to call
+ * this function.
+ *
+ * Return a unique map ID. If max is reached, the used_map_id counter
+ * is returned.
+ */
+static inline uint32_t ust_registry_get_next_map_id(
+               struct ust_registry_session *r)
+{
+       if (ust_registry_is_max_id(r->used_map_id)) {
+               return r->used_map_id;
+       }
+
+       r->used_map_id++;
+       return r->next_map_id++;
+}
+
 /*
  * Return registry event count. This is read atomically.
  */
@@ -262,6 +351,7 @@ static inline uint32_t ust_registry_get_event_count(
 
 #ifdef HAVE_LIBLTTNG_UST_CTL
 
+/* Channels */
 void ust_registry_channel_destroy(struct ust_registry_session *session,
                struct ust_registry_channel *chan);
 struct ust_registry_channel *ust_registry_channel_find(
@@ -271,6 +361,19 @@ int ust_registry_channel_add(struct ust_registry_session *session,
 void ust_registry_channel_del_free(struct ust_registry_session *session,
                uint64_t key, bool notif);
 
+/* Maps */
+void ust_registry_map_destroy(struct ust_registry_session *session,
+               struct ust_registry_map *map);
+struct ust_registry_map *ust_registry_map_find(
+               struct ust_registry_session *session, uint64_t key);
+int ust_registry_map_add(struct ust_registry_session *session,
+               uint64_t key);
+void ust_registry_map_del_free(struct ust_registry_session *session,
+               uint64_t key);
+int ust_registry_map_add_token_key_mapping(struct ust_registry_session *session,
+               uint64_t map_key, uint64_t tracer_token,
+               struct lttng_map_key *key);
+
 int ust_registry_session_init(struct ust_registry_session **sessionp,
                struct ust_app *app,
                uint32_t bits_per_long,
@@ -290,14 +393,24 @@ int ust_registry_session_init(struct ust_registry_session **sessionp,
                uid_t tracing_uid);
 void ust_registry_session_destroy(struct ust_registry_session *session);
 
-int ust_registry_create_event(struct ust_registry_session *session,
+int ust_registry_chan_create_event(struct ust_registry_session *session,
                uint64_t chan_key, int session_objd, int channel_objd, char *name,
                char *sig, size_t nr_fields, struct ustctl_field *fields,
                int loglevel_value, char *model_emf_uri, int buffer_type,
                uint32_t *event_id_p, struct ust_app *app);
-struct ust_registry_event *ust_registry_find_event(
+struct ust_registry_event *ust_registry_chan_find_event(
                struct ust_registry_channel *chan, char *name, char *sig);
-void ust_registry_destroy_event(struct ust_registry_channel *chan,
+void ust_registry_chan_destroy_event(struct ust_registry_channel *chan,
+               struct ust_registry_event *event);
+
+int ust_registry_map_create_event(struct ust_registry_session *session,
+               uint64_t map_key, int session_objd, int map_objd, char *name,
+               char *sig, size_t nr_fields, struct ustctl_field *fields,
+               int loglevel_value, char *model_emf_uri, int buffer_type,
+               uint64_t tracer_token, uint64_t *counter_index_p, struct ust_app *app);
+struct ust_registry_event *ust_registry_map_find_event(
+               struct ust_registry_map *map, char *name, char *sig);
+void ust_registry_map_destroy_event(struct ust_registry_map *map,
                struct ust_registry_event *event);
 
 /* app can be NULL for registry shared across applications. */
This page took 0.027927 seconds and 5 git commands to generate.