Coverity bug fixes
[keystone-rtos/rm-lld.git] / src / rm_nameserver.c
1 /**
2  *   @file  rm_nameserver.c
3  *
4  *   @brief   
5  *      Resource Manager NameServer source.
6  *
7  *  \par
8  *  ============================================================================
9  *  @n   (C) Copyright 2012-2013, Texas Instruments, Inc.
10  * 
11  *  Redistribution and use in source and binary forms, with or without 
12  *  modification, are permitted provided that the following conditions 
13  *  are met:
14  *
15  *    Redistributions of source code must retain the above copyright 
16  *    notice, this list of conditions and the following disclaimer.
17  *
18  *    Redistributions in binary form must reproduce the above copyright
19  *    notice, this list of conditions and the following disclaimer in the 
20  *    documentation and/or other materials provided with the   
21  *    distribution.
22  *
23  *    Neither the name of Texas Instruments Incorporated nor the names of
24  *    its contributors may be used to endorse or promote products derived
25  *    from this software without specific prior written permission.
26  *
27  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
28  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
29  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
31  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
32  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
33  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
36  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
37  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  *
39  *  \par
40 */
42 /* RM external API includes */
43 #include <ti/drv/rm/rm.h>
45 /* RM internal API includes */
46 #include <ti/drv/rm/include/rm_internal.h>
47 #include <ti/drv/rm/include/rm_loc.h>
48 #include <ti/drv/rm/include/rm_nameserverloc.h>
49 #include <ti/drv/rm/include/rm_treeloc.h>
51 /* Tree algorithm includes */
52 #include <ti/drv/rm/util/tree.h>
54 /* RM OSAL layer */
55 #include <rm_osal.h>
57 /**********************************************************************
58  ******************* Internal NameServer APIs *************************
59  **********************************************************************/
61 /* FUNCTION PURPOSE: Adds an object to the NameServer
62  ***********************************************************************
63  * DESCRIPTION: Adds an object mapping a name to a resource to
64  *              the NameServer tree.
65  */
66 int32_t rmNameServerAddObject(Rm_NameServerObjCfg *objCfg)
67 {
68     Rm_NameServerNode *newNode = NULL;
69     int32_t            retVal = RM_SERVICE_APPROVED;
70     
71     if (newNode = rmNameServerNodeNew(&objCfg->nodeCfg)) {
72         if (RB_INSERT(_Rm_NameServerTree, objCfg->nameServerTree, newNode)) {
73             /* Collision */
74             rmNameServerNodeFree(newNode);
75             retVal = RM_SERVICE_DENIED_NAME_EXISTS_IN_NS;
76         }
77     }
78     else {
79         retVal = RM_ERROR_NAMESERVER_NAME_ADD_FAILED;
80     }
81     
82     return(retVal);
83 }
85 /* FUNCTION PURPOSE: Finds a NameServer object based on the name
86  ***********************************************************************
87  * DESCRIPTION: Finds the NameServer node with the name specified
88  *              in the objCfg structure and returns the resource
89  *              values mapped to the name via the objCfg structure
90  */
91 int32_t rmNameServerFindObject(Rm_NameServerObjCfg *objCfg)
92 {
93     Rm_NameServerNode  findNode;
94     Rm_NameServerNode *matchingNode;
95     int32_t            retVal = RM_ERROR_NAMESERVER_NAME_DOES_NOT_EXIST;
97     memset((void *)&findNode, 0, sizeof(Rm_NameServerNode));
98     rm_strncpy(findNode.objName, objCfg->nodeCfg.objName, RM_NAME_MAX_CHARS);
99     
100     if (matchingNode = RB_FIND(_Rm_NameServerTree, objCfg->nameServerTree, &findNode)) {
101         /* Found in NameServer */
102         objCfg->nodeCfg.resourceName = matchingNode->resourceName;
103         objCfg->nodeCfg.resourceBase = matchingNode->resourceBase;
104         objCfg->nodeCfg.resourceLength = matchingNode->resourceLength;
106         retVal = RM_SERVICE_PROCESSING;
107     }    
108     return(retVal);
111 /* FUNCTION PURPOSE: Deletes an object from the NameServer
112  ***********************************************************************
113  * DESCRIPTION: Deletes the object with the name defined in the
114  *              objCfg structure from the NameServer tree.  Frees the
115  *              memory associated with the NameServer node
116  */
117 int32_t rmNameServerDeleteObject(Rm_NameServerObjCfg *objCfg)
118 {   
119     Rm_NameServerNode  findNode;
120     Rm_NameServerNode *matchingNode;
121     int32_t            retVal = RM_ERROR_NAMESERVER_NAME_DOES_NOT_EXIST;    
123     memset((void *)&findNode, 0, sizeof(Rm_NameServerNode));
124     rm_strncpy(findNode.objName, objCfg->nodeCfg.objName, RM_NAME_MAX_CHARS);
125     
126     if (matchingNode = RB_FIND(_Rm_NameServerTree, objCfg->nameServerTree, &findNode)) {
127         /* Remove from NameServer */
128         RB_REMOVE(_Rm_NameServerTree, objCfg->nameServerTree, matchingNode);
129         rmNameServerNodeFree(matchingNode);
130         
131         retVal = RM_SERVICE_APPROVED;
132     }    
133     return(retVal);
136 /* FUNCTION PURPOSE: Prints the NameServer objects
137  ***********************************************************************
138  * DESCRIPTION: Prints the names and the resources they're mapped
139  *              to for all objects stored in the NameServer tree.
140  */
141 void rmNameServerPrintObjects(Rm_Handle rmHandle)
143     Rm_Inst           *rmInst = (Rm_Inst *)rmHandle;
144     Rm_NameServerTree *root = rmInst->u.server.nameServer;
145     Rm_NameServerNode *node;
147     if (rmInst->instType == Rm_instType_SHARED_SERVER) {
148         rmNameServerTreeInv(root);
149     }
150     RB_FOREACH(node, _Rm_NameServerTree, root) {
151         Rm_osalLog("Name: %s resourceName: %s base: %d length: %d\n", node->objName, node->resourceName,
152                                                                       node->resourceBase, node->resourceLength);
153     }
156 /* FUNCTION PURPOSE: Initializes the NameServer tree
157  ***********************************************************************
158  * DESCRIPTION: Creates and initializes the NameServer tree
159  *              root entry.
160  */
161 void rmNameServerInit(Rm_Handle rmHandle)
163     Rm_Inst           *rmInst = (Rm_Inst *)rmHandle;
164     Rm_NameServerTree *rootEntry = NULL;
166     rootEntry = Rm_osalMalloc(sizeof(Rm_NameServerTree));
167     RB_INIT(rootEntry);
168     RM_SS_OBJ_WB(rootEntry, Rm_NameServerTree);
169     rmInst->u.server.nameServer = rootEntry;
172 /* FUNCTION PURPOSE: Deletes the NameServer tree
173  ***********************************************************************
174  * DESCRIPTION: Removes all objects from the NameServer tree
175  *              and deletes the NameServer tree root node.
176  */
177 void rmNameServerDelete(Rm_Handle rmHandle)
179     Rm_Inst             *rmInst = (Rm_Inst *)rmHandle;
180     Rm_NameServerTree   *treeRoot = rmInst->u.server.nameServer;
181     Rm_NameServerNode   *node;
182     Rm_NameServerNode   *nextNode;
183     Rm_NameServerObjCfg  objCfg;
185     if (treeRoot) {
186         if (rmInst->instType == Rm_instType_SHARED_SERVER) {
187             rmNameServerTreeInv(treeRoot);
188         }
189         
190         for (node = RB_MIN(_Rm_NameServerTree, treeRoot); node != NULL; node = nextNode) {
191             nextNode = RB_NEXT(_Rm_NameServerTree, treeRoot, node);
192             objCfg.nameServerTree = treeRoot;
193             objCfg.nodeCfg.objName = node->objName;
194             rmNameServerDeleteObject(&objCfg);
195         }
197         /* Don't need to writeback tree node changes since NameServer will be made
198          * NULL in instance */
199          
200         if (RB_MIN(_Rm_NameServerTree, treeRoot) == NULL) {
201             Rm_osalFree((void *)treeRoot, sizeof(Rm_NameServerTree));
202         }
203         rmInst->u.server.nameServer = NULL;
204     }