2 * Copyright (C) 2021 Francis Deslauriers <francis.deslauriers@efficios.com>
4 * SPDX-License-Identifier: MIT
12 #include <lttng/lttng.h>
13 #include <lttng/handle.h>
14 #include <lttng/map.h>
15 #include <lttng/map-query.h>
17 #define LOG(fmt, ...) printf("# " fmt "\n", ##__VA_ARGS__);
18 #define ERR(fmt, ...) fprintf(stderr, "Error: " fmt "\n", ##__VA_ARGS__);
20 int main(int argc
, char *argv
[]) {
21 enum lttng_map_query_status query_status
;
22 enum lttng_error_code ret_code
;
23 enum lttng_map_status map_status
;
24 struct lttng_domain
*domains
= NULL
;
25 struct lttng_map_content
*map_content
= NULL
;
26 struct lttng_map_list
*map_list
= NULL
;
27 const struct lttng_map
*map
= NULL
;
28 const struct lttng_map_key_value_pair_list
*kv_list
;
29 const struct lttng_map_key_value_pair
*kv_pair
;
30 unsigned int map_idx
, map_count
, list_idx
, list_count
;
32 struct lttng_map_query
*map_query
= NULL
;
33 struct lttng_handle
*handle
= NULL
;
35 const char *session_name
, *map_name
, *key
, *wanted_key
= NULL
;
38 ERR("Missing argument(s)");
39 ERR("Usage: %s SESSION-NAME MAP-NAME [KEY]", argv
[0]);
44 session_name
= argv
[1];
50 nb_domains
= lttng_list_domains(session_name
, &domains
);
56 handle
= lttng_create_handle(session_name
, &domains
[0]);
62 LOG("Listing all maps of the \"%s\" session", session_name
);
64 ret_code
= lttng_list_maps(handle
, &map_list
);
65 if (ret_code
!= LTTNG_OK
) {
66 ERR("Getting list of all maps");
71 map_status
= lttng_map_list_get_count(map_list
, &map_count
);
72 if (map_status
!= LTTNG_MAP_STATUS_OK
) {
73 ERR("Getting the number of maps");
78 for (map_idx
= 0; map_idx
< map_count
; map_idx
++) {
79 const char *curr_map_name
;
80 const struct lttng_map
*curr_map
;
81 curr_map
= lttng_map_list_get_at_index(map_list
, map_idx
);
83 ERR("Getting map at index %u", map_idx
);
89 map_status
= lttng_map_get_name(curr_map
, &curr_map_name
);
90 if (map_status
!= LTTNG_MAP_STATUS_OK
) {
91 ERR("Getting the map #%u name", map_idx
);
96 if (strcmp(curr_map_name
, map_name
) == 0) {
97 LOG("Found \"%s\" map", map_name
);
103 ERR("Can't find map \"%s\" in \"%s\" session", map_name
, session_name
);
108 LOG("Creating a map query_object");
109 map_query
= lttng_map_query_create(LTTNG_MAP_QUERY_CONFIG_CPU_ALL
,
110 LTTNG_MAP_QUERY_CONFIG_BUFFER_UST_UID_ALL
,
111 LTTNG_MAP_QUERY_CONFIG_APP_BITNESS_ALL
);
113 ERR("Creating the map query object");
118 LOG("Query option: report values for each CPU individually");
119 query_status
= lttng_map_query_set_sum_by_cpu(map_query
, false);
120 if (query_status
!= LTTNG_MAP_QUERY_STATUS_OK
){
121 ERR("Setting the sum by option");
127 LOG("Query option: filter in only \"%s\" key", wanted_key
);
128 query_status
= lttng_map_query_add_key_filter(map_query
,
130 if (query_status
!= LTTNG_MAP_QUERY_STATUS_OK
) {
131 ERR("Setting the targeted key");
137 LOG("Execute query against the \"%s\" map", map_name
);
138 ret_code
= lttng_list_map_content(handle
, map
, map_query
, &map_content
);
139 if (ret_code
!= LTTNG_OK
) {
140 ERR("Executing the query on map");
145 map_status
= lttng_map_content_get_count(map_content
, &list_count
);
146 if (map_status
!= LTTNG_MAP_STATUS_OK
) {
147 ERR("Getting the number of key value pair list");
152 LOG("Printing query result:");
153 for (list_idx
= 0; list_idx
< list_count
; list_idx
++) {
154 unsigned int kv_pair_idx
, kv_pair_count
;
157 kv_list
= lttng_map_content_get_at_index(map_content
, list_idx
);
159 ERR("Getting key value pair list at index 0");
164 cpu
= lttng_map_key_value_pair_list_get_cpu(kv_list
);
166 LOG("=== CPU: %"PRIu64
" ===", cpu
);
168 map_status
= lttng_map_key_value_pair_list_get_count(kv_list
,
171 for (kv_pair_idx
= 0; kv_pair_idx
< kv_pair_count
; kv_pair_idx
++) {
172 kv_pair
= lttng_map_key_value_pair_list_get_at_index(
173 kv_list
, kv_pair_idx
);
175 ERR("Getting key value pair at index %u",
180 lttng_map_key_value_pair_get_key(kv_pair
, &key
);
181 lttng_map_key_value_pair_get_value(kv_pair
, &value
);
183 LOG("Key: \"%s\", value: %"PRId64
, key
, value
);
190 lttng_map_query_destroy(map_query
);
191 lttng_destroy_handle(handle
);
192 lttng_map_content_destroy(map_content
);
193 lttng_map_list_destroy(map_list
);