/*
 * Copyright (c) 2016 Intel Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file
 * @brief APIs used to add or remove an object in a debug tracing list.
 */

#ifndef _OBJECT_TRACING_COMMON_H_
#define _OBJECT_TRACING_COMMON_H_

#ifndef CONFIG_DEBUG_TRACING_KERNEL_OBJECTS

#define SYS_TRACING_OBJ_INIT(name, obj) do { } while ((0))
#define SYS_TRACING_OBJ_INIT_DLL(name, obj) do { } while ((0))
#define SYS_TRACING_OBJ_REMOVE_DLL(name, obj) do { } while ((0))

#else

/**
 * @def SYS_TRACING_OBJ_INIT
 *
 * @brief Adds a new object into the trace list
 *
 * @details The object is added for tracing into
 * a trace list. This is usually called at the
 * moment of object initialization.
 *
 * @param name Name of the trace list.
 * @param obj Object to be added in the trace list.
 */
#define SYS_TRACING_OBJ_INIT(name, obj)	\
	do {					\
		unsigned int key;		\
						\
		key = irq_lock();		\
		(obj)->__next =  _trace_list_##name;\
		_trace_list_##name = obj;       \
		irq_unlock(key);		\
	}					\
	while (0)

/**
 * @def SYS_TRACING_OBJ_INIT_DLL
 *
 * @brief Adds a new object into the trace list
 * as a double linked list.
 *
 * @details The object is added for tracing into
 * a trace list. This is usually called at the
 * moment of object initialization. This list is
 * used for objects that can be removed from the
 * tracing list dynamically.
 *
 * @param name Name of the trace list.
 * @param obj Object to be added in the trace list.
 */
#define SYS_TRACING_OBJ_INIT_DLL(name, obj)	\
	do {					\
		unsigned int key;		\
						\
		key = irq_lock();		\
		if (_trace_list_##name) {	\
			_trace_list_##name->__prev = (obj);\
		}				\
		(obj)->__next = _trace_list_##name;\
		(obj)->__prev = NULL;		\
		_trace_list_##name = obj;       \
		irq_unlock(key);		\
	}					\
	while (0)

/**
 * @def SYS_TRACING_OBJ_REMOVE_DLL
 *
 * @brief Removes an object from a double linked
 * trace list.
 *
 * @details The object is remove from the trace list.
 * It needs to be used with DEBUG_TRACING_OBJ_INIT_DLL
 * as a pair.
 *
 * @param name Name of the trace list.
 * @param obj Object to be removed from the trace list.
 */
#define SYS_TRACING_OBJ_REMOVE_DLL(name, obj)	\
	do {						\
		unsigned int key;			\
							\
		key = irq_lock();			\
		if (obj->__next) {			\
			obj->__next->__prev = (obj)->__prev;\
		}					\
		if (obj->__prev) {			\
			obj->__prev->__next = (obj)->__next;\
		} else {				\
			_trace_list_##name = (obj)->__next;\
		}					\
		irq_unlock(key);			\
	}						\
	while (0)

struct ring_buf;

struct ring_buf   *_trace_list_sys_ring_buf;

#endif /*CONFIG_DEBUG_TRACING_KERNEL_OBJECTS*/
#endif /*_OBJECT_TRACING_COMMON_H_*/
