static
void print_value_rec(FILE *, const bt_value *, size_t);
-struct print_map_value_data {
- size_t indent;
- FILE *fp;
-};
-
static
-bt_bool print_map_value(const char *key, const bt_value *object,
- void *data)
+void print_map_value(const char *key, const bt_value *object, FILE *fp,
+ size_t indent)
{
- struct print_map_value_data *print_map_value_data = data;
-
- print_indent(print_map_value_data->fp, print_map_value_data->indent);
- fprintf(print_map_value_data->fp, "%s: ", key);
+ print_indent(fp, indent);
+ fprintf(fp, "%s: ", key);
BT_ASSERT(object);
if (bt_value_is_array(object) &&
bt_value_array_is_empty(object)) {
- fprintf(print_map_value_data->fp, "[ ]\n");
- return true;
+ fprintf(fp, "[ ]\n");
+ goto end;
}
if (bt_value_is_map(object) &&
bt_value_map_is_empty(object)) {
- fprintf(print_map_value_data->fp, "{ }\n");
- return true;
+ fprintf(fp, "{ }\n");
+ goto end;
}
if (bt_value_is_array(object) ||
bt_value_is_map(object)) {
- fprintf(print_map_value_data->fp, "\n");
+ fprintf(fp, "\n");
}
- print_value_rec(print_map_value_data->fp, object,
- print_map_value_data->indent + 2);
+ print_value_rec(fp, object, indent + 2);
+
+end:
+ return;
+}
+
+static
+bt_bool collect_map_keys(const char *key, const bt_value *object, void *data)
+{
+ GPtrArray *map_keys = data;
+
+ g_ptr_array_add(map_keys, (gpointer *) key);
+
return BT_TRUE;
}
+static
+gint g_ptr_array_sort_strings(gconstpointer a, gconstpointer b) {
+ const char *s1 = *((const char **) a);
+ const char *s2 = *((const char **) b);
+
+ return g_strcmp0(s1, s2);
+}
+
static
void print_value_rec(FILE *fp, const bt_value *value, size_t indent)
{
uint64_t uint_val;
double dbl_val;
const char *str_val;
- int size;
- int i;
+ GPtrArray *map_keys = NULL;
- if (!value) {
- return;
- }
+ BT_ASSERT(value);
switch (bt_value_get_type(value)) {
case BT_VALUE_TYPE_NULL:
bt_common_color_reset());
break;
case BT_VALUE_TYPE_ARRAY:
+ {
+ uint64_t i, size;
size = bt_value_array_get_length(value);
- if (size < 0) {
- goto error;
- }
-
if (size == 0) {
print_indent(fp, indent);
fprintf(fp, "[ ]\n");
bt_value_array_borrow_element_by_index_const(
value, i);
- if (!element) {
- goto error;
- }
print_indent(fp, indent);
fprintf(fp, "- ");
print_value_rec(fp, element, indent + 2);
}
break;
+ }
case BT_VALUE_TYPE_MAP:
{
- struct print_map_value_data data = {
- .indent = indent,
- .fp = fp,
- };
+ guint i;
+ bt_value_map_foreach_entry_const_status foreach_status;
if (bt_value_map_is_empty(value)) {
print_indent(fp, indent);
break;
}
- bt_value_map_foreach_entry_const(value, print_map_value, &data);
+ map_keys = g_ptr_array_new();
+ if (!map_keys) {
+ BT_CLI_LOGE_APPEND_CAUSE("Failed to allocated on GPtrArray.");
+ goto end;
+ }
+
+ /*
+ * We want to print the map entries in a stable order. Collect
+ * all the map's keys in a GPtrArray, sort it, then print the
+ * entries in that order.
+ */
+ foreach_status = bt_value_map_foreach_entry_const(value,
+ collect_map_keys, map_keys);
+ if (foreach_status != BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_OK) {
+ BT_CLI_LOGE_APPEND_CAUSE("Failed to iterator on map value.");
+ goto end;
+ }
+
+ g_ptr_array_sort(map_keys, g_ptr_array_sort_strings);
+
+ for (i = 0; i < map_keys->len; i++) {
+ const char *map_key = g_ptr_array_index(map_keys, i);
+ const bt_value *map_value;
+
+ map_value = bt_value_map_borrow_entry_value_const(value, map_key);
+ BT_ASSERT(map_value);
+
+ print_map_value(map_key, map_value, fp, indent);
+ }
+
break;
}
default:
abort();
}
- return;
-error:
- BT_LOGE("Error printing value of type %s.",
- bt_common_value_type_string(bt_value_get_type(value)));
+ goto end;
+
+end:
+ if (map_keys) {
+ g_ptr_array_free(map_keys, TRUE);
+ }
}
static
typedef const bt_component_class *(* spec_comp_cls_borrow_comp_cls_func_t)(
void *);
+static
void cmd_list_plugins_print_component_classes(const bt_plugin *plugin,
const char *cc_type_name, uint64_t count,
plugin_borrow_comp_cls_by_index_func_t borrow_comp_cls_by_index_func,
static const char * const comp_cls_name = "lttng-live";
static const bt_component_class_type comp_cls_type =
BT_COMPONENT_CLASS_TYPE_SOURCE;
- int64_t array_size, i;
+ uint64_t array_size, i;
const char *fail_reason = NULL;
FILE *out_stream = stdout;
int64_t timer_us, streams, clients;
map = bt_value_array_borrow_element_by_index_const(results, i);
- if (!map) {
- BT_CLI_LOGE_APPEND_CAUSE("Unexpected empty array entry.");
- goto error;
- }
if (!bt_value_is_map(map)) {
BT_CLI_LOGE_APPEND_CAUSE("Unexpected entry type.");
goto error;
int compute_stream_intersection(const bt_value *streams,
struct trace_range *range)
{
- unsigned int i;
- unsigned int stream_count;
+ uint64_t i, stream_count;
int ret;
BT_ASSERT(bt_value_get_type(streams) == BT_VALUE_TYPE_ARRAY);
"range-ns:begin=%" PRId64 ", "
"range-ns:end=%" PRId64,
begin_ns, end_ns);
- ret = -1;
goto error;
}
{
int ret = 0;
uint64_t trace_idx;
- int64_t trace_count;
+ uint64_t trace_count;
const bt_value *query_result = NULL;
const bt_value *trace_info = NULL;
const bt_value *stream_infos = NULL;
cfg_comp->params, &query_result,
&fail_reason);
if (ret) {
- BT_CLI_LOGE_APPEND_CAUSE("Component class does not support the `babeltrace.trace-infos` query: %s: "
+ BT_CLI_LOGE_APPEND_CAUSE("Failed to execute `babeltrace.trace-infos` query: %s: "
"comp-class-name=\"%s\"", fail_reason,
bt_component_class_get_name(comp_cls));
ret = -1;
}
trace_count = bt_value_array_get_length(query_result);
- if (trace_count < 0) {
+ if (trace_count == 0) {
BT_CLI_LOGE_APPEND_CAUSE("`babeltrace.trace-infos` query: result is empty: "
"component-class-name=%s", bt_component_class_get_name(comp_cls));
ret = -1;
trace_info = bt_value_array_borrow_element_by_index_const(
query_result, trace_idx);
- BT_ASSERT(trace_info);
if (!bt_value_is_map(trace_info)) {
ret = -1;
BT_CLI_LOGE_APPEND_CAUSE("`babeltrace.trace-infos` query: expecting element to be a map: "
}
stream_count = bt_value_array_get_length(stream_infos);
- if (stream_count < 0) {
+ if (stream_count == 0) {
ret = -1;
BT_CLI_LOGE_APPEND_CAUSE("`babeltrace.trace-infos` query: list of streams is empty: "
"component-class-name=%s",
stream_info = bt_value_array_borrow_element_by_index_const(
stream_infos, stream_idx);
- BT_ASSERT(stream_info);
if (!bt_value_is_map(stream_info)) {
ret = -1;
BT_CLI_LOGE_APPEND_CAUSE("`babeltrace.trace-infos` query: "