/* * Copyright (c) 2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ /** * @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_OBJECT_TRACING #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) #endif /*CONFIG_OBJECT_TRACING*/ #endif /*_OBJECT_TRACING_COMMON_H_*/