/*
- * Copyright (C) 2013 - David Goulet <dgoulet@efficios.com>
+ * Copyright (C) 2013 David Goulet <dgoulet@efficios.com>
*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License, version 2 only, as
- * published by the Free Software Foundation.
+ * SPDX-License-Identifier: GPL-2.0-only
*
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef LTTNG_UST_REGISTRY_H
#include <stdint.h>
#include <common/hashtable/hashtable.h>
-#include <common/compat/uuid.h>
+#include <common/uuid.h>
-#include "ust-ctl.h"
+#include "lttng-ust-ctl.h"
#define CTF_SPEC_MAJOR 1
#define CTF_SPEC_MINOR 8
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. */
- unsigned char uuid[UUID_LEN];
+ unsigned char uuid[LTTNG_UUID_LEN];
/* session ABI description */
* 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.
*/
*/
uint32_t major;
uint32_t minor;
+
+ /* The id of the parent session */
+ uint64_t tracing_id;
+ uid_t tracing_uid;
};
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>.
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;
* 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)) {
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
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.
*/
#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(
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,
const char *root_shm_path,
const char *shm_path,
uid_t euid,
- gid_t egid);
+ gid_t egid,
+ uint64_t tracing_id,
+ 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. */
uint32_t uint32_t_alignment,
uint32_t uint64_t_alignment,
uint32_t long_alignment,
- int byte_order)
+ int byte_order,
+ uint32_t major,
+ uint32_t minor,
+ const char *root_shm_path,
+ const char *shm_path,
+ uid_t euid,
+ gid_t egid,
+ uint64_t tracing_id,
+ uid_t tracing_uid)
{
return 0;
}