void cache_iterate_limit(struct cache *c, void *data, uint32_t from, uint32_t steps, int (*iterate)(void *data1, void *data2)) { hashtable_iterate_limit(c->h, data, from, steps, iterate); }
void cache_commit(struct cache *c, struct nfct_handle *h, int clientfd) { unsigned int commit_ok, commit_fail; struct __commit_container tmp = { .h = h, .c = c, }; struct timeval commit_stop, res; switch(STATE_SYNC(commit).state) { case COMMIT_STATE_INACTIVE: gettimeofday(&STATE_SYNC(commit).stats.start, NULL); STATE_SYNC(commit).stats.ok = c->stats.commit_ok; STATE_SYNC(commit).stats.fail = c->stats.commit_fail; STATE_SYNC(commit).clientfd = clientfd; case COMMIT_STATE_MASTER: STATE_SYNC(commit).current = hashtable_iterate_limit(c->h, &tmp, STATE_SYNC(commit).current, CONFIG(general).commit_steps, do_commit_master); if (STATE_SYNC(commit).current < CONFIG(hashsize)) { STATE_SYNC(commit).state = COMMIT_STATE_MASTER; /* give it another step as soon as possible */ write_evfd(STATE_SYNC(commit).evfd); return; } STATE_SYNC(commit).current = 0; STATE_SYNC(commit).state = COMMIT_STATE_RELATED; case COMMIT_STATE_RELATED: STATE_SYNC(commit).current = hashtable_iterate_limit(c->h, &tmp, STATE_SYNC(commit).current, CONFIG(general).commit_steps, do_commit_related); if (STATE_SYNC(commit).current < CONFIG(hashsize)) { STATE_SYNC(commit).state = COMMIT_STATE_RELATED; /* give it another step as soon as possible */ write_evfd(STATE_SYNC(commit).evfd); return; } /* calculate the time that commit has taken */ gettimeofday(&commit_stop, NULL); timersub(&commit_stop, &STATE_SYNC(commit).stats.start, &res); /* calculate new entries committed */ commit_ok = c->stats.commit_ok - STATE_SYNC(commit).stats.ok; commit_fail = c->stats.commit_fail - STATE_SYNC(commit).stats.fail; /* log results */ dlog(LOG_NOTICE, "Committed %u new entries", commit_ok); if (commit_fail) dlog(LOG_NOTICE, "%u entries can't be " "committed", commit_fail); dlog(LOG_NOTICE, "commit has taken %lu.%06lu seconds", res.tv_sec, res.tv_usec); /* prepare the state machine for new commits */ STATE_SYNC(commit).current = 0; STATE_SYNC(commit).state = COMMIT_STATE_INACTIVE; /* Close the client socket now that we're done. */ close(STATE_SYNC(commit).clientfd); } }