// Copyright (c) Vitaliy Filippov, 2019+ // License: VNPL-1.1 or GNU GPL-2.0+ (see README.md for details) #pragma once #include "ringloop.h" class ring_loop_mock_t: public ring_loop_i { std::vector> immediate_queue, immediate_queue2; std::vector consumers; std::vector sqes; std::vector ring_datas; std::vector free_ring_datas; std::vector submit_ring_datas; std::vector completed_ring_datas; std::function submit_cb; bool in_loop; bool loop_again; bool support_zc = false; public: ring_loop_mock_t(int qd, std::function submit_cb); void register_consumer(ring_consumer_t *consumer); void unregister_consumer(ring_consumer_t *consumer); void wakeup(); void set_immediate(const std::function & cb); unsigned space_left(); bool has_work(); bool has_sendmsg_zc(); int register_eventfd(); io_uring_sqe* get_sqe(); int submit(); int wait(); void loop(); unsigned save(); void restore(unsigned sqe_tail); void mark_completed(ring_data_t *data); }; class disk_mock_t { uint8_t *data = NULL; std::map buffers; size_t size = 0; bool buffered = false; ring_loop_mock_t *loop = NULL; void erase_buffers(uint64_t begin, uint64_t end); ssize_t copy_from_sqe(io_uring_sqe *sqe, uint8_t *to, uint64_t base_offset); void read_item(uint8_t *to, uint64_t offset, uint64_t len); public: bool trace = false; disk_mock_t(ring_loop_mock_t *loop, size_t size, bool buffered); ~disk_mock_t(); void discard_buffers(bool all, uint32_t seed); bool submit(io_uring_sqe *sqe); };