diff --git a/modules/libcom/src/error/errSymLib.c b/modules/libcom/src/error/errSymLib.c index b220f2bc0..b7ed1dc48 100644 --- a/modules/libcom/src/error/errSymLib.c +++ b/modules/libcom/src/error/errSymLib.c @@ -40,9 +40,8 @@ typedef struct errnumnode { long pad; } ERRNUMNODE; -static ELLLIST errnumlist = ELLLIST_INIT; -static ERRNUMNODE **hashtable; -static int initialized = 0; +static ERRNUMNODE **hashtable = NULL; +#define initialized (hashtable!=NULL) extern ERRSYMTAB_ID errSymTbl; /**************************************************************** @@ -56,9 +55,6 @@ extern ERRSYMTAB_ID errSymTbl; int errSymBld(void) { ERRSYMBOL *errArray = errSymTbl->symbols; - ERRNUMNODE *perrNumNode = NULL; - ERRNUMNODE *pNextNode = NULL; - ERRNUMNODE **phashnode = NULL; int i; int modnum; @@ -79,22 +75,6 @@ int errSymBld(void) continue; } } - perrNumNode = (ERRNUMNODE *) ellFirst(&errnumlist); - while (perrNumNode) { - /* hash each perrNumNode->errNum */ - epicsUInt16 hashInd = errhash(perrNumNode->errNum); - - phashnode = (ERRNUMNODE**)&hashtable[hashInd]; - pNextNode = (ERRNUMNODE*) *phashnode; - /* search for last node (NULL) of hashnode linked list */ - while (pNextNode) { - phashnode = &pNextNode->hashnode; - pNextNode = *phashnode; - } - *phashnode = perrNumNode; - perrNumNode = (ERRNUMNODE *) ellNext((ELLNODE *) perrNumNode); - } - initialized = 1; return(0); } @@ -118,12 +98,32 @@ static epicsUInt16 errhash(long errNum) ***************************************************************/ int errSymbolAdd(long errNum, const char *name) { - ERRNUMNODE *pNew = (ERRNUMNODE*) callocMustSucceed(1, + ERRNUMNODE *perrNumNode; + ERRNUMNODE *pNextNode = NULL; + ERRNUMNODE **phashnode = NULL; + epicsUInt16 hashInd; + + if (!initialized) + errSymBld(); + + perrNumNode = (ERRNUMNODE*) callocMustSucceed(1, sizeof(ERRNUMNODE), "errSymbolAdd"); - pNew->errNum = errNum; - pNew->message = name; - ellAdd(&errnumlist, (ELLNODE*)pNew); + perrNumNode->errNum = errNum; + perrNumNode->message = name; + + /* hash each perrNumNode->errNum */ + hashInd = errhash(perrNumNode->errNum); + phashnode = (ERRNUMNODE**)&hashtable[hashInd]; + pNextNode = (ERRNUMNODE*) *phashnode; + /* search for last node (NULL) of hashnode linked list */ + while (pNextNode) { + phashnode = &pNextNode->hashnode; + pNextNode = *phashnode; + } + *phashnode = perrNumNode; + perrNumNode = (ERRNUMNODE *) ellNext((ELLNODE *) perrNumNode); + return 0; }