From 6c8af3ef7adf8d79983ece0a54d4b9f5fae32e9b Mon Sep 17 00:00:00 2001 From: Liu Xiaodong Date: Thu, 29 Nov 2018 21:37:53 -0500 Subject: [PATCH] lib/trace: group registration check Ensure that no trace point group IDs are ever duplicated. Arrange trace registration in order on tgroup_id. Change-Id: Id72600257780b1ab95b25c85daaa78c392a9479f Signed-off-by: Liu Xiaodong Reviewed-on: https://review.gerrithub.io/435571 Tested-by: SPDK CI Jenkins Chandler-Test-Pool: SPDK Automated Test System Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Darek Stojaczyk --- lib/trace/trace_flags.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/lib/trace/trace_flags.c b/lib/trace/trace_flags.c index 5176465d0..54a40a3b2 100644 --- a/lib/trace/trace_flags.c +++ b/lib/trace/trace_flags.c @@ -178,8 +178,43 @@ spdk_trace_register_description(const char *name, const char *short_name, void spdk_trace_add_register_fn(struct spdk_trace_register_fn *reg_fn) { - reg_fn->next = g_reg_fn_head; - g_reg_fn_head = reg_fn; + struct spdk_trace_register_fn *_reg_fn; + + if (reg_fn->name == NULL) { + SPDK_ERRLOG("missing name for registering spdk trace tpoint group\n"); + assert(false); + return; + } + + /* Ensure that no trace point group IDs and names are ever duplicated */ + for (_reg_fn = g_reg_fn_head; _reg_fn; _reg_fn = _reg_fn->next) { + if (reg_fn->tgroup_id == _reg_fn->tgroup_id) { + SPDK_ERRLOG("duplicate tgroup_id (%d) with %s\n", _reg_fn->tgroup_id, _reg_fn->name); + assert(false); + return; + } + + if (strcmp(reg_fn->name, _reg_fn->name) == 0) { + SPDK_ERRLOG("duplicate name with %s\n", _reg_fn->name); + assert(false); + return; + } + } + + /* Arrange trace registration in order on tgroup_id */ + if (g_reg_fn_head == NULL || reg_fn->tgroup_id < g_reg_fn_head->tgroup_id) { + reg_fn->next = g_reg_fn_head; + g_reg_fn_head = reg_fn; + return; + } + + for (_reg_fn = g_reg_fn_head; _reg_fn; _reg_fn = _reg_fn->next) { + if (_reg_fn->next == NULL || reg_fn->tgroup_id < _reg_fn->next->tgroup_id) { + reg_fn->next = _reg_fn->next; + _reg_fn->next = reg_fn; + return; + } + } } void