struct copy_buffer_t { uint64_t offset, len; void *buf; }; struct meta_sector_t { uint64_t offset, len; int state; void *buf; int usage_count; }; class journal_flusher_t; // Journal flusher coroutine struct journal_flusher_co { blockstore *bs; journal_flusher_t *flusher; int wait_state, wait_count; struct io_uring_sqe *sqe; struct ring_data_t *data; bool skip_copy; obj_ver_id cur; std::map::iterator dirty_it; std::vector v; std::vector::iterator it; uint64_t offset, len, submit_len, clean_loc, meta_sector, meta_pos; std::map::iterator meta_it; friend class journal_flusher_t; public: void loop(); }; // Journal flusher itself class journal_flusher_t { int flusher_count; int active_flushers; journal_flusher_co *co; blockstore *bs; friend class journal_flusher_co; public: std::map meta_sectors; std::deque flush_queue; journal_flusher_t(int flusher_count, blockstore *bs); ~journal_flusher_t(); void loop(); };