From 5ebceeb8cba56b890fc9d4bf28a2d153a4d882c7 Mon Sep 17 00:00:00 2001 From: Shih-Wei Teng Date: Tue, 8 Oct 2019 14:37:47 +0800 Subject: [PATCH] object tracing: Fix the issue that objects lost from trace list Add a flag for identifing whether this object is on the trace list. Ensure that link any object to the trace list only one time. It will avoid the issue about lost object caused by adding a object to trace list twice. Fixes #19537 Signed-off-by: Shih-Wei Teng --- include/debug/object_tracing_common.h | 21 ++++++++++++--------- include/kernel.h | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/include/debug/object_tracing_common.h b/include/debug/object_tracing_common.h index 7787a07bbd6..0feacb81f16 100644 --- a/include/debug/object_tracing_common.h +++ b/include/debug/object_tracing_common.h @@ -33,15 +33,18 @@ * @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); \ - } \ +#define SYS_TRACING_OBJ_INIT(name, obj) \ + do { \ + unsigned int key; \ + \ + key = irq_lock(); \ + if (!(obj)->__linked) { \ + (obj)->__next = _trace_list_ ## name; \ + _trace_list_ ## name = obj; \ + (obj)->__linked = 1; \ + } \ + irq_unlock(key); \ + } \ while (false) /** diff --git a/include/kernel.h b/include/kernel.h index e1e785731a1..31b645a3bbe 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -98,10 +98,14 @@ typedef struct { #ifdef CONFIG_OBJECT_TRACING #define _OBJECT_TRACING_NEXT_PTR(type) struct type *__next; -#define _OBJECT_TRACING_INIT .__next = NULL, +#define _OBJECT_TRACING_LINKED_FLAG u8_t __linked; +#define _OBJECT_TRACING_INIT \ + .__next = NULL, \ + .__linked = 0, #else #define _OBJECT_TRACING_INIT #define _OBJECT_TRACING_NEXT_PTR(type) +#define _OBJECT_TRACING_LINKED_FLAG #endif #ifdef CONFIG_POLL @@ -1461,6 +1465,7 @@ struct k_timer { void *user_data; _OBJECT_TRACING_NEXT_PTR(k_timer) + _OBJECT_TRACING_LINKED_FLAG }; #define Z_TIMER_INITIALIZER(obj, expiry, stop) \ @@ -1837,6 +1842,7 @@ struct k_queue { }; _OBJECT_TRACING_NEXT_PTR(k_queue) + _OBJECT_TRACING_LINKED_FLAG }; #define _K_QUEUE_INITIALIZER(obj) \ @@ -2559,6 +2565,7 @@ struct k_stack { stack_data_t *base, *next, *top; _OBJECT_TRACING_NEXT_PTR(k_stack) + _OBJECT_TRACING_LINKED_FLAG u8_t flags; }; @@ -3214,6 +3221,7 @@ struct k_mutex { int owner_orig_prio; _OBJECT_TRACING_NEXT_PTR(k_mutex) + _OBJECT_TRACING_LINKED_FLAG }; /** @@ -3316,6 +3324,7 @@ struct k_sem { _POLL_EVENT; _OBJECT_TRACING_NEXT_PTR(k_sem) + _OBJECT_TRACING_LINKED_FLAG }; #define Z_SEM_INITIALIZER(obj, initial_count, count_limit) \ @@ -3475,6 +3484,7 @@ struct k_msgq { u32_t used_msgs; _OBJECT_TRACING_NEXT_PTR(k_msgq) + _OBJECT_TRACING_LINKED_FLAG u8_t flags; }; /** @@ -3772,6 +3782,7 @@ struct k_mbox { struct k_spinlock lock; _OBJECT_TRACING_NEXT_PTR(k_mbox) + _OBJECT_TRACING_LINKED_FLAG }; /** * @cond INTERNAL_HIDDEN @@ -3956,6 +3967,7 @@ struct k_pipe { } wait_q; _OBJECT_TRACING_NEXT_PTR(k_pipe) + _OBJECT_TRACING_LINKED_FLAG u8_t flags; /**< Flags */ }; @@ -4133,6 +4145,7 @@ struct k_mem_slab { u32_t num_used; _OBJECT_TRACING_NEXT_PTR(k_mem_slab) + _OBJECT_TRACING_LINKED_FLAG }; #define _K_MEM_SLAB_INITIALIZER(obj, slab_buffer, slab_block_size, \