KstObject::UpdateType KstEquation::update(int update_counter) { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); bool force = dirty(); setDirty(false); bool xUpdated = false; bool usedUpdated = false; if (KstObject::checkUpdateCounter(update_counter) && !force) { return lastUpdateResult(); } if (!_pe) { return setLastUpdateResult(NO_CHANGE); } assert(update_counter >= 0); if (_xInVector == _inputVectors.end()) { _xInVector = _inputVectors.find(XINVECTOR); if (!*_xInVector) { // This is technically sort of fatal return setLastUpdateResult(NO_CHANGE); } } writeLockInputsAndOutputs(); KstVectorPtr v = *_xInVector; xUpdated = KstObject::UPDATE == v->update(update_counter); Equation::Context ctx; ctx.sampleCount = _ns; ctx.xVector = v; usedUpdated = _pe && KstObject::UPDATE == _pe->update(update_counter, &ctx); KstObject::UpdateType rc = NO_CHANGE; // if force, rc = UPDATE anyway. if (force || xUpdated || usedUpdated) { _isValid = FillY(force); rc = UPDATE; } v = *_yOutVector; if (rc == UPDATE) { v->setDirty(); } v->update(update_counter); unlockInputsAndOutputs(); return setLastUpdateResult(rc); }
void Equation::internalUpdate() { Q_ASSERT(myLockStatus() == KstRWLock::WRITELOCKED); if (!_pe) { return; } writeLockInputsAndOutputs(); Equations::Context ctx; ctx.sampleCount = _ns; ctx.xVector = _xInVector; _pe->update(&ctx); _isValid = FillY(true); unlockInputsAndOutputs(); updateVectorLabels(); return; }