TPRO did not work if dbProcess called recursively by different tasks

This commit is contained in:
Marty Kraimer
2002-04-08 14:46:14 +00:00
parent 195555dc87
commit 31bbf5997a
3 changed files with 21 additions and 18 deletions

View File

@@ -546,12 +546,12 @@ long epicsShareAPI dbProcess(dbCommon *precord)
unsigned char tpro=precord->tpro;
unsigned long lset;
long status = 0;
static char trace=0;
static unsigned long trace_lset=0;
int *ptrace;
int set_trace=FALSE;
dbFldDes *pdbFldDes;
int callNotifyCompletion = FALSE;
ptrace = dbLockSetAddrTrace(precord);
lset = dbLockGetLockId(precord);
/*
* Note that it is likely that if any changes are made
@@ -576,9 +576,8 @@ long epicsShareAPI dbProcess(dbCommon *precord)
/* check for trace processing*/
if (tpro) {
if(trace==0) {
trace = 1;
trace_lset = lset;
if(*ptrace==0) {
*ptrace = 1;
set_trace = TRUE;
}
}
@@ -587,8 +586,7 @@ long epicsShareAPI dbProcess(dbCommon *precord)
if (precord->pact) {
unsigned short monitor_mask;
if (trace && trace_lset==lset)
printf("active: %s\n",precord->name);
if (*ptrace) printf("active: %s\n",precord->name);
/* raise scan alarm after MAX_LOCK times */
if (precord->stat==SCAN_ALARM) goto all_done;
if (precord->lcnt++ !=MAX_LOCK) goto all_done;
@@ -613,9 +611,7 @@ long epicsShareAPI dbProcess(dbCommon *precord)
/* if disabled check disable alarm severity and return success */
if (precord->disa == precord->disv) {
if (trace && trace_lset==lset)
printf("disabled: %s\n",precord->name);
if(*ptrace) printf("disabled: %s\n",precord->name);
/*take care of caching and notifyCompletion*/
precord->rpro = FALSE;
callNotifyCompletion = TRUE;
@@ -641,12 +637,10 @@ long epicsShareAPI dbProcess(dbCommon *precord)
precord->pact=1;/*set pact TRUE so error is issued only once*/
recGblRecordError(S_db_noRSET, (void *)precord, "dbProcess");
status = S_db_noRSET;
if (trace && trace_lset == lset)
printf("failure: %s\n", precord->name);
if (*ptrace) printf("failure: %s\n", precord->name);
goto all_done;
}
if (trace && trace_lset==lset) printf("process: %s\n", precord->name);
if(*ptrace) printf("process: %s\n", precord->name);
/* process record */
status = (*prset->process)(precord);
/* Print record's fields if PRINT_MASK set in breakpoint field */
@@ -654,10 +648,7 @@ long epicsShareAPI dbProcess(dbCommon *precord)
dbPrint(precord);
}
all_done:
if (set_trace) {
trace_lset = 0;
trace = 0;
}
if (set_trace) *ptrace = 0;
if(callNotifyCompletion && precord->ppn) dbNotifyCompletion(precord);
return(status);
}

View File

@@ -105,6 +105,7 @@ typedef struct lockSet {
dbCommon *precord;
int nRecursion;
int nWaiting;
int trace; /*For field TPRO*/
} lockSet;
/* dbCommon.LSET is a plockRecord */
@@ -603,3 +604,11 @@ long epicsShareAPI dbLockShowLocked(int level)
epicsMutexUnlock(lockSetModifyLock);
return(0);
}
int * epicsShareAPI dbLockSetAddrTrace(dbCommon *precord)
{
lockRecord *plockRecord = precord->lset;
lockSet *plockSet = plockRecord->plockSet;
return(&plockSet->trace);
}

View File

@@ -48,6 +48,9 @@ epicsShareFunc long epicsShareAPI dblsr(char *recordname,int level);
epicsShareFunc long epicsShareAPI dbLockShowLocked(int level);
/*KLUDGE to support field TPRO*/
epicsShareFunc int * epicsShareAPI dbLockSetAddrTrace(struct dbCommon *precord);
#ifdef __cplusplus
}
#endif