+/*
+ * 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;
+}
+