コード例 #1
0
ファイル: stream.c プロジェクト: brianrob/babeltrace
int bt_ctf_stream_get_discarded_events_count(
		struct bt_ctf_stream *stream, uint64_t *count)
{
	int64_t ret = 0;
	int field_signed;
	struct bt_ctf_field *events_discarded_field = NULL;
	struct bt_ctf_field_type *events_discarded_field_type = NULL;

	if (!stream || !count || !stream->packet_context) {
		ret = -1;
		goto end;
	}

	events_discarded_field = bt_ctf_field_structure_get_field(
		stream->packet_context, "events_discarded");
	if (!events_discarded_field) {
		ret = -1;
		goto end;
	}

	events_discarded_field_type = bt_ctf_field_get_type(
		events_discarded_field);
	if (!events_discarded_field_type) {
		ret = -1;
		goto end;
	}

	field_signed = bt_ctf_field_type_integer_get_signed(
		events_discarded_field_type);
	if (field_signed < 0) {
		ret = field_signed;
		goto end;
	}

	if (field_signed) {
		int64_t signed_count;

		ret = bt_ctf_field_signed_integer_get_value(
			events_discarded_field, &signed_count);
		if (ret) {
			goto end;
		}
		if (signed_count < 0) {
			/* Invalid value */
			ret = -1;
			goto end;
		}
		*count = (uint64_t) signed_count;
	} else {
		ret = bt_ctf_field_unsigned_integer_get_value(
			events_discarded_field, count);
		if (ret) {
			goto end;
		}
	}
end:
	bt_put(events_discarded_field);
	bt_put(events_discarded_field_type);
	return ret;
}
コード例 #2
0
ファイル: event-fields.c プロジェクト: cooljeanius/babeltrace
const char *bt_ctf_field_enumeration_get_mapping_name(
	struct bt_ctf_field *field)
{
	int ret;
	const char *name = NULL;
	struct bt_ctf_field *container = NULL;
	struct bt_ctf_field_type *container_type = NULL;
	struct bt_ctf_field_type_integer *integer_type = NULL;
	struct bt_ctf_field_type_enumeration *enumeration_type = NULL;

	container = bt_ctf_field_enumeration_get_container(field);
	if (!container) {
		goto end;
	}

	container_type = bt_ctf_field_get_type(container);
	if (!container_type) {
		goto error_put_container;
	}

	integer_type = container_of(container_type,
		struct bt_ctf_field_type_integer, parent);
	enumeration_type = container_of(field->type,
		struct bt_ctf_field_type_enumeration, parent);

	if (!integer_type->declaration.signedness) {
		uint64_t value;
		ret = bt_ctf_field_unsigned_integer_get_value(container,
		      &value);
		if (ret) {
			goto error_put_container_type;
		}

		name = bt_ctf_field_type_enumeration_get_mapping_name_unsigned(
			enumeration_type, value);
	} else {
		int64_t value;
		ret = bt_ctf_field_signed_integer_get_value(container,
		      &value);
		if (ret) {
			goto error_put_container_type;
		}

		name = bt_ctf_field_type_enumeration_get_mapping_name_signed(
			enumeration_type, value);
	}

error_put_container_type:
	bt_ctf_field_type_put(container_type);
error_put_container:
	bt_ctf_field_put(container);
end:
	return name;
}
コード例 #3
0
ファイル: stream.c プロジェクト: brianrob/babeltrace
static
int get_event_header_timestamp(struct bt_ctf_field *event_header, uint64_t *timestamp)
{
	int ret = 0;
	struct bt_ctf_field *timestamp_field = NULL;
	struct bt_ctf_field_type *timestamp_field_type = NULL;

	timestamp_field = bt_ctf_field_structure_get_field(event_header,
		"timestamp");
	if (!timestamp_field) {
		ret = -1;
		goto end;
	}

	timestamp_field_type = bt_ctf_field_get_type(timestamp_field);
	assert(timestamp_field_type);
	if (bt_ctf_field_type_get_type_id(timestamp_field_type) !=
		CTF_TYPE_INTEGER) {
		ret = -1;
		goto end;
	}

	if (bt_ctf_field_type_integer_get_signed(timestamp_field_type)) {
		int64_t val;

		ret = bt_ctf_field_signed_integer_get_value(timestamp_field,
			&val);
		if (ret) {
			goto end;
		}
		*timestamp = (uint64_t) val;
	} else {
		ret = bt_ctf_field_unsigned_integer_get_value(timestamp_field,
			timestamp);
		if (ret) {
			goto end;
		}
	}
end:
	bt_put(timestamp_field);
	bt_put(timestamp_field_type);
	return ret;
}
コード例 #4
0
ファイル: stream.c プロジェクト: mjeanson/debian-babeltrace
BT_HIDDEN
void bt_ctf_stream_update_clock_value(struct bt_ctf_stream *stream,
		struct bt_ctf_field *value_field)
{
	struct bt_ctf_field_type *value_type = NULL;
	struct bt_ctf_clock *clock = NULL;
	uint64_t requested_new_value;
	uint64_t requested_new_value_mask;
	uint64_t *cur_value;
	uint64_t cur_value_masked;
	int requested_new_value_size;
	int ret;

	assert(stream);
	assert(clock);
	assert(value_field);
	value_type = bt_ctf_field_get_type(value_field);
	assert(value_type);
	clock = bt_ctf_field_type_integer_get_mapped_clock(value_type);
	assert(clock);
	requested_new_value_size =
		bt_ctf_field_type_integer_get_size(value_type);
	assert(requested_new_value_size > 0);
	ret = bt_ctf_field_unsigned_integer_get_value(value_field,
		&requested_new_value);
	assert(!ret);
	cur_value = g_hash_table_lookup(stream->clock_values, clock);

	if (!cur_value) {
		/*
		 * Updating the value of a clock which is not registered
		 * yet, so register it with the new value as its initial
		 * value.
		 */
		uint64_t *requested_new_value_ptr = g_new0(uint64_t, 1);

		*requested_new_value_ptr = requested_new_value;
		g_hash_table_insert(stream->clock_values, clock,
			requested_new_value_ptr);
		goto end;
	}

	/*
	 * Special case for a 64-bit new value, which is the limit
	 * of a clock value as of this version: overwrite the
	 * current value directly.
	 */
	if (requested_new_value_size == 64) {
		*cur_value = requested_new_value;
		goto end;
	}

	requested_new_value_mask = (1ULL << requested_new_value_size) - 1;
	cur_value_masked = *cur_value & requested_new_value_mask;

	if (requested_new_value < cur_value_masked) {
		/*
		 * It looks like a wrap happened on the number of bits
		 * of the requested new value. Assume that the clock
		 * value wrapped only one time.
		 */
		*cur_value += requested_new_value_mask + 1;
	}

	/* Clear the low bits of the current clock value */
	*cur_value &= ~requested_new_value_mask;

	/* Set the low bits of the current clock value */
	*cur_value |= requested_new_value;

end:
	bt_put(clock);
	bt_put(value_type);
}