static void scanList(scan_list *psl) { /* When reading this code remember that the call to dbProcess can result * in the SCAN field being changed in an arbitrary number of records. */ scan_element *pse; scan_element *prev = NULL; scan_element *next = NULL; epicsMutexMustLock(psl->lock); psl->modified = FALSE; pse = (scan_element *)ellFirst(&psl->list); if (pse) next = (scan_element *)ellNext(&pse->node); epicsMutexUnlock(psl->lock); while (pse) { struct dbCommon *precord = pse->precord; dbScanLock(precord); dbProcess(precord); dbScanUnlock(precord); epicsMutexMustLock(psl->lock); if (!psl->modified) { prev = pse; pse = (scan_element *)ellNext(&pse->node); if (pse) next = (scan_element *)ellNext(&pse->node); } else if (pse->pscan_list == psl) { /*This scan element is still in same scan list*/ prev = pse; pse = (scan_element *)ellNext(&pse->node); if (pse) next = (scan_element *)ellNext(&pse->node); psl->modified = FALSE; } else if (prev && prev->pscan_list == psl) { /*Previous scan element is still in same scan list*/ pse = (scan_element *)ellNext(&prev->node); if (pse) { prev = (scan_element *)ellPrevious(&pse->node); next = (scan_element *)ellNext(&pse->node); } psl->modified = FALSE; } else if (next && next->pscan_list == psl) { /*Next scan element is still in same scan list*/ pse = next; prev = (scan_element *)ellPrevious(&pse->node); next = (scan_element *)ellNext(&pse->node); psl->modified = FALSE; } else { /*Too many changes. Just wait till next period*/ epicsMutexUnlock(psl->lock); return; } epicsMutexUnlock(psl->lock); } }
/* * devInsertAddress() */ static void devInsertAddress( ELLLIST *pRangeList, rangeItem *pNewRange) { rangeItem *pBefore; rangeItem *pAfter; epicsMutexMustLock(addrListLock); pAfter = (rangeItem *) ellFirst (pRangeList); while (pAfter) { if (pNewRange->end < pAfter->begin) { break; } pAfter = (rangeItem *) ellNext (&pAfter->node); } if (pAfter) { pBefore = (rangeItem *) ellPrevious (&pAfter->node); ellInsert (pRangeList, &pBefore->node, &pNewRange->node); } else { ellAdd (pRangeList, &pNewRange->node); } epicsMutexUnlock(addrListLock); }
/* * devCombineAdjacentBlocks() */ static long devCombineAdjacentBlocks( ELLLIST *pRangeList, rangeItem *pRange) { rangeItem *pBefore; rangeItem *pAfter; pBefore = (rangeItem *) ellPrevious (&pRange->node); pAfter = (rangeItem *) ellNext (&pRange->node); /* * combine adjacent blocks */ if (pBefore) { if (pBefore->end == pRange->begin-1) { epicsMutexMustLock(addrListLock); pRange->begin = pBefore->begin; ellDelete (pRangeList, &pBefore->node); epicsMutexUnlock(addrListLock); free ((void *)pBefore); } } if (pAfter) { if (pAfter->begin == pRange->end+1) { epicsMutexMustLock(addrListLock); pRange->end = pAfter->end; ellDelete (pRangeList, &pAfter->node); epicsMutexUnlock(addrListLock); free((void *)pAfter); } } return SUCCESS; }
static void dbIncludePrint(void) { inputFile *pinputFile = pinputFileNow; while (pinputFile) { epicsPrintf(" in"); if (pinputFile->path) epicsPrintf(" path \"%s\" ",pinputFile->path); if (pinputFile->filename) { epicsPrintf(" file \"%s\"",pinputFile->filename); } else { epicsPrintf(" standard input"); } epicsPrintf(" line %d\n",pinputFile->line_num); pinputFile = (inputFile *)ellPrevious(&pinputFile->node); } return; }
static void insertProvider(gtProvider *ptp, ELLLIST *plist, epicsMutexId lock) { gtProvider *ptpref; epicsMutexMustLock(lock); for (ptpref = (gtProvider *)ellFirst(plist); ptpref; ptpref = (gtProvider *)ellNext(&ptpref->node)) { if (ptpref->priority > ptp->priority) break; } if (ptpref) { /* Found a provider below the new one */ ptpref = (gtProvider *)ellPrevious(&ptpref->node); ellInsert(plist, &ptpref->node, &ptp->node); } else { ellAdd(plist, &ptp->node); } epicsMutexUnlock(lock); }
static int Is_All_Slave_DAQ_STOPED() { int cnt = 0; int brd_cnt=0; ST_MASTER *pMaster = get_master(); ST_STD_device*pSTDdev = (ST_STD_device*) ellLast(pMaster->pList_DeviceTask); while(pSTDdev) { if( drvACQ196_is_Master(pSTDdev) == WR_ERROR ) { if( !(pSTDdev->StatusDev & TASK_IN_PROGRESS) ) { /* printf("%s daq stoped!\n", pSTDdev->taskName ); */ cnt++; } brd_cnt++; /* printf("cnt: %d, brd_cnt: %d\n", cnt, brd_cnt); */ } pSTDdev = (ST_STD_device*) ellPrevious(&pSTDdev->node); } if( cnt == brd_cnt ) return WR_OK; /* 1*/ return WR_ERROR; /* 0 */ }
static void dbMenuBody(void) { dbMenu *pnewMenu; dbMenu *pMenu; int nChoice; int i; GPHENTRY *pgphentry; if(duplicate) { duplicate = FALSE; return; } pnewMenu = (dbMenu *)popFirstTemp(); pnewMenu->nChoice = nChoice = ellCount(&tempList)/2; pnewMenu->papChoiceName = dbCalloc(pnewMenu->nChoice,sizeof(char *)); pnewMenu->papChoiceValue = dbCalloc(pnewMenu->nChoice,sizeof(char *)); for(i=0; i<nChoice; i++) { pnewMenu->papChoiceName[i] = (char *)popFirstTemp(); pnewMenu->papChoiceValue[i] = (char *)popFirstTemp(); } if(ellCount(&tempList)) yyerrorAbort("dbMenuBody: tempList not empty"); /* Add menu in sorted order */ pMenu = (dbMenu *)ellFirst(&pdbbase->menuList); while(pMenu && strcmp(pMenu->name,pnewMenu->name) >0 ) pMenu = (dbMenu *)ellNext(&pMenu->node); if(pMenu) ellInsert(&pdbbase->menuList,ellPrevious(&pMenu->node),&pnewMenu->node); else ellAdd(&pdbbase->menuList,&pnewMenu->node); pgphentry = gphAdd(pdbbase->pgpHash,pnewMenu->name,&pdbbase->menuList); if(!pgphentry) { yyerrorAbort("gphAdd failed"); } else { pgphentry->userPvt = pnewMenu; } }
static void addToList(struct dbCommon *precord, scan_list *psl) { scan_element *pse, *ptemp; epicsMutexMustLock(psl->lock); pse = precord->spvt; if (pse == NULL) { pse = dbCalloc(1, sizeof(scan_element)); precord->spvt = pse; pse->precord = precord; } pse->pscan_list = psl; ptemp = (scan_element *)ellFirst(&psl->list); while (ptemp) { if (ptemp->precord->phas > precord->phas) { ellInsert(&psl->list, ellPrevious(&ptemp->node), &pse->node); break; } ptemp = (scan_element *)ellNext(&ptemp->node); } if (ptemp == NULL) ellAdd(&psl->list, (void *)pse); psl->modified = TRUE; epicsMutexUnlock(psl->lock); }
static void dbBreakBody(void) { brkTable *pnewbrkTable; brkInt *paBrkInt; brkTable *pbrkTable; int number, down=0; int i; GPHENTRY *pgphentry; if (duplicate) { duplicate = FALSE; return; } pnewbrkTable = (brkTable *)popFirstTemp(); number = ellCount(&tempList); if (number % 2) { yyerrorAbort("breaktable: Raw value missing"); return; } number /= 2; if (number < 2) { yyerrorAbort("breaktable: Must have at least two points!"); return; } pnewbrkTable->number = number; pnewbrkTable->paBrkInt = paBrkInt = dbCalloc(number, sizeof(brkInt)); for (i=0; i<number; i++) { char *str; str = (char *)popFirstTemp(); epicsScanDouble(str, &paBrkInt[i].raw); free(str); str = (char *)popFirstTemp(); epicsScanDouble(str, &paBrkInt[i].eng); free(str); } /* Compute slopes */ for (i=0; i<number-1; i++) { double slope = (paBrkInt[i+1].eng - paBrkInt[i].eng)/ (paBrkInt[i+1].raw - paBrkInt[i].raw); if (!dbBptNotMonotonic && slope == 0) { yyerrorAbort("breaktable slope is zero"); return; } if (i == 0) { down = (slope < 0); } else if (!dbBptNotMonotonic && down != (slope < 0)) { yyerrorAbort("breaktable slope changes sign"); return; } paBrkInt[i].slope = slope; } /* Continue with last slope beyond the final point */ paBrkInt[number-1].slope = paBrkInt[number-2].slope; /* Add brkTable in sorted order */ pbrkTable = (brkTable *)ellFirst(&pdbbase->bptList); while (pbrkTable) { if (strcmp(pbrkTable->name, pnewbrkTable->name) > 0) { ellInsert(&pdbbase->bptList, ellPrevious((ELLNODE *)pbrkTable), (ELLNODE *)pnewbrkTable); break; } pbrkTable = (brkTable *)ellNext(&pbrkTable->node); } if (!pbrkTable) ellAdd(&pdbbase->bptList, &pnewbrkTable->node); pgphentry = gphAdd(pdbbase->pgpHash,pnewbrkTable->name,&pdbbase->bptList); if (!pgphentry) { yyerrorAbort("dbBreakBody: gphAdd failed"); return; } pgphentry->userPvt = pnewbrkTable; }