diff --git a/src/box/box.cc b/src/box/box.cc index b1898ecc744567834ef750f9e203842c5ddaceca..bca73ed9a5782c37cd478035022876935a9a435a 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -546,27 +546,6 @@ box_snapshot_cb(struct xlog *l) space_foreach(snapshot_space, l); } -static inline void -engine_start_snapshot(EngineFactory *f, void *udate) -{ - int64_t lsn = *(int64_t*)udate; - f->snapshot(SNAPSHOT_START, lsn); -} - -static inline void -engine_delete_snapshot(EngineFactory *f, void *udate) -{ - int64_t lsn = *(int64_t*)udate; - f->snapshot(SNAPSHOT_DELETE, lsn); -} - -static inline void -engine_wait_snapshot(EngineFactory *f, void *udate) -{ - int64_t lsn = *(int64_t*)udate; - f->snapshot(SNAPSHOT_WAIT, lsn); -} - static ssize_t box_snapshot_rename_cb(va_list ap) { @@ -593,7 +572,10 @@ box_snapshot(void) int64_t snap_lsn = vclock_signature(&recovery->vclock); /* create engine snapshot */ - engine_foreach(engine_start_snapshot, &snap_lsn); + EngineFactory *f; + engine_foreach(f) { + f->snapshot(SNAPSHOT_START, snap_lsn); + } /* * Due to fork nature, no threads are recreated. @@ -640,7 +622,9 @@ box_snapshot(void) tuple_end_snapshot(); /* wait for engine snapshot completion */ - engine_foreach(engine_wait_snapshot, &snap_lsn); + engine_foreach(f) { + f->snapshot(SNAPSHOT_WAIT, snap_lsn); + } /* rename snapshot on completion */ rc = coeio_custom(box_snapshot_rename_cb, @@ -649,7 +633,9 @@ box_snapshot(void) goto error; /* remove previous snapshot reference */ - engine_foreach(engine_delete_snapshot, &snapshot_last_lsn); + engine_foreach(f) { + f->snapshot(SNAPSHOT_DELETE, snapshot_last_lsn); + } snapshot_last_lsn = snap_lsn; snapshot_pid = 0; @@ -657,8 +643,11 @@ box_snapshot(void) error: /* rollback snapshot creation */ - if (snap_lsn != snapshot_last_lsn) - engine_foreach(engine_delete_snapshot, &snap_lsn); + if (snap_lsn != snapshot_last_lsn) { + engine_foreach(f) { + f->snapshot(SNAPSHOT_DELETE, snap_lsn); + } + } tuple_end_snapshot(); snapshot_pid = 0; return status; @@ -672,8 +661,11 @@ engine_save_snapshot(struct recovery_state *r) /* create engine snapshot and wait for completion */ uint64_t snap_lsn = vclock_signature(&r->vclock); - engine_foreach(engine_start_snapshot, &snap_lsn); - engine_foreach(engine_wait_snapshot, &snap_lsn); + EngineFactory *f; + engine_foreach(f) + f->snapshot(SNAPSHOT_START, snap_lsn); + engine_foreach(f) + f->snapshot(SNAPSHOT_WAIT, snap_lsn); } const char * diff --git a/src/box/engine.cc b/src/box/engine.cc index 6d3f896c0ea0792c282a3a427f5291b4dff0aaf1..c83909f8f1a4d602d9bcb5d48bf3f217cc64b017 100644 --- a/src/box/engine.cc +++ b/src/box/engine.cc @@ -34,7 +34,8 @@ #include <stdlib.h> #include <string.h> -static RLIST_HEAD(engines); +RLIST_HEAD(engines); + uint32_t engine_flags[BOX_ENGINE_MAX]; int n_engines; @@ -74,7 +75,7 @@ Engine::Engine(EngineFactory *f) /** Register engine factory instance. */ void engine_register(EngineFactory *engine) { - rlist_add_entry(&engines, engine, link); + rlist_add_tail_entry(&engines, engine, link); engine->id = ++n_engines; engine_flags[engine->id] = engine->flags; } @@ -91,15 +92,6 @@ engine_find(const char *name) tnt_raise(LoggedError, ER_NO_SUCH_ENGINE, name); } -/** Call a visitor function on every registered engine. */ -void engine_foreach(void (*func)(EngineFactory *engine, void *udata), - void *udata) -{ - EngineFactory *e; - rlist_foreach_entry(e, &engines, link) - func(e, udata); -} - /** Shutdown all engine factories. */ void engine_shutdown() { @@ -110,18 +102,14 @@ void engine_shutdown() } } -static inline void -engine_begin_recover_cb(EngineFactory *f, void *udate) -{ - int64_t lsn = *(int64_t*)udate; - f->snapshot(SNAPSHOT_RECOVER, lsn); -} - void engine_begin_recover_snapshot(int64_t snapshot_lsn) { /* recover engine snapshot */ - engine_foreach(engine_begin_recover_cb, &snapshot_lsn); + EngineFactory *f; + engine_foreach(f) { + f->snapshot(SNAPSHOT_RECOVER, snapshot_lsn); + } } static void @@ -137,13 +125,6 @@ do_one_recover_step(struct space *space, void * /* param */) } } -static inline void -engine_end_recover_snapshot_cb(EngineFactory *f, void *udate) -{ - (void)udate; - f->recoveryEvent(END_RECOVERY_SNAPSHOT); -} - void engine_end_recover_snapshot() { @@ -151,17 +132,13 @@ engine_end_recover_snapshot() * For all new spaces created from now on, when the * PRIMARY key is added, enable it right away. */ - engine_foreach(engine_end_recover_snapshot_cb, NULL); + EngineFactory *f; + engine_foreach(f) { + f->recoveryEvent(END_RECOVERY_SNAPSHOT); + } space_foreach(do_one_recover_step, NULL); } -static inline void -engine_end_recover_cb(EngineFactory *f, void *udate) -{ - (void)udate; - f->recoveryEvent(END_RECOVERY); -} - void engine_end_recover() { @@ -169,8 +146,10 @@ engine_end_recover() * For all new spaces created after recovery is complete, * when the primary key is added, enable all keys. */ - engine_foreach(engine_end_recover_cb, NULL); - + EngineFactory *f; + engine_foreach(f) { + f->recoveryEvent(END_RECOVERY); + } space_foreach(do_one_recover_step, NULL); } diff --git a/src/box/engine.h b/src/box/engine.h index 276ef3c269bae54ebb385ee017dda818e30528f1..ed063f3b53a731c62f3a8617c6bd5b1dd6fd04b7 100644 --- a/src/box/engine.h +++ b/src/box/engine.h @@ -40,6 +40,7 @@ enum engine_flags { }; extern uint32_t engine_flags[BOX_ENGINE_MAX]; +extern struct rlist engines; /** Reflects what space_replace() is supposed to do. */ enum engine_recovery_state { @@ -184,8 +185,7 @@ struct Engine: public Object { void engine_register(EngineFactory *engine); /** Call a visitor function on every registered engine. */ -void engine_foreach(void (*func)(EngineFactory *engine, void *udata), - void *udata); +#define engine_foreach(engine) rlist_foreach_entry(engine, &engines, link) /** Find engine factory by name. */ EngineFactory *engine_find(const char *name);