Defines an object tracing list for each kernel object type that supports object tracing, and ensures that both statically and dynamically defined objects are added to the appropriate list. Ensure that each static kernel object is grouped together with the other static objects of the same type. Revise the initialization function for each kernel type (or create it, if needed) so that each static object is added to the object tracing list for its associated type. Note 1: Threads are handled a bit differently than other kernel object types. A statically-defined thread is added to the thread list when the thread is started, not when the kernel initializes. Also, a thread is removed from the thread list when the thread terminates or aborts, unlike other types of kernel objects which are never removed from an object tracing list. (Such support would require the creation of APIs to "uninitialize" the kernel object.) Note 2: The list head variables for all kernel object types are now explicitly defined. However, the list head variable for the ring buffer type continues to be implicitly defined for the time being, since it isn't considered to be an core kernel object type. Change-Id: Ie24d41023e05b3598dc6b344e6871a9692bba02d Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
167 lines
4.6 KiB
C
167 lines
4.6 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 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)
|
|
|
|
#if !defined(CONFIG_KERNEL_V2)
|
|
|
|
/*
|
|
* Define list variables for all object types.
|
|
*
|
|
* This is ugly, since these list variables are redefined by every .c file
|
|
* that drags in this include file (explicitly or implicitly). Fortunately,
|
|
* the linker doesn't seem to mind seeing these duplicate definitions ...
|
|
*/
|
|
|
|
#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;
|
|
struct k_task *_trace_list_micro_task;
|
|
#endif /*CONFIG_MICROKERNEL*/
|
|
|
|
#else
|
|
|
|
/*
|
|
* Define list variables for object types that don't do it in a .c file.
|
|
*
|
|
* This is ugly, since these list variables are redefined by every .c file
|
|
* that drags in this include file (explicitly or implicitly). Fortunately,
|
|
* the linker doesn't seem to mind seeing these duplicate definitions ...
|
|
*/
|
|
|
|
struct ring_buf;
|
|
|
|
struct ring_buf *_trace_list_sys_ring_buf;
|
|
|
|
#endif /*CONFIG_KERNEL_V2*/
|
|
|
|
|
|
#endif /*CONFIG_DEBUG_TRACING_KERNEL_OBJECTS*/
|
|
#endif /*_OBJECT_TRACING_COMMON_H_*/
|