/*
 * Copyright (c) 2019 Intel corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <sys/ring_buffer.h>

static struct ring_buf tracing_ring_buf;
static uint8_t tracing_buffer[CONFIG_TRACING_BUFFER_SIZE + 1];
static uint8_t tracing_cmd_buffer[CONFIG_TRACING_CMD_BUFFER_SIZE];

uint32_t tracing_cmd_buffer_alloc(uint8_t **data)
{
	*data = &tracing_cmd_buffer[0];

	return sizeof(tracing_cmd_buffer);
}

uint32_t tracing_buffer_put_claim(uint8_t **data, uint32_t size)
{
	return ring_buf_put_claim(&tracing_ring_buf, data, size);
}

int tracing_buffer_put_finish(uint32_t size)
{
	return ring_buf_put_finish(&tracing_ring_buf, size);
}

uint32_t tracing_buffer_put(uint8_t *data, uint32_t size)
{
	return ring_buf_put(&tracing_ring_buf, data, size);
}

uint32_t tracing_buffer_get_claim(uint8_t **data, uint32_t size)
{
	return ring_buf_get_claim(&tracing_ring_buf, data, size);
}

int tracing_buffer_get_finish(uint32_t size)
{
	return ring_buf_get_finish(&tracing_ring_buf, size);
}

uint32_t tracing_buffer_get(uint8_t *data, uint32_t size)
{
	return ring_buf_get(&tracing_ring_buf, data, size);
}

void tracing_buffer_init(void)
{
	ring_buf_init(&tracing_ring_buf,
		      sizeof(tracing_buffer), tracing_buffer);
}

bool tracing_buffer_is_empty(void)
{
	return ring_buf_is_empty(&tracing_ring_buf);
}

uint32_t tracing_buffer_capacity_get(void)
{
	return ring_buf_capacity_get(&tracing_ring_buf);
}

uint32_t tracing_buffer_space_get(void)
{
	return ring_buf_space_get(&tracing_ring_buf);
}
