+/*
+ * Allocate and initialize a ust map data structure.
+ *
+ * Return pointer to structure or NULL.
+ */
+struct ltt_ust_map *trace_ust_create_map(const struct lttng_map *map)
+{
+ struct ltt_ust_map *umap = NULL;
+ enum lttng_map_status map_status;
+ const char *map_name = NULL;
+ unsigned int dimension_count;
+ uint64_t dimension_len;
+
+ umap = zmalloc(sizeof(*umap));
+ if (!umap) {
+ PERROR("ltt_ust_map zmalloc");
+ goto end;
+ }
+
+ map_status = lttng_map_get_name(map, &map_name);
+ if (map_status != LTTNG_MAP_STATUS_OK) {
+ ERR("Can't get map name");
+ umap = NULL;
+ goto end;
+ }
+
+ dimension_count = lttng_map_get_dimension_count(map);
+ assert(dimension_count == 1);
+
+ map_status = lttng_map_get_dimension_length(map, 0, &dimension_len);
+ if (map_status != LTTNG_MAP_STATUS_OK) {
+ ERR("Can't get map first dimension length");
+ umap = NULL;
+ goto end;
+ }
+ assert(dimension_len > 0);
+
+ strncpy(umap->name, map_name, sizeof(umap->name));
+
+ umap->enabled = 1;
+ umap->bucket_count = dimension_len;
+ umap->coalesce_hits = lttng_map_get_coalesce_hits(map);
+ umap->bitness = lttng_map_get_bitness(map);
+ umap->nr_cpu = ustctl_get_nr_cpu_per_counter();
+
+ umap->dead_app_kv_values.dead_app_kv_values_32bits = lttng_ht_new(0,
+ LTTNG_HT_TYPE_STRING);
+ umap->dead_app_kv_values.dead_app_kv_values_64bits = lttng_ht_new(0,
+ LTTNG_HT_TYPE_STRING);
+ pthread_mutex_init(&umap->dead_app_kv_values.lock, NULL);
+
+ umap->events = lttng_ht_new(0, LTTNG_HT_TYPE_STRING);
+
+ /* Init node */
+ lttng_ht_node_init_str(&umap->node, umap->name);
+
+ DBG2("Trace UST map %s created", umap->name);
+end:
+ return umap;
+}
+
+/*
+ * Validates an exclusion list.
+ *
+ * Returns 0 if valid, negative value if invalid.
+ */
+static int validate_exclusion(struct lttng_event_exclusion *exclusion)
+{
+ size_t i;
+ int ret = 0;
+
+ assert(exclusion);
+
+ for (i = 0; i < exclusion->count; ++i) {
+ size_t j;
+ const char *name_a =
+ LTTNG_EVENT_EXCLUSION_NAME_AT(exclusion, i);
+
+ for (j = 0; j < i; ++j) {
+ const char *name_b =
+ LTTNG_EVENT_EXCLUSION_NAME_AT(exclusion, j);
+
+ if (!strncmp(name_a, name_b, LTTNG_SYMBOL_NAME_LEN)) {
+ /* Match! */
+ ret = -1;
+ goto end;
+ }
+ }
+ }
+
+end:
+ return ret;
+}
+