diff options
Diffstat (limited to 'runtime/ruleset.c')
-rw-r--r-- | runtime/ruleset.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/runtime/ruleset.c b/runtime/ruleset.c index db253d28..2ad21170 100644 --- a/runtime/ruleset.c +++ b/runtime/ruleset.c @@ -228,10 +228,40 @@ static inline void freeActive(sbool *active) { free(active); } static rsRetVal execAct(struct cnfstmt *stmt, batch_t *pBatch, sbool *active, wti_t *pWti) { + int i; DEFiRet; dbgprintf("RRRR: execAct [%s]: batch of %d elements, active %p\n", modGetName(stmt->d.act->pMod), batchNumMsgs(pBatch), active); pBatch->active = active; - stmt->d.act->submitToActQ(stmt->d.act, pBatch, pWti); +// TODO: check here if bPrevWasSuspsended was required and, if so +// if we actually are permitted to execute this action. + //if(pAction->bExecWhenPrevSusp) { + + + for(i = 0 ; i < batchNumMsgs(pBatch) && !*(pBatch->pbShutdownImmediate) ; ++i) { + DBGPRINTF("action %d: valid:%d state:%d execWhenPrev:%d\n", + stmt->d.act->iActionNbr, batchIsValidElem(pBatch, i), pBatch->eltState[i], + stmt->d.act->bExecWhenPrevSusp); + if(batchIsValidElem(pBatch, i)) { + stmt->d.act->submitToActQ(stmt->d.act, pWti, pBatch->pElem[i].pMsg); + // TODO: we must refactor this! flag messages as committed + batchSetElemState(pBatch, i, BATCH_STATE_COMM); + } + } + + +#warning implement action return code checking +// we should store the return code and make it available +// to users via a special function (or maybe variable) +// internally, we can use this for bPrevWasSuspended checking +// to implement this system, we need to keep a kind of +// "execution state" when running the rule engine. This most +// probably is best done inside the wti object. +// I think in v7 there was a bug, so that bPrevWasSuspended did +// not properly make it onto the next batch (because it was +// stored within the batch state) -- but even if so, the +// exposure window was minimal, as the action would probably +// fail the next time again. [TODO: check if batch object survived +// end of batch, in which case it was probably correctly handled] RETiRet; } @@ -582,6 +612,7 @@ processBatch(batch_t *pBatch, wti_t *pWti) CHKiRet(processBatchMultiRuleset(pBatch, pWti)); } + actionCommitAll(pWti); finalize_it: DBGPRINTF("ruleset.ProcessMsg() returns %d\n", iRet); RETiRet; |