Make [un]register_consumer operate on pointers, rename get_loop_again() to has_work()

trace-sqes
Vitaliy Filippov 2020-03-04 21:00:15 +03:00
parent 1e21555343
commit 9cb07d844b
7 changed files with 23 additions and 22 deletions

View File

@ -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); assert(sizeof(blockstore_op_private_t) <= BS_OP_PRIVATE_DATA_SIZE);
this->ringloop = ringloop; this->ringloop = ringloop;
ring_consumer.loop = [this]() { loop(); }; ring_consumer.loop = [this]() { loop(); };
ringloop->register_consumer(ring_consumer); ringloop->register_consumer(&ring_consumer);
initialized = 0; initialized = 0;
zero_object = (uint8_t*)memalign(MEM_ALIGNMENT, block_size); zero_object = (uint8_t*)memalign(MEM_ALIGNMENT, block_size);
data_fd = meta_fd = journal.fd = -1; data_fd = meta_fd = journal.fd = -1;
@ -36,7 +36,7 @@ blockstore_impl_t::~blockstore_impl_t()
delete data_alloc; delete data_alloc;
delete flusher; delete flusher;
free(zero_object); free(zero_object);
ringloop->unregister_consumer(ring_consumer); ringloop->unregister_consumer(&ring_consumer);
if (data_fd >= 0) if (data_fd >= 0)
close(data_fd); close(data_fd);
if (meta_fd >= 0 && meta_fd != data_fd) if (meta_fd >= 0 && meta_fd != data_fd)
@ -205,7 +205,7 @@ void blockstore_impl_t::loop()
{ {
live = true; live = true;
} }
queue_stall = !live && !ringloop->get_loop_again(); queue_stall = !live && !ringloop->has_work();
live = false; live = false;
} }
} }

View File

@ -100,7 +100,7 @@ static void bs_cleanup(struct thread_data *td)
bsd->ringloop->loop(); bsd->ringloop->loop();
if (bsd->bs->is_safe_to_stop()) if (bsd->bs->is_safe_to_stop())
goto safe; goto safe;
} while (bsd->ringloop->get_loop_again()); } while (bsd->ringloop->has_work());
bsd->ringloop->wait(); bsd->ringloop->wait();
} }
safe: safe:

View File

@ -122,13 +122,13 @@ osd_t::osd_t(blockstore_config_t & config, blockstore_t *bs, ring_loop_t *ringlo
} }
consumer.loop = [this]() { loop(); }; consumer.loop = [this]() { loop(); };
ringloop->register_consumer(consumer); ringloop->register_consumer(&consumer);
} }
osd_t::~osd_t() osd_t::~osd_t()
{ {
delete tick_tfd; delete tick_tfd;
ringloop->unregister_consumer(consumer); ringloop->unregister_consumer(&consumer);
close(epoll_fd); close(epoll_fd);
close(listen_fd); close(listen_fd);
} }

View File

@ -27,11 +27,10 @@ ring_loop_t::~ring_loop_t()
io_uring_queue_exit(&ring); 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); consumers.push_back(consumer);
return consumer.number;
} }
void ring_loop_t::wakeup() void ring_loop_t::wakeup()
@ -39,12 +38,15 @@ void ring_loop_t::wakeup()
loop_again = true; 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; if (consumers[i] == consumer)
consumer.number = -1; {
consumers.erase(consumers.begin()+i, consumers.begin()+i+1);
break;
}
} }
} }
@ -67,7 +69,7 @@ void ring_loop_t::loop()
loop_again = false; loop_again = false;
for (int i = 0; i < consumers.size(); i++) for (int i = 0; i < consumers.size(); i++)
{ {
consumers[i].loop(); consumers[i]->loop();
} }
} while (loop_again); } while (loop_again);
} }

View File

@ -113,13 +113,12 @@ struct ring_data_t
struct ring_consumer_t struct ring_consumer_t
{ {
int number;
std::function<void(void)> loop; std::function<void(void)> loop;
}; };
class ring_loop_t class ring_loop_t
{ {
std::vector<ring_consumer_t> consumers; std::vector<ring_consumer_t*> consumers;
struct ring_data_t *ring_datas; struct ring_data_t *ring_datas;
int *free_ring_data; int *free_ring_data;
unsigned free_ring_data_ptr; unsigned free_ring_data_ptr;
@ -128,8 +127,8 @@ class ring_loop_t
public: public:
ring_loop_t(int qd); ring_loop_t(int qd);
~ring_loop_t(); ~ring_loop_t();
int register_consumer(ring_consumer_t & consumer); void register_consumer(ring_consumer_t *consumer);
void unregister_consumer(ring_consumer_t & consumer); void unregister_consumer(ring_consumer_t *consumer);
inline struct io_uring_sqe* get_sqe() inline struct io_uring_sqe* get_sqe()
{ {
@ -153,7 +152,7 @@ public:
{ {
return free_ring_data_ptr; return free_ring_data_ptr;
} }
inline bool get_loop_again() inline bool has_work()
{ {
return loop_again; return loop_again;
} }

View File

@ -115,7 +115,7 @@ int main(int narg, char *args[])
} }
}; };
ringloop->register_consumer(main_cons); ringloop->register_consumer(&main_cons);
while (1) while (1)
{ {
ringloop->loop(); ringloop->loop();

View File

@ -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)); throw std::runtime_error(std::string("timerfd_settime: ") + strerror(errno));
} }
consumer.loop = [this]() { loop(); }; consumer.loop = [this]() { loop(); };
ringloop->register_consumer(consumer); ringloop->register_consumer(&consumer);
this->ringloop = ringloop; this->ringloop = ringloop;
this->callback = cb; this->callback = cb;
} }
timerfd_interval::~timerfd_interval() timerfd_interval::~timerfd_interval()
{ {
ringloop->unregister_consumer(consumer); ringloop->unregister_consumer(&consumer);
close(timerfd); close(timerfd);
} }