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()); } }
static void tpnThread(void *pvt) { tpnInfo *ptpnInfo = (tpnInfo *)pvt; putNotify *ppn = (putNotify *)ptpnInfo->ppn; dbPutNotify(ppn); epicsEventWait(ptpnInfo->callbackDone); dbNotifyCancel(ppn); epicsEventDestroy(ptpnInfo->callbackDone); free((void *)ppn->paddr); free(ppn); free(ptpnInfo); }