+ io_uring_cqe_seen(&ring, cqe);
+ --pending_reads;
+
+ size_t old_pending_reads = pending_reads;
+ pending->cb(string(reinterpret_cast<char *>(pending->buf), pending->len));
+ free(pending->buf);
+ delete pending;
+
+ if (pending_reads != old_pending_reads) {
+ // A new read was made in the callback (and not queued),
+ // so we need to re-submit.
+ anything_to_submit = true;
+ }
+ }
+
+ // See if there are any queued reads we can submit now.
+ while (!queued_reads.empty() && pending_reads < queue_depth) {
+ io_uring_sqe *sqe = io_uring_get_sqe(&ring);
+ if (sqe == nullptr) {
+ fprintf(stderr, "io_uring_get_sqe: %s\n", strerror(errno));
+ exit(1);
+ }
+ QueuedRead &qr = queued_reads.front();
+ submit_read_internal(sqe, qr.fd, qr.len, qr.offset, move(qr.cb));
+ queued_reads.pop();
+ anything_to_submit = true;