From 31bbf5997a8c2385d8d0b21ad94a96505ff9c0ea Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Mon, 8 Apr 2002 14:46:14 +0000 Subject: [PATCH] TPRO did not work if dbProcess called recursively by different tasks --- src/db/dbAccess.c | 27 +++++++++------------------ src/db/dbLock.c | 9 +++++++++ src/db/dbLock.h | 3 +++ 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/db/dbAccess.c b/src/db/dbAccess.c index ecac408f1..ef310a0fc 100644 --- a/src/db/dbAccess.c +++ b/src/db/dbAccess.c @@ -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); } diff --git a/src/db/dbLock.c b/src/db/dbLock.c index 84700a5e3..7a784a975 100644 --- a/src/db/dbLock.c +++ b/src/db/dbLock.c @@ -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); +} diff --git a/src/db/dbLock.h b/src/db/dbLock.h index 12d81f2f8..79712efd0 100644 --- a/src/db/dbLock.h +++ b/src/db/dbLock.h @@ -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