/* * 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 Kernel object tracing common structures. */ #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) /* * Lists for object tracing. */ #include struct nano_fifo *_trace_list_nano_fifo; struct nano_lifo *_trace_list_nano_lifo; struct nano_sem *_trace_list_nano_sem; struct nano_timer *_trace_list_nano_timer; struct nano_stack *_trace_list_nano_stack; struct ring_buf *_trace_list_sys_ring_buf; #if !defined(CONFIG_KERNEL_V2) #ifdef CONFIG_MICROKERNEL #include struct _k_mbox_struct *_trace_list_micro_mbox; struct _k_mutex_struct *_trace_list_micro_mutex; struct _k_sem_struct *_trace_list_micro_sem; struct _k_fifo_struct *_trace_list_micro_fifo; struct _k_pipe_struct *_trace_list_micro_pipe; struct pool_struct *_trace_list_micro_mem_pool; struct _k_mem_map_struct *_trace_list_micro_mem_map; struct _k_event_struct *_trace_list_micro_event; struct k_timer *_trace_list_micro_timer; struct k_task *_trace_list_micro_task; #endif /*CONFIG_MICROKERNEL*/ #endif /*CONFIG_KERNEL_V2*/ #endif /*CONFIG_DEBUG_TRACING_KERNEL_OBJECTS*/ #endif /*_OBJECT_TRACING_COMMON_H_*/