本文整理汇总了C++中dbScanUnlock函数的典型用法代码示例。如果您正苦于以下问题:C++ dbScanUnlock函数的具体用法?C++ dbScanUnlock怎么用?C++ dbScanUnlock使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dbScanUnlock函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: dbNotifyCancel
void dbNotifyCancel(processNotify *ppn)
{
dbCommon *precord = dbChannelRecord(ppn->chan);
notifyState state;
notifyPvt *pnotifyPvt;
dbScanLock(precord);
epicsMutexMustLock(pnotifyGlobal->lock);
ppn->status = notifyCanceled;
pnotifyPvt = (notifyPvt *) ppn->pnotifyPvt;
if (!pnotifyPvt || pnotifyPvt->state == notifyNotActive) {
epicsMutexUnlock(pnotifyGlobal->lock);
dbScanUnlock(precord);
return;
}
state = pnotifyPvt->state;
switch (state) {
case notifyUserCallbackRequested:
case notifyRestartCallbackRequested:
case notifyUserCallbackActive:
/* Callback is scheduled or active, wait for it to complete */
pnotifyPvt->cancelWait = 1;
epicsMutexUnlock(pnotifyGlobal->lock);
dbScanUnlock(precord);
epicsEventWait(pnotifyPvt->cancelEvent);
epicsMutexMustLock(pnotifyGlobal->lock);
notifyCleanup(ppn);
epicsMutexUnlock(pnotifyGlobal->lock);
return;
case notifyNotActive:
break;
case notifyWaitForRestart:
assert(precord->ppn);
assert(precord->ppn!=ppn);
ellSafeDelete(&precord->ppnr->restartList,&ppn->restartNode);
break;
case notifyRestartInProgress:
case notifyProcessInProgress:
{ /*Take all records out of wait list */
processNotifyRecord *ppnrWait;
while ((ppnrWait = (processNotifyRecord *)
ellFirst(&pnotifyPvt->waitList))) {
ellSafeDelete(&pnotifyPvt->waitList, &ppnrWait->waitNode);
restartCheck(ppnrWait);
}
}
if (precord->ppn == ppn)
restartCheck(precord->ppnr);
break;
default:
printf("dbNotify: illegal state for notifyCallback\n");
}
pnotifyPvt->state = notifyNotActive;
notifyCleanup(ppn);
epicsMutexUnlock(pnotifyGlobal->lock);
dbScanUnlock(precord);
}
示例2: asynCallback
static void asynCallback(asynUser *pasynUser)
{
mcaAsynPvt *pPvt = (mcaAsynPvt *)pasynUser->userPvt;
mcaRecord *pmca = pPvt->pmca;
mcaAsynMessage *pmsg = pasynUser->userData;
rset *prset = (rset *)pmca->rset;
int status;
asynPrint(pasynUser, ASYN_TRACE_FLOW,
"devMcaAsyn::asynCallback: %s command=%d, ivalue=%d, dvalue=%f\n",
pmca->name, pmsg->command, pmsg->ivalue, pmsg->dvalue);
pasynUser->reason = pPvt->driverReasons[pmsg->command];
if (pmsg->command == mcaData) {
/* Read data */
pPvt->pasynInt32Array->read(pPvt->asynInt32ArrayPvt, pasynUser,
pPvt->data, pmca->nuse, &pPvt->nread);
dbScanLock((dbCommon *)pmca);
(*prset->process)(pmca);
dbScanUnlock((dbCommon *)pmca);
} else if (pmsg->command == mcaReadStatus) {
/* Read the current status of the device */
pPvt->pasynInt32->write(pPvt->asynInt32Pvt, pasynUser, 0);
pasynUser->reason = pPvt->driverReasons[mcaAcquiring];
pPvt->pasynInt32->read(pPvt->asynInt32Pvt, pasynUser, &pPvt->acquiring);
pasynUser->reason = pPvt->driverReasons[mcaElapsedLiveTime];
pPvt->pasynFloat64->read(pPvt->asynFloat64Pvt, pasynUser,
&pPvt->elapsedLive);
pasynUser->reason = pPvt->driverReasons[mcaElapsedRealTime];
pPvt->pasynFloat64->read(pPvt->asynFloat64Pvt, pasynUser,
&pPvt->elapsedReal);
pasynUser->reason = pPvt->driverReasons[mcaElapsedCounts];
pPvt->pasynFloat64->read(pPvt->asynFloat64Pvt, pasynUser,
&pPvt->totalCounts);
pasynUser->reason = pPvt->driverReasons[mcaDwellTime];
pPvt->pasynFloat64->read(pPvt->asynFloat64Pvt, pasynUser,
&pPvt->dwellTime);
dbScanLock((dbCommon *)pmca);
(*prset->process)(pmca);
dbScanUnlock((dbCommon *)pmca);
} else {
if (pmsg->interface == int32Type) {
pPvt->pasynInt32->write(pPvt->asynInt32Pvt, pasynUser,
pmsg->ivalue);
} else {
pPvt->pasynFloat64->write(pPvt->asynFloat64Pvt, pasynUser,
pmsg->dvalue);
}
}
pasynManager->memFree(pmsg, sizeof(*pmsg));
status = pasynManager->freeAsynUser(pasynUser);
if (status != asynSuccess) {
asynPrint(pasynUser, ASYN_TRACE_ERROR,
"devMcaAsyn::asynCallback: %s error in freeAsynUser, %s\n",
pmca->name, pasynUser->errorMessage);
}
}
示例3: dbNotifyCancel
void epicsShareAPI dbNotifyCancel(putNotify *ppn)
{
dbCommon *precord = ppn->paddr->precord;
putNotifyState state;
putNotifyPvt *pputNotifyPvt;
assert(precord);
dbScanLock(precord);
epicsMutexMustLock(pnotifyGlobal->lock);
pputNotifyPvt = (putNotifyPvt *)ppn->pputNotifyPvt;
if(!pputNotifyPvt || pputNotifyPvt->state==putNotifyNotActive) {
epicsMutexUnlock(pnotifyGlobal->lock);
dbScanUnlock(precord);
return;
}
state = pputNotifyPvt->state;
/*If callback is scheduled or active wait for it to complete*/
if(state==putNotifyUserCallbackRequested
|| state==putNotifyRestartCallbackRequested
|| state==putNotifyUserCallbackActive) {
pputNotifyPvt->cancelWait = 1;
epicsMutexUnlock(pnotifyGlobal->lock);
dbScanUnlock(precord);
epicsEventWait(pputNotifyPvt->cancelEvent);
epicsMutexMustLock(pnotifyGlobal->lock);
putNotifyCleanup(ppn);
epicsMutexUnlock(pnotifyGlobal->lock);
return;
}
switch(state) {
case putNotifyNotActive: break;
case putNotifyWaitForRestart:
assert(precord->ppn);
assert(precord->ppn!=ppn);
ellSafeDelete(&precord->ppnr->restartList,&ppn->restartNode);
break;
case putNotifyRestartInProgress:
case putNotifyPutInProgress:
{ /*Take all records out of wait list */
putNotifyRecord *ppnrWait;
while((ppnrWait = (putNotifyRecord *)ellFirst(&pputNotifyPvt->waitList))){
ellSafeDelete(&pputNotifyPvt->waitList,&ppnrWait->waitNode);
restartCheck(ppnrWait);
}
}
if(precord->ppn==ppn) restartCheck(precord->ppnr);
break;
default:
printf("dbNotify: illegal state for notifyCallback\n");
}
pputNotifyPvt->state = putNotifyNotActive;
putNotifyCleanup(ppn);
epicsMutexUnlock(pnotifyGlobal->lock);
dbScanUnlock(precord);
}
示例4: check_bo_callback
/* Callback for bo, see ao_callback comments */
static void check_bo_callback(void *arg)
{
boRecord *rec = (boRecord *) arg;
struct rset *rset= (struct rset *)(rec->rset);
DevicePrivate *pvt = (DevicePrivate *)rec->dpvt;
unsigned long rval;
eip_bool process = false;
/* We are about the check and even set val, & rval -> lock */
dbScanLock((dbCommon *)rec);
if (rec->pact)
{
(*rset->process) ((dbCommon *)rec);
dbScanUnlock((dbCommon *)rec);
return;
}
/* Check if record's (R)VAL is current */
if (!check_data((dbCommon *) rec))
{
(*rset->process) ((dbCommon *)rec);
dbScanUnlock((dbCommon *)rec);
return;
}
if (get_bits((dbCommon *)rec, 1, &rval) &&
(rec->udf || rec->sevr == INVALID_ALARM || rec->rval != rval))
{
if (rec->tpro)
printf("'%s': got %lu from driver\n", rec->name, rval);
if (!rec->udf && pvt->special & SPCO_FORCE)
{
if (rec->tpro)
printf("'%s': will re-write record's value %u\n",
rec->name, (unsigned int)rec->val);
}
else
{ /* back-convert rval into val */
rec->rval = rval;
rec->val = (rec->rval==0) ? 0 : 1;
rec->udf = false;
if (rec->tpro)
printf("'%s': updated record to tag, val = %u\n",
rec->name, (unsigned int)rec->val);
}
process = true;
}
dbScanUnlock((dbCommon *)rec);
/* Does record need processing and is not periodic? */
if (process && rec->scan < SCAN_1ST_PERIODIC)
scanOnce(rec);
}
示例5: lock
void DbPvPut::get()
{
if(DbPvDebug::getLevel()>0) printf("dbPvPut::get()\n");
{
Lock lock(dataMutex);
dbScanLock(dbChannelRecord(dbPv->getDbChannel()));
bitSet->clear();
Status status = dbUtil->get(
channelPutRequester,
propertyMask,
dbPv->getDbChannel(),
pvStructure,
bitSet,
0);
dbScanUnlock(dbChannelRecord(dbPv->getDbChannel()));
if(firstTime) {
firstTime = false;
bitSet->set(pvStructure->getFieldOffset());
}
}
channelPutRequester->getDone(
status,
getPtrSelf(),
pvStructure,
bitSet);
}
示例6: dbProcessNotify
void DbPvPut::put(PVStructurePtr const &pvStructure, BitSetPtr const & bitSet)
{
if (DbPvDebug::getLevel() > 0) printf("dbPvPut::put()\n");
this->pvStructure = pvStructure;
this->bitSet = bitSet;
if (block && process) {
dbProcessNotify(pNotify.get());
return;
}
Lock lock(dataMutex);
PVFieldPtr pvField = pvStructure.get()->getPVFields()[0];
if (propertyMask & dbUtil->dbPutBit) {
status = dbUtil->putField(
channelPutRequester,
propertyMask,
dbPv->getDbChannel(),
pvField);
} else {
dbScanLock(dbChannelRecord(dbPv->getDbChannel()));
status = dbUtil->put(
channelPutRequester, propertyMask, dbPv->getDbChannel(), pvField);
if (process) dbProcess(dbChannelRecord(dbPv->getDbChannel()));
dbScanUnlock(dbChannelRecord(dbPv->getDbChannel()));
}
lock.unlock();
channelPutRequester->putDone(status, getPtrSelf());
}
示例7: lock
void DbPvPut::put(PVStructurePtr const &pvStructure, BitSetPtr const & bitSet)
{
if(DbPvDebug::getLevel()>0) printf("dbPvPut::put()\n");
Lock lock(dataMutex);
this->pvStructure = pvStructure;
this->bitSet = bitSet;
PVFieldPtr pvField = pvStructure.get()->getPVFields()[0];
if(propertyMask&dbUtil->dbPutBit) {
Status status = dbUtil->putField(
channelPutRequester,propertyMask,dbAddr,pvField);
lock.unlock();
channelPutRequester->putDone(status,getPtrSelf());
return;
}
dbScanLock(dbAddr.precord);
Status status = dbUtil->put(
channelPutRequester, propertyMask, dbAddr, pvField);
if (process && !block) dbProcess(dbAddr.precord);
dbScanUnlock(dbAddr.precord);
lock.unlock();
if (block && process) {
epicsUInt8 value = 1;
pNotify.get()->pbuffer = &value;
dbPutNotify(pNotify.get());
} else {
channelPutRequester->putDone(status, getPtrSelf());
}
}
示例8: myCallback_devBoSyncSoft
static void myCallback_devBoSyncSoft(CALLBACK *p_callback)
{
struct dbCommon *precord;
CONTEXT *p_myContext;
struct rset *prset;
callbackGetUser(precord,p_callback);
#ifdef DEBUG1
printf( __FILE__ "[%d] -> %s (%s)\n", __LINE__, __func__, precord->name );
#endif
p_myContext=(CONTEXT *)precord->dpvt;
prset = (struct rset *)(precord->rset);
dbScanLock(precord);
(*prset->process)(precord);
dbScanUnlock(precord);
#ifdef DEBUG1
printf( __FILE__ "[%d] <- %s\n", __LINE__, __func__ );
#endif
return;
}
示例9: callUser
static void callUser(dbCommon *precord,putNotify *ppn)
{
putNotifyPvt *pputNotifyPvt = (putNotifyPvt *)ppn->pputNotifyPvt;
epicsMutexUnlock(pnotifyGlobal->lock);
dbScanUnlock(precord);
(*ppn->userCallback)(ppn);
epicsMutexMustLock(pnotifyGlobal->lock);
if(pputNotifyPvt->cancelWait && pputNotifyPvt->userCallbackWait) {
errlogPrintf("%s putNotify: both cancelWait and userCallbackWait true."
"This is illegal\n",precord->name);
pputNotifyPvt->cancelWait = pputNotifyPvt->userCallbackWait = 0;
}
if(!pputNotifyPvt->cancelWait && !pputNotifyPvt->userCallbackWait) {
putNotifyCleanup(ppn);
epicsMutexUnlock(pnotifyGlobal->lock);
return;
}
if(pputNotifyPvt->cancelWait) {
pputNotifyPvt->cancelWait = 0;
epicsEventSignal(pputNotifyPvt->cancelEvent);
epicsMutexUnlock(pnotifyGlobal->lock);
return;
}
assert(pputNotifyPvt->userCallbackWait);
pputNotifyPvt->userCallbackWait = 0;
epicsEventSignal(pputNotifyPvt->userCallbackEvent);
epicsMutexUnlock(pnotifyGlobal->lock);
return;
}
示例10: calcThread
static EPICSTHREADFUNC calcThread(void *param)
{
subRecord *precord;
myData *pmyData;
struct rset *prset;
while(epicsMessageQueueReceive(queueId, (void*) &pmyData, sizeof(myData*))) {
precord = pmyData->precord;
prset = (struct rset*) precord->rset;
if(dbSubFinalDebug) {
epicsMessageQueueShow(queueId, 1);
epicsPrintf("Thread %s: Record %s requested thread processing\n",
epicsThreadGetNameSelf(),
precord->name);
}
pmyData->private_counter ++;
dbScanLock((struct dbCommon*) precord);
(*prset->process)(precord);
dbScanUnlock((struct dbCommon*) precord);
}
return 0;
}
示例11: dbtr
long epicsShareAPI dbtr(const char *pname)
{
DBADDR addr;
long status;
struct dbCommon *precord;
if (!pname || !*pname) {
printf("Usage: dbtr \"pv name\"\n");
return 1;
}
if (nameToAddr(pname, &addr))
return -1;
precord = (struct dbCommon*)addr.precord;
if (precord->pact) {
printf("record active\n");
return 1;
}
dbScanLock(precord);
status = dbProcess(precord);
dbScanUnlock(precord);
if (status)
recGblRecordError(status, precord, "dbtr(dbProcess)");
dbpr(pname, 3);
return 0;
}
示例12: interruptCallback
static void interruptCallback(void *drvPvt, asynUser *pasynUser,
epicsInt32 value)
{
devBusyPvt *pPvt = (devBusyPvt *)drvPvt;
busyRecord *pr = (busyRecord *)pPvt->pr;
unsigned short monitor_mask;
dbScanLock((dbCommon *)pr);
asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE,
"%s devAsynBusy::interruptCallback new value=%d\n",
pr->name, value);
/* If the current value of the record is 1 and the new value is 0 then post monitors
* and call recGblFwdLink
* Ignore the callback if pr->pact=1 because a write operation is in progress. */
if ((pr->pact == 0) && (pr->val == 1) && (value == 0)) {
/* If the current value of the record is 1 and the new value is 0 then post monitors
* and call recGblFwdLink */
asynPrint(pPvt->pasynUser, ASYN_TRACEIO_DEVICE,
"%s devAsynBusy::interruptCallback 1 to 0 transition, posting monitors and calling recGblFwdLink\n",
pr->name);
pr->val = value;
monitor_mask = recGblResetAlarms(pr);
/* post events for value change and archive change */
monitor_mask |= (DBE_VALUE | DBE_LOG);
/* update last value monitored */
pr->mlst = pr->val;
/* send out monitors connected to the value field */
if (monitor_mask){
db_post_events(pr,&pr->val,monitor_mask);
}
recGblFwdLink(pr);
}
dbScanUnlock((dbCommon *)pr);
}
示例13: notifyCallback
static void notifyCallback(CALLBACK *pcallback)
{
processNotify *ppn = NULL;
dbCommon *precord;
notifyPvt *pnotifyPvt;
callbackGetUser(ppn,pcallback);
pnotifyPvt = (notifyPvt *) ppn->pnotifyPvt;
precord = dbChannelRecord(ppn->chan);
dbScanLock(precord);
epicsMutexMustLock(pnotifyGlobal->lock);
assert(precord->ppnr);
assert(pnotifyPvt->state == notifyRestartCallbackRequested ||
pnotifyPvt->state == notifyUserCallbackRequested);
assert(ellCount(&pnotifyPvt->waitList) == 0);
if (pnotifyPvt->cancelWait) {
if (pnotifyPvt->state == notifyRestartCallbackRequested) {
restartCheck(precord->ppnr);
}
epicsEventSignal(pnotifyPvt->cancelEvent);
epicsMutexUnlock(pnotifyGlobal->lock);
dbScanUnlock(precord);
return;
}
if(pnotifyPvt->state == notifyRestartCallbackRequested) {
processNotifyCommon(ppn, precord);
return;
}
/* All done. Clean up and call userCallback */
pnotifyPvt->state = notifyUserCallbackActive;
assert(precord->ppn!=ppn);
callDone(precord, ppn);
}
示例14: dbProcessNotify
void dbProcessNotify(processNotify *ppn)
{
struct dbChannel *chan = ppn->chan;
dbCommon *precord = dbChannelRecord(chan);
short dbfType = dbChannelFieldType(chan);
notifyPvt *pnotifyPvt;
/* Must handle DBF_XXXLINKs as special case.
* Only dbPutField will change link fields.
* Also the record is not processed as a result
*/
ppn->status = notifyOK;
ppn->wasProcessed = 0;
if (dbfType>=DBF_INLINK && dbfType<=DBF_FWDLINK) {
if (ppn->requestType == putProcessRequest ||
ppn->requestType == putProcessGetRequest) {
/* Check if puts disabled */
if (precord->disp && (dbChannelField(ppn->chan) != (void *) &precord->disp)) {
ppn->putCallback(ppn, putDisabledType);
} else {
ppn->putCallback(ppn, putFieldType);
}
}
if (ppn->requestType == processGetRequest ||
ppn->requestType == putProcessGetRequest) {
ppn->getCallback(ppn, getFieldType);
}
ppn->doneCallback(ppn);
return;
}
dbScanLock(precord);
epicsMutexMustLock(pnotifyGlobal->lock);
pnotifyPvt = (notifyPvt *) ppn->pnotifyPvt;
if (pnotifyPvt && (pnotifyPvt->magic != MAGIC)) {
printf("dbPutNotify:pnotifyPvt was not initialized\n");
pnotifyPvt = 0;
}
if (pnotifyPvt) {
assert(pnotifyPvt->state == notifyUserCallbackActive);
pnotifyPvt->userCallbackWait = 1;
epicsMutexUnlock(pnotifyGlobal->lock);
dbScanUnlock(precord);
epicsEventWait(pnotifyPvt->userCallbackEvent);
dbScanLock(precord);
epicsMutexMustLock(pnotifyGlobal->lock);
notifyCleanup(ppn);
}
pnotifyPvt = (notifyPvt *) ppn->pnotifyPvt;
assert(!pnotifyPvt);
notifyInit(ppn);
pnotifyPvt = (notifyPvt *) ppn->pnotifyPvt;
if (!precord->ppnr) {
/* make sure record has a processNotifyRecord*/
precord->ppnr = dbCalloc(1, sizeof(processNotifyRecord));
precord->ppnr->precord = precord;
ellInit(&precord->ppnr->restartList);
}
processNotifyCommon(ppn, precord);
}
示例15: callDone
static void callDone(dbCommon *precord, processNotify *ppn)
{
notifyPvt *pnotifyPvt = (notifyPvt *) ppn->pnotifyPvt;
epicsMutexUnlock(pnotifyGlobal->lock);
if (ppn->requestType == processGetRequest ||
ppn->requestType == putProcessGetRequest) {
ppn->getCallback(ppn, getFieldType);
}
dbScanUnlock(precord);
ppn->doneCallback(ppn);
epicsMutexMustLock(pnotifyGlobal->lock);
if (pnotifyPvt->cancelWait && pnotifyPvt->userCallbackWait) {
errlogPrintf("%s processNotify: both cancelWait and userCallbackWait true."
"This is illegal\n", precord->name);
pnotifyPvt->cancelWait = pnotifyPvt->userCallbackWait = 0;
}
if (!pnotifyPvt->cancelWait && !pnotifyPvt->userCallbackWait) {
notifyCleanup(ppn);
epicsMutexUnlock(pnotifyGlobal->lock);
return;
}
if (pnotifyPvt->cancelWait) {
pnotifyPvt->cancelWait = 0;
epicsEventSignal(pnotifyPvt->cancelEvent);
epicsMutexUnlock(pnotifyGlobal->lock);
return;
}
assert(pnotifyPvt->userCallbackWait);
pnotifyPvt->userCallbackWait = 0;
epicsEventSignal(pnotifyPvt->userCallbackEvent);
epicsMutexUnlock(pnotifyGlobal->lock);
return;
}