dbCa CP link updates set PUTF/RPRO
This commit is contained in:

committed by
Andrew Johnson

parent
48ebe2c64e
commit
a4bc0db6e6
@ -115,10 +115,9 @@ static int dbca_chan_count;
|
|||||||
* During link modification or IOC shutdown the pca->plink pointer (guarded by caLink.lock)
|
* During link modification or IOC shutdown the pca->plink pointer (guarded by caLink.lock)
|
||||||
* is used as a flag to indicate that a link is no longer active.
|
* is used as a flag to indicate that a link is no longer active.
|
||||||
*
|
*
|
||||||
* References to the struct caLink are owned by the dbCaTask, and any scanOnceCallback()
|
* References to the struct caLink are owned by the dbCaTask.
|
||||||
* which is in progress.
|
|
||||||
*
|
*
|
||||||
* The libca and scanOnceCallback callbacks take no action if pca->plink==NULL.
|
* The libca callbacks take no action if pca->plink==NULL.
|
||||||
*
|
*
|
||||||
* dbCaPutLinkCallback causes an additional complication because
|
* dbCaPutLinkCallback causes an additional complication because
|
||||||
* when dbCaRemoveLink is called the callback may not have occured.
|
* when dbCaRemoveLink is called the callback may not have occured.
|
||||||
@ -788,38 +787,6 @@ static long doLocked(struct link *plink, dbLinkUserCallback rtn, void *priv)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scanComplete(void *raw, dbCommon *prec)
|
|
||||||
{
|
|
||||||
caLink *pca = raw;
|
|
||||||
epicsMutexMustLock(pca->lock);
|
|
||||||
if(!pca->plink) {
|
|
||||||
/* IOC shutdown or link re-targeted. Do nothing. */
|
|
||||||
} else if(pca->scanningOnce==0) {
|
|
||||||
errlogPrintf("dbCa.c complete callback w/ scanningOnce==0\n");
|
|
||||||
} else if(--pca->scanningOnce){
|
|
||||||
/* another scan is queued */
|
|
||||||
if(scanOnceCallback(prec, scanComplete, raw)) {
|
|
||||||
errlogPrintf("dbCa.c failed to re-queue scanOnce\n");
|
|
||||||
} else
|
|
||||||
caLinkInc(pca);
|
|
||||||
}
|
|
||||||
epicsMutexUnlock(pca->lock);
|
|
||||||
caLinkDec(pca);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* must be called with pca->lock held */
|
|
||||||
static void scanLinkOnce(dbCommon *prec, caLink *pca) {
|
|
||||||
if(pca->scanningOnce==0) {
|
|
||||||
if(scanOnceCallback(prec, scanComplete, pca)) {
|
|
||||||
errlogPrintf("dbCa.c failed to queue scanOnce\n");
|
|
||||||
} else
|
|
||||||
caLinkInc(pca);
|
|
||||||
}
|
|
||||||
if(pca->scanningOnce<5)
|
|
||||||
pca->scanningOnce++;
|
|
||||||
/* else too many scans queued */
|
|
||||||
}
|
|
||||||
|
|
||||||
static lset dbCa_lset = {
|
static lset dbCa_lset = {
|
||||||
0, 1, /* not Constant, Volatile */
|
0, 1, /* not Constant, Volatile */
|
||||||
NULL, dbCaRemoveLink,
|
NULL, dbCaRemoveLink,
|
||||||
@ -856,7 +823,9 @@ static void connectionCallback(struct connection_handler_args arg)
|
|||||||
if (precord &&
|
if (precord &&
|
||||||
((ppv_link->pvlMask & pvlOptCP) ||
|
((ppv_link->pvlMask & pvlOptCP) ||
|
||||||
((ppv_link->pvlMask & pvlOptCPP) && precord->scan == 0)))
|
((ppv_link->pvlMask & pvlOptCPP) && precord->scan == 0)))
|
||||||
scanLinkOnce(precord, pca);
|
{
|
||||||
|
link_action |= CA_DBPROCESS;
|
||||||
|
}
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
pca->hasReadAccess = ca_read_access(arg.chid);
|
pca->hasReadAccess = ca_read_access(arg.chid);
|
||||||
@ -988,7 +957,9 @@ static void eventCallback(struct event_handler_args arg)
|
|||||||
|
|
||||||
if ((ppv_link->pvlMask & pvlOptCP) ||
|
if ((ppv_link->pvlMask & pvlOptCP) ||
|
||||||
((ppv_link->pvlMask & pvlOptCPP) && precord->scan == 0))
|
((ppv_link->pvlMask & pvlOptCPP) && precord->scan == 0))
|
||||||
scanLinkOnce(precord, pca);
|
{
|
||||||
|
addAction(pca, CA_DBPROCESS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
done:
|
done:
|
||||||
epicsMutexUnlock(pca->lock);
|
epicsMutexUnlock(pca->lock);
|
||||||
@ -1061,7 +1032,9 @@ static void accessRightsCallback(struct access_rights_handler_args arg)
|
|||||||
if (precord &&
|
if (precord &&
|
||||||
((ppv_link->pvlMask & pvlOptCP) ||
|
((ppv_link->pvlMask & pvlOptCP) ||
|
||||||
((ppv_link->pvlMask & pvlOptCPP) && precord->scan == 0)))
|
((ppv_link->pvlMask & pvlOptCPP) && precord->scan == 0)))
|
||||||
scanLinkOnce(precord, pca);
|
{
|
||||||
|
addAction(pca, CA_DBPROCESS);
|
||||||
|
}
|
||||||
done:
|
done:
|
||||||
epicsMutexUnlock(pca->lock);
|
epicsMutexUnlock(pca->lock);
|
||||||
}
|
}
|
||||||
@ -1273,6 +1246,13 @@ static void dbCaTask(void *arg)
|
|||||||
printLinks(pca);
|
printLinks(pca);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (link_action & CA_DBPROCESS) {
|
||||||
|
dbCommon *prec;
|
||||||
|
epicsMutexMustLock(pca->lock);
|
||||||
|
prec = pca->plink->precord;
|
||||||
|
epicsMutexUnlock(pca->lock);
|
||||||
|
db_process(prec);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SEVCHK(ca_flush_io(), "dbCaTask");
|
SEVCHK(ca_flush_io(), "dbCaTask");
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#define CA_MONITOR_STRING 0x20
|
#define CA_MONITOR_STRING 0x20
|
||||||
#define CA_GET_ATTRIBUTES 0x40
|
#define CA_GET_ATTRIBUTES 0x40
|
||||||
#define CA_SYNC 0x1000
|
#define CA_SYNC 0x1000
|
||||||
|
#define CA_DBPROCESS 0x2000
|
||||||
/* write type */
|
/* write type */
|
||||||
#define CA_PUT 0x1
|
#define CA_PUT 0x1
|
||||||
#define CA_PUT_CALLBACK 0x2
|
#define CA_PUT_CALLBACK 0x2
|
||||||
|
@ -1042,3 +1042,17 @@ int db_put_process(processNotify *ppn, notifyPutType type,
|
|||||||
ppn->status = notifyError;
|
ppn->status = notifyError;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void db_process(struct dbCommon *prec)
|
||||||
|
{
|
||||||
|
if (prec->pact) {
|
||||||
|
if (dbAccessDebugPUTF && prec->tpro)
|
||||||
|
printf("%s: dbPutField to Active '%s', setting RPRO=1\n",
|
||||||
|
epicsThreadGetNameSelf(), prec->name);
|
||||||
|
prec->rpro = TRUE;
|
||||||
|
} else {
|
||||||
|
/* indicate that dbPutField called dbProcess */
|
||||||
|
prec->putf = TRUE;
|
||||||
|
(void)dbProcess(prec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -22,6 +22,8 @@ extern "C" {
|
|||||||
|
|
||||||
#include "dbCoreAPI.h"
|
#include "dbCoreAPI.h"
|
||||||
|
|
||||||
|
struct dbCommon;
|
||||||
|
|
||||||
DBCORE_API extern struct dbBase *pdbbase;
|
DBCORE_API extern struct dbBase *pdbbase;
|
||||||
DBCORE_API extern volatile int interruptAccept;
|
DBCORE_API extern volatile int interruptAccept;
|
||||||
|
|
||||||
@ -36,7 +38,9 @@ DBCORE_API int dbChannel_put(struct dbChannel *chan, int src_type,
|
|||||||
const void *psrc, long no_elements);
|
const void *psrc, long no_elements);
|
||||||
DBCORE_API int dbChannel_get_count(struct dbChannel *chan,
|
DBCORE_API int dbChannel_get_count(struct dbChannel *chan,
|
||||||
int buffer_type, void *pbuffer, long *nRequest, void *pfl);
|
int buffer_type, void *pbuffer, long *nRequest, void *pfl);
|
||||||
|
#ifdef EPICS_DBCA_PRIVATE_API
|
||||||
|
DBCORE_API void db_process(struct dbCommon *prec);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user