asLib_lex.l changed to allow more characters(like dbLoadxxx)

Fixed bug that could cause deadlock when an ASG field is changed at run time.
This commit is contained in:
Marty Kraimer
1998-05-20 20:59:13 +00:00
parent 79e96213e0
commit 07362375e4
3 changed files with 53 additions and 50 deletions

View File

@@ -16,7 +16,7 @@ static ASGRULE *yyAsgRule=NULL;
%token tokenUAG tokenHAG tokenASG tokenRULE tokenCALC
%token <Str> tokenINP
%token <Int> tokenINTEGER
%token <Str> tokenNAME tokenPVNAME tokenSTRING
%token <Str> tokenNAME tokenSTRING
%union
{
@@ -126,7 +126,7 @@ inp_config: tokenINP '(' inp_body ')'
}
;
inp_body: tokenNAME | tokenPVNAME
inp_body: tokenNAME
;
rule_config: tokenRULE rule_head rule_body

View File

@@ -38,14 +38,14 @@ of this distribution.
#include <ellLib.h>
#ifdef vxWorks
#include <fast_lock.h>
static FAST_LOCK asLock;
#include <semLib.h>
static SEM_ID asLock;
#define LOCK semTake(asLock,WAIT_FOREVER)
#define UNLOCK semGive(asLock);
#else
/*This only works in a single threaded environment */
#define FAST_LOCK int
#define FASTLOCKINIT(PFAST_LOCK)
#define FASTLOCK(PFAST_LOCK)
#define FASTUNLOCK(PFAST_LOCK)
#define LOCK
#define UNLOCK
#endif
#define epicsExportSharedSymbols
@@ -105,10 +105,16 @@ long epicsShareAPI asInitialize(ASINPUTFUNCPTR inputfunction)
HAGNAME *phagname;
if(asLockInit) {
FASTLOCKINIT(&asLock);
#ifdef vxWorks
asLock = semMCreate(SEM_DELETE_SAFE|SEM_INVERSION_SAFE|SEM_Q_PRIORITY);
if(!asLock) {
errMessage(0,"asInitialize semMCreate failed\n");
exit(-1);
}
#endif
asLockInit = FALSE;
}
FASTLOCK(&asLock);
LOCK;
pasbasenew = asCalloc(1,sizeof(ASBASE));
if(!freeListPvt) freeListInitPvt(&freeListPvt,sizeof(ASGCLIENT),20);
ellInit(&pasbasenew->uagList);
@@ -119,7 +125,7 @@ long epicsShareAPI asInitialize(ASINPUTFUNCPTR inputfunction)
if(status) {
status = S_asLib_badConfig;
/*Not safe to call asFreeAll */
FASTUNLOCK(&asLock);
UNLOCK;
return(status);
}
pasg = (ASG *)ellFirst(&pasbasenew->asgList);
@@ -176,7 +182,7 @@ long epicsShareAPI asInitialize(ASINPUTFUNCPTR inputfunction)
asFreeAll(pasbaseold);
}
asActive = TRUE;
FASTUNLOCK(&asLock);
UNLOCK;
return(0);
}
@@ -274,9 +280,9 @@ long epicsShareAPI asAddMember(ASMEMBERPVT *pasMemberPvt,char *asgName)
long status;
if(!asActive) return(S_asLib_asNotActive);
FASTLOCK(&asLock);
LOCK;
status = asAddMemberPvt(pasMemberPvt,asgName);
FASTUNLOCK(&asLock);
UNLOCK;
return(status);
}
@@ -287,18 +293,18 @@ long epicsShareAPI asRemoveMember(ASMEMBERPVT *asMemberPvt)
if(!asActive) return(S_asLib_asNotActive);
pasgmember = *asMemberPvt;
if(!pasgmember) return(S_asLib_badMember);
FASTLOCK(&asLock);
LOCK;
if(ellCount(&pasgmember->clientList)>0) return(S_asLib_clientsExist);
if(pasgmember->pasg) {
ellDelete(&pasgmember->pasg->memberList,(ELLNODE *)pasgmember);
} else {
errMessage(-1,"Logic error in asRemoveMember");
FASTUNLOCK(&asLock);
UNLOCK;
exit(-1);
}
free((void *)pasgmember);
*asMemberPvt = NULL;
FASTUNLOCK(&asLock);
UNLOCK;
return(0);
}
@@ -310,16 +316,16 @@ long epicsShareAPI asChangeGroup(ASMEMBERPVT *asMemberPvt,char *newAsgName)
if(!asActive) return(S_asLib_asNotActive);
pasgmember = *asMemberPvt;
if(!pasgmember) return(S_asLib_badMember);
FASTLOCK(&asLock);
LOCK;
if(pasgmember->pasg) {
ellDelete(&pasgmember->pasg->memberList,(ELLNODE *)pasgmember);
} else {
errMessage(-1,"Logic error in asChangeGroup");
FASTUNLOCK(&asLock);
UNLOCK;
exit(-1);
}
status = asAddMember(asMemberPvt,newAsgName);
FASTUNLOCK(&asLock);
status = asAddMemberPvt(asMemberPvt,newAsgName);
UNLOCK;
return(status);
}
@@ -358,10 +364,10 @@ long epicsShareAPI asAddClient(ASCLIENTPVT *pasClientPvt,ASMEMBERPVT asMemberPvt
pasgclient->level = asl;
pasgclient->user = user;
pasgclient->host = host;
FASTLOCK(&asLock);
LOCK;
ellAdd(&pasgmember->clientList,(ELLNODE *)pasgclient);
status = asComputePvt(pasgclient);
FASTUNLOCK(&asLock);
UNLOCK;
return(status);
}
@@ -372,12 +378,12 @@ long epicsShareAPI asChangeClient(ASCLIENTPVT asClientPvt,int asl,char *user,cha
if(!asActive) return(S_asLib_asNotActive);
if(!pasgclient) return(S_asLib_badClient);
FASTLOCK(&asLock);
LOCK;
pasgclient->level = asl;
pasgclient->user = user;
pasgclient->host = host;
status = asComputePvt(pasgclient);
FASTUNLOCK(&asLock);
UNLOCK;
return(status);
}
@@ -388,15 +394,15 @@ long epicsShareAPI asRemoveClient(ASCLIENTPVT *asClientPvt)
if(!asActive) return(S_asLib_asNotActive);
if(!pasgclient) return(S_asLib_badClient);
FASTLOCK(&asLock);
LOCK;
pasgMember = pasgclient->pasgMember;
if(!pasgMember) {
errMessage(-1,"asRemoveClient: No ASGMEMBER");
FASTUNLOCK(&asLock);
UNLOCK;
return(-1);
}
ellDelete(&pasgMember->clientList,(ELLNODE *)pasgclient);
FASTUNLOCK(&asLock);
UNLOCK;
freeListFree(freeListPvt,pasgclient);
*asClientPvt = NULL;
return(0);
@@ -409,10 +415,10 @@ long epicsShareAPI asRegisterClientCallback(ASCLIENTPVT asClientPvt,
if(!asActive) return(S_asLib_asNotActive);
if(!pasgclient) return(S_asLib_badClient);
FASTLOCK(&asLock);
LOCK;
pasgclient->pcallback = pcallback;
(*pasgclient->pcallback)(pasgclient,asClientCOAR);
FASTUNLOCK(&asLock);
UNLOCK;
return(0);
}
@@ -430,9 +436,9 @@ void epicsShareAPI asPutClientPvt(ASCLIENTPVT asClientPvt,void *userPvt)
ASGCLIENT *pasgclient = asClientPvt;
if(!asActive) return;
if(!pasgclient) return;
FASTLOCK(&asLock);
LOCK;
pasgclient->userPvt = userPvt;
FASTUNLOCK(&asLock);
UNLOCK;
}
long epicsShareAPI asComputeAllAsg(void)
@@ -440,9 +446,9 @@ long epicsShareAPI asComputeAllAsg(void)
long status;
if(!asActive) return(S_asLib_asNotActive);
FASTLOCK(&asLock);
LOCK;
status = asComputeAllAsgPvt();
FASTUNLOCK(&asLock);
UNLOCK;
return(status);
}
@@ -451,9 +457,9 @@ long epicsShareAPI asComputeAsg(ASG *pasg)
long status;
if(!asActive) return(S_asLib_asNotActive);
FASTLOCK(&asLock);
LOCK;
status = asComputeAsgPvt(pasg);
FASTUNLOCK(&asLock);
UNLOCK;
return(status);
}
@@ -462,9 +468,9 @@ long epicsShareAPI asCompute(ASCLIENTPVT asClientPvt)
long status;
if(!asActive) return(S_asLib_asNotActive);
FASTLOCK(&asLock);
LOCK;
status = asComputePvt(asClientPvt);
FASTUNLOCK(&asLock);
UNLOCK;
return(status);
}
@@ -818,17 +824,21 @@ static long asAddMemberPvt(ASMEMBERPVT *pasMemberPvt,char *asgName)
ASGMEMBER *pasgmember;
ASG *pgroup;
ASGCLIENT *pasgclient;
size_t len;
if(*pasMemberPvt) {
pasgmember = *pasMemberPvt;
free((void *)pasgmember->asgName);
} else {
pasgmember = asCalloc(1,sizeof(ASGMEMBER));
ellInit(&pasgmember->clientList);
*pasMemberPvt = pasgmember;
}
pasgmember->asgName = asgName;
len = (asgName ? (strlen(asgName)+1) : 1);
pasgmember->asgName = asCalloc(len,sizeof(char));
if(asgName) strcpy(pasgmember->asgName,asgName);
pgroup = (ASG *)ellFirst(&pasbase->asgList);
while(pgroup) {
if(strlen(pasgmember->asgName)>0) while(pgroup) {
if(strcmp(pgroup->name,pasgmember->asgName)==0) goto got_it;
pgroup = (ASG *)ellNext((ELLNODE *)pgroup);
}

View File

@@ -1,6 +1,5 @@
integer [0-9]
name [a-zA-Z0-9_\.]
pvname [a-zA-Z0-9_\-:\.\[\]<>;]
name [a-zA-Z0-9_\-:\.\[\]<>;]
notquote [^\"]
escapequote \\\"
string {notquote}|{escapequote}
@@ -37,19 +36,13 @@ INP[A-L] {/* If A-L is changed then ASMAXINP must also be changed*/
return(tokenINTEGER);
}
{name}+ {
{name}+ { /*unquoted string*/
yylval.Str=(char *)asCalloc(1,strlen(yytext)+1);
strcpy(yylval.Str,yytext);
return(tokenNAME);
}
{pvname}+ {
yylval.Str=(char *)asCalloc(1,strlen(yytext)+1);
strcpy(yylval.Str,yytext);
return(tokenPVNAME);
}
\"{string}*\" {
\"{string}*\" { /*quoted string*/
yylval.Str=(char *)asCalloc(1,strlen(yytext)+1);
/* making sure that neither double quote gets passed back */
strcpy(yylval.Str,yytext+1);