TPRO did not work if dbProcess called recursively by different tasks
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user