zephyr/include/misc/debug/object_tracing_common.h
Juan Manuel Cruz 787b41c8a3 debug: adds object tracing capability to microkernel timers
Microkernel timers are defined at compile time as a static list
but they are allocated dynamically in kernel execution.

The object tracing list will only list those timers that are
currently allocated at debug time. For this reason, timers
can be removed from the tracing list at any time.

A very simple double linked list was implemented to reduce the
complexity of the action to remove an item from the list from O(n)
to O(1) and simplify the remove implementation.

Change-Id: Ib7ea718b52e7c719a32b3fa4ff1d7e6b00482c28
Signed-off-by: Juan Manuel Cruz <juan.m.cruz.alcaraz@intel.com>
2016-03-11 22:13:15 +00:00

143 lines
3.9 KiB
C

/*
* 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 <nanokernel.h>
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;
#ifdef CONFIG_MICROKERNEL
#include <microkernel/base_api.h>
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;
#endif /*CONFIG_MICROKERNEL*/
#endif /*CONFIG_DEBUG_TRACING_KERNEL_OBJECTS*/
#endif /*_OBJECT_TRACING_COMMON_H_*/