diff --git a/blockstore_impl.cpp b/blockstore_impl.cpp index 7b7a43e5..3ce4893b 100644 --- a/blockstore_impl.cpp +++ b/blockstore_impl.cpp @@ -5,7 +5,7 @@ blockstore_impl_t::blockstore_impl_t(blockstore_config_t & config, ring_loop_t * assert(sizeof(blockstore_op_private_t) <= BS_OP_PRIVATE_DATA_SIZE); this->ringloop = ringloop; ring_consumer.loop = [this]() { loop(); }; - ringloop->register_consumer(ring_consumer); + ringloop->register_consumer(&ring_consumer); initialized = 0; zero_object = (uint8_t*)memalign(MEM_ALIGNMENT, block_size); data_fd = meta_fd = journal.fd = -1; @@ -36,7 +36,7 @@ blockstore_impl_t::~blockstore_impl_t() delete data_alloc; delete flusher; free(zero_object); - ringloop->unregister_consumer(ring_consumer); + ringloop->unregister_consumer(&ring_consumer); if (data_fd >= 0) close(data_fd); if (meta_fd >= 0 && meta_fd != data_fd) @@ -205,7 +205,7 @@ void blockstore_impl_t::loop() { live = true; } - queue_stall = !live && !ringloop->get_loop_again(); + queue_stall = !live && !ringloop->has_work(); live = false; } } diff --git a/fio_engine.cpp b/fio_engine.cpp index 80870245..572977a1 100644 --- a/fio_engine.cpp +++ b/fio_engine.cpp @@ -100,7 +100,7 @@ static void bs_cleanup(struct thread_data *td) bsd->ringloop->loop(); if (bsd->bs->is_safe_to_stop()) goto safe; - } while (bsd->ringloop->get_loop_again()); + } while (bsd->ringloop->has_work()); bsd->ringloop->wait(); } safe: diff --git a/osd.cpp b/osd.cpp index fc3a7587..9d0ce646 100644 --- a/osd.cpp +++ b/osd.cpp @@ -122,13 +122,13 @@ osd_t::osd_t(blockstore_config_t & config, blockstore_t *bs, ring_loop_t *ringlo } consumer.loop = [this]() { loop(); }; - ringloop->register_consumer(consumer); + ringloop->register_consumer(&consumer); } osd_t::~osd_t() { delete tick_tfd; - ringloop->unregister_consumer(consumer); + ringloop->unregister_consumer(&consumer); close(epoll_fd); close(listen_fd); } diff --git a/ringloop.cpp b/ringloop.cpp index 7c1598be..fcafdc4b 100644 --- a/ringloop.cpp +++ b/ringloop.cpp @@ -27,11 +27,10 @@ ring_loop_t::~ring_loop_t() io_uring_queue_exit(&ring); } -int ring_loop_t::register_consumer(ring_consumer_t & consumer) +void ring_loop_t::register_consumer(ring_consumer_t *consumer) { - consumer.number = consumers.size(); + unregister_consumer(consumer); consumers.push_back(consumer); - return consumer.number; } void ring_loop_t::wakeup() @@ -39,12 +38,15 @@ void ring_loop_t::wakeup() loop_again = true; } -void ring_loop_t::unregister_consumer(ring_consumer_t & consumer) +void ring_loop_t::unregister_consumer(ring_consumer_t *consumer) { - if (consumer.number >= 0 && consumer.number < consumers.size()) + for (int i = 0; i < consumers.size(); i++) { - consumers[consumer.number].loop = NULL; - consumer.number = -1; + if (consumers[i] == consumer) + { + consumers.erase(consumers.begin()+i, consumers.begin()+i+1); + break; + } } } @@ -67,7 +69,7 @@ void ring_loop_t::loop() loop_again = false; for (int i = 0; i < consumers.size(); i++) { - consumers[i].loop(); + consumers[i]->loop(); } } while (loop_again); } diff --git a/ringloop.h b/ringloop.h index 4014cfb4..86e75274 100644 --- a/ringloop.h +++ b/ringloop.h @@ -113,13 +113,12 @@ struct ring_data_t struct ring_consumer_t { - int number; std::function loop; }; class ring_loop_t { - std::vector consumers; + std::vector consumers; struct ring_data_t *ring_datas; int *free_ring_data; unsigned free_ring_data_ptr; @@ -128,8 +127,8 @@ class ring_loop_t public: ring_loop_t(int qd); ~ring_loop_t(); - int register_consumer(ring_consumer_t & consumer); - void unregister_consumer(ring_consumer_t & consumer); + void register_consumer(ring_consumer_t *consumer); + void unregister_consumer(ring_consumer_t *consumer); inline struct io_uring_sqe* get_sqe() { @@ -153,7 +152,7 @@ public: { return free_ring_data_ptr; } - inline bool get_loop_again() + inline bool has_work() { return loop_again; } diff --git a/test_blockstore.cpp b/test_blockstore.cpp index 1f3bce4a..4bee1552 100644 --- a/test_blockstore.cpp +++ b/test_blockstore.cpp @@ -115,7 +115,7 @@ int main(int narg, char *args[]) } }; - ringloop->register_consumer(main_cons); + ringloop->register_consumer(&main_cons); while (1) { ringloop->loop(); diff --git a/timerfd_interval.cpp b/timerfd_interval.cpp index a7903b5f..f84a4023 100644 --- a/timerfd_interval.cpp +++ b/timerfd_interval.cpp @@ -20,14 +20,14 @@ timerfd_interval::timerfd_interval(ring_loop_t *ringloop, int seconds, std::func throw std::runtime_error(std::string("timerfd_settime: ") + strerror(errno)); } consumer.loop = [this]() { loop(); }; - ringloop->register_consumer(consumer); + ringloop->register_consumer(&consumer); this->ringloop = ringloop; this->callback = cb; } timerfd_interval::~timerfd_interval() { - ringloop->unregister_consumer(consumer); + ringloop->unregister_consumer(&consumer); close(timerfd); }