From ce2a36c93b0cad07b938ba46771a9e5db05b56f5 Mon Sep 17 00:00:00 2001 From: whoselittlelion Date: Tue, 19 Mar 2024 15:28:04 +0800 Subject: [PATCH] optimize parameter get Signed-off-by: whoselittlelion --- services/param/manager/param_manager.c | 31 +++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/services/param/manager/param_manager.c b/services/param/manager/param_manager.c index dc80f790e..9a39da6e1 100644 --- a/services/param/manager/param_manager.c +++ b/services/param/manager/param_manager.c @@ -83,10 +83,19 @@ static int ProcessParamTraversal(const WorkSpace *workSpace, const ParamTrieNode return 0; } +static bool IsParamFullName(const char *prefix, WorkSpace *workSpace, ParamTrieNode *root) +{ + root = FindTrieNode(workSpace, prefix, strlen(prefix), NULL); + if (root->child == 0) { + return true; + } + return false; +} + int SystemTraversalParameter(const char *prefix, TraversalParamPtr traversalParameter, void *cookie) { + PARAM_CHECK((prefix != NULL && strlen(prefix) != 0), return -1, "invalid prefix"); ParamWorkSpace *paramSpace = GetParamWorkSpace(); - PARAM_CHECK(paramSpace != NULL, return -1, "Invalid paramSpace"); PARAM_WORKSPACE_CHECK(paramSpace, return -1, "Invalid space"); PARAM_CHECK(traversalParameter != NULL, return -1, "The param is null"); @@ -97,22 +106,24 @@ int SystemTraversalParameter(const char *prefix, TraversalParamPtr traversalPara } #endif ParamTraversalContext context = {traversalParameter, cookie, "#"}; - if (!(prefix == NULL || strlen(prefix) == 0)) { - int ret = CheckParamPermission(GetParamSecurityLabel(), prefix, DAC_READ); - PARAM_CHECK(ret == 0, return ret, "Forbid to traversal parameters %s", prefix); - context.prefix = (char *)prefix; + int ret = CheckParamPermission(GetParamSecurityLabel(), prefix, DAC_READ); + PARAM_CHECK(ret == 0, return ret, "Forbid to traversal parameters %s", prefix); + context.prefix = (char *)prefix; + + ParamTrieNode *root = NULL; + WorkSpace *workSpace = GetWorkSpaceByName(prefix); + if (IsParamFullName(prefix, workSpace, root)) { + ProcessParamTraversal(workSpace, root, (const void *)&context); + return 0; } - WorkSpace *workSpace = GetNextWorkSpace(NULL); + workSpace = GetNextWorkSpace(NULL); if (workSpace != NULL && strcmp(workSpace->fileName, WORKSPACE_NAME_DAC) == 0) { workSpace = GetNextWorkSpace(workSpace); } while (workSpace != NULL) { WorkSpace *next = GetNextWorkSpace(workSpace); - ParamTrieNode *root = NULL; - if (prefix != NULL && strlen(prefix) != 0) { - root = FindTrieNode(workSpace, prefix, strlen(prefix), NULL); - } + root = FindTrieNode(workSpace, prefix, strlen(prefix), NULL); PARAMSPACE_AREA_RD_LOCK(workSpace); TraversalTrieNode(workSpace, root, ProcessParamTraversal, (const void *)&context); PARAMSPACE_AREA_RW_UNLOCK(workSpace); -- Gitee