Esempio n. 1
0
void bt_ctf_event_class_set_native_byte_order(
		struct bt_ctf_event_class *event_class,
		int byte_order)
{
	if (!event_class) {
		return;
	}

	assert(byte_order == 0 || byte_order == LITTLE_ENDIAN ||
		byte_order == BIG_ENDIAN);

	bt_ctf_field_type_set_native_byte_order(event_class->context,
		byte_order);
	bt_ctf_field_type_set_native_byte_order(event_class->fields,
		byte_order);
}
Esempio n. 2
0
int bt_ctf_trace_add_stream_class(struct bt_ctf_trace *trace,
		struct bt_ctf_stream_class *stream_class)
{
	int ret, i;
	int64_t stream_id;

	if (!trace || !stream_class) {
		ret = -1;
		goto end;
	}

	for (i = 0; i < trace->stream_classes->len; i++) {
		if (trace->stream_classes->pdata[i] == stream_class) {
			/* Stream already registered to the trace */
			ret = -1;
			goto end;
		}
	}

	ret = bt_ctf_stream_class_resolve_types(stream_class, trace);
	if (ret) {
		goto end;
	}

	stream_id = bt_ctf_stream_class_get_id(stream_class);
	if (stream_id < 0) {
		stream_id = trace->next_stream_id++;

		/* Try to assign a new stream id */
		for (i = 0; i < trace->stream_classes->len; i++) {
			if (stream_id == bt_ctf_stream_class_get_id(
				trace->stream_classes->pdata[i])) {
				/* Duplicate stream id found */
				ret = -1;
				goto end;
			}
		}

		if (bt_ctf_stream_class_set_id_no_check(stream_class,
			stream_id)) {
			/* TODO Should retry with a different stream id */
			ret = -1;
			goto end;
		}
	}

	/* Set weak reference to trace in stream class */
	ret = bt_ctf_stream_class_set_trace(stream_class, trace);
	if (ret) {
		/* Stream class already part of another trace */
		goto end;
	}

	bt_get(stream_class);
	g_ptr_array_add(trace->stream_classes, stream_class);

	/*
	 * Freeze the trace and its packet header.
	 *
	 * All field type byte orders set as "native" byte ordering can now be
	 * safely set to trace's own endianness, including the stream class'.
	 */
	bt_ctf_field_type_set_native_byte_order(trace->packet_header_type,
		trace->byte_order);
	ret = bt_ctf_stream_class_set_byte_order(stream_class,
		trace->byte_order == LITTLE_ENDIAN ?
		BT_CTF_BYTE_ORDER_LITTLE_ENDIAN : BT_CTF_BYTE_ORDER_BIG_ENDIAN);
	if (ret) {
		goto end;
	}

	bt_ctf_stream_class_freeze(stream_class);
	if (!trace->frozen) {
		ret = bt_ctf_trace_freeze(trace);
		goto end;
	}
end:
	if (ret) {
		(void) bt_ctf_stream_class_set_trace(stream_class, NULL);
	}
	return ret;
}