extern "C" void verifyTryLockThread ( void *pArg ) { struct verifyTryLock *pVerify = ( struct verifyTryLock * ) pArg; testOk1(epicsMutexTryLock(pVerify->mutex) == epicsMutexLockTimeout); epicsEventSignal ( pVerify->done ); }
int epicsShareAPI dbNotifyDump(void) { epicsMutexLockStatus lockStatus; dbRecordType *pdbRecordType; dbRecordNode *pdbRecordNode; dbCommon *precord; putNotify *ppn; putNotify *ppnRestart; putNotifyRecord *ppnrWait; int itry; for(itry=0; itry<100; itry++) { lockStatus = epicsMutexTryLock(pnotifyGlobal->lock); if(lockStatus==epicsMutexLockOK) break; epicsThreadSleep(.05); } for(pdbRecordType = (dbRecordType *)ellFirst(&pdbbase->recordTypeList); pdbRecordType; pdbRecordType = (dbRecordType *)ellNext(&pdbRecordType->node)) { for (pdbRecordNode=(dbRecordNode *)ellFirst(&pdbRecordType->recList); pdbRecordNode; pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) { putNotifyPvt *pputNotifyPvt; precord = pdbRecordNode->precord; if (!precord->name[0] || pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) continue; if(!precord->ppn) continue; if(!precord->ppnr) continue; if(precord->ppn->paddr->precord != precord) continue; ppn = precord->ppn; pputNotifyPvt = (putNotifyPvt *)ppn->pputNotifyPvt; printf("%s state %d ppn %p\n waitList\n", precord->name,pputNotifyPvt->state,(void*)ppn); ppnrWait = (putNotifyRecord *)ellFirst(&pputNotifyPvt->waitList); while(ppnrWait) { printf(" %s pact %d\n", ppnrWait->precord->name,ppnrWait->precord->pact); ppnrWait = (putNotifyRecord *)ellNext(&ppnrWait->waitNode.node); } printf(" restartList\n"); ppnRestart = (putNotify *)ellFirst(&precord->ppnr->restartList); while(ppnRestart) { printf(" %p\n", (void *)ppnRestart); ppnRestart = (putNotify *)ellNext(&ppnRestart->restartNode.node); } } } if(lockStatus==epicsMutexLockOK) epicsMutexUnlock(pnotifyGlobal->lock); return(0); }
void verifyTryLock () { struct verifyTryLock verify; verify.mutex = epicsMutexMustCreate (); verify.done = epicsEventMustCreate ( epicsEventEmpty ); testOk1(epicsMutexTryLock(verify.mutex) == epicsMutexLockOK); epicsThreadCreate ( "verifyTryLockThread", 40, epicsThreadGetStackSize(epicsThreadStackSmall), verifyTryLockThread, &verify ); testOk1(epicsEventWait ( verify.done ) == epicsEventWaitOK); epicsMutexUnlock ( verify.mutex ); epicsMutexDestroy ( verify.mutex ); epicsEventDestroy ( verify.done ); }
int dbNotifyDump(void) { epicsMutexLockStatus lockStatus; dbRecordType *pdbRecordType; processNotify *ppnRestart; processNotifyRecord *ppnr; int itry; for (itry = 0; itry < 100; itry++) { lockStatus = epicsMutexTryLock(pnotifyGlobal->lock); if (lockStatus == epicsMutexLockOK) break; epicsThreadSleep(.05); } for (pdbRecordType = (dbRecordType *) ellFirst(&pdbbase->recordTypeList); pdbRecordType; pdbRecordType = (dbRecordType *) ellNext(&pdbRecordType->node)) { dbRecordNode *pdbRecordNode; for (pdbRecordNode = (dbRecordNode *) ellFirst(&pdbRecordType->recList); pdbRecordNode; pdbRecordNode = (dbRecordNode *) ellNext(&pdbRecordNode->node)) { dbCommon *precord = pdbRecordNode->precord; processNotify *ppn; notifyPvt *pnotifyPvt; if (!precord->name[0] || pdbRecordNode->flags & DBRN_FLAGS_ISALIAS) continue; ppn = precord->ppn; if (!ppn || !precord->ppnr) continue; if (dbChannelRecord(precord->ppn->chan) != precord) continue; pnotifyPvt = (notifyPvt *) ppn->pnotifyPvt; printf("%s state %d ppn %p\n waitList\n", precord->name, pnotifyPvt->state, (void*) ppn); ppnr = (processNotifyRecord *) ellFirst(&pnotifyPvt->waitList); while (ppnr) { printf(" %s pact %d\n", ppnr->precord->name, ppnr->precord->pact); ppnr = (processNotifyRecord *) ellNext(&ppnr->waitNode.node); } ppnr = precord->ppnr; if (ppnr) { ppnRestart = (processNotify *)ellFirst( &precord->ppnr->restartList); if (ppnRestart) printf("%s restartList\n", precord->name); while (ppnRestart) { printf(" %s\n", dbChannelRecord(ppnRestart->chan)->name); ppnRestart = (processNotify *) ellNext( &ppnRestart->restartNode.node); } } } } if (lockStatus == epicsMutexLockOK) epicsMutexUnlock(pnotifyGlobal->lock); return 0; }