Cost MoveImpl::cost() { if (!m_isCalculated) { m_isCalculated = true; beforeCalc(); m_cost = calc(); afterCalc(); } return m_cost; }
static long process(acalcoutRecord *pcalc) { rpvtStruct *prpvt = (rpvtStruct *)pcalc->rpvt; long i; double *pnew, *pprev; if (aCalcoutRecordDebug) printf("acalcoutRecord(%s):process: pact=%d, cact=%d, dlya=%d\n", pcalc->name, pcalc->pact, pcalc->cact, pcalc->dlya); /* Make sure. Autosave is capable of setting NUSE to an illegal value. */ if ((pcalc->nuse < 0) || (pcalc->nuse > pcalc->nelm)) { pcalc->nuse = pcalc->nelm; db_post_events(pcalc,&pcalc->nuse, DBE_VALUE|DBE_LOG); } /* If we're getting processed, we can no longer put off allocating memory */ if (pcalc->aval == NULL) pcalc->aval = (double *)calloc(pcalc->nelm, sizeof(double)); if (pcalc->oav == NULL) pcalc->oav = (double *)calloc(pcalc->nelm, sizeof(double)); if (!pcalc->pact) { pcalc->pact = TRUE; /* record scalar-field values so we can tell which ones aCalcPerform wrote to. */ for (i=0, pnew=&pcalc->a, pprev=&pcalc->pa; i<MAX_FIELDS; i++, pnew++, pprev++) { *pprev = *pnew; } /* if some links are CA, check connections */ if (prpvt->caLinkStat != NO_CA_LINKS) checkLinks(pcalc); if (fetch_values(pcalc)==0) { long stat; if (aCalcoutRecordDebug >= 5) printf("acalcoutRecord(%s):process: queueing aCalcPerform\n", pcalc->name); pcalc->cact = 0; stat = doCalc(pcalc); if (stat) printf("%s:process: doCalc failed.\n", pcalc->name); if (stat == 0 && pcalc->cact == 1) { pcalc->pact = 1; /* we'll get processed again when the calculation is done */ return(0); } else { if (afterCalc(pcalc) == ASYNC) return(0); } } } else { /* pact == TRUE */ /* Who invoked us ? */ if (pcalc->cact) { pcalc->cact = 0; if (afterCalc(pcalc) == ASYNC) return(0); } else if (pcalc->dlya) { /* callbackRequestProcessCallbackDelayed() called us */ pcalc->dlya = 0; db_post_events(pcalc,&pcalc->dlya,DBE_VALUE); /* Must set pact 0 so that asynchronous device support works */ pcalc->pact = 0; execOutput(pcalc); if (pcalc->pact) return(0); pcalc->pact = TRUE; } else { /* We must have been called by asynchronous device support */ writeValue(pcalc); } } /*checkAlarms(pcalc); This is too late; IVOA might have vetoed output */ recGblGetTimeStamp(pcalc); if (aCalcoutRecordDebug >= 5) { printf("acalcoutRecord(%s):process:calling monitor \n", pcalc->name); } monitor(pcalc); recGblFwdLink(pcalc); pcalc->pact = FALSE; if (aCalcoutRecordDebug >= 5) { printf("acalcoutRecord(%s):process-done\n", pcalc->name); } if (aCalcoutRecordDebug) printf("acalcoutRecord(%s):process: exit, pact==0\n", pcalc->name); return(0); }