allow to add new error symbols from dynamicly loaded modules

This commit is contained in:
2019-10-24 16:24:50 +02:00
parent 7e991c3f9f
commit 15364e8b91
+26 -26
View File
@@ -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;
}