submit_entry.h
1 // Copyright 2020, Beeri 15. All rights reserved.
2 // Author: Roman Gershman (romange@gmail.com)
3 //
4 
5 #pragma once
6 
7 #include <liburing/io_uring.h>
8 
9 namespace util {
10 namespace uring {
11 
12 class Proactor;
13 
14 class SubmitEntry {
15  io_uring_sqe* sqe_;
16 
17  public:
18  SubmitEntry() : sqe_(nullptr) {
19  }
20 
21  // mask is a bit-OR of POLLXXX flags.
22  void PrepPollAdd(int fd, short mask) {
23  PrepFd(IORING_OP_POLL_ADD, fd);
24  sqe_->poll_events = mask;
25  }
26 
27  void PrepRecvMsg(int fd, struct msghdr* msg, unsigned flags) {
28  PrepFd(IORING_OP_RECVMSG, fd);
29  sqe_->addr = (unsigned long)msg;
30  sqe_->len = 1;
31  sqe_->msg_flags = flags;
32  }
33 
34  void PrepRead(int fd, void* buf, unsigned size, size_t offset) {
35  PrepFd(IORING_OP_READ, fd);
36  sqe_->addr = (unsigned long)buf;
37  sqe_->len = size;
38  sqe_->off = offset;
39  }
40 
41  void PrepSendMsg(int fd, const struct msghdr* msg, unsigned flags) {
42  PrepFd(IORING_OP_SENDMSG, fd);
43  sqe_->addr = (unsigned long)msg;
44  sqe_->len = 1;
45  sqe_->msg_flags = flags;
46  }
47 
48  void PrepConnect(int fd, const struct sockaddr* addr, socklen_t addrlen) {
49  PrepFd(IORING_OP_CONNECT, fd);
50  sqe_->addr = (unsigned long)addr;
51  sqe_->len = 0;
52  sqe_->off = addrlen;
53  }
54 
55  void PrepTimeout(const timespec* ts, bool is_abs = true) {
56  PrepFd(IORING_OP_TIMEOUT, -1);
57  sqe_->addr = (unsigned long)ts;
58  sqe_->len = 1;
59  sqe_->timeout_flags = IORING_TIMEOUT_ABS;
60  }
61 
62  // TODO: To remove this accessor.
63  io_uring_sqe* sqe() {
64  return sqe_;
65  }
66 
67  void PrepNOP() {
68  PrepFd(IORING_OP_NOP, -1);
69  }
70 
71  private:
72  explicit SubmitEntry(io_uring_sqe* sqe) : sqe_(sqe) {
73  }
74 
75  void PrepFd(int op, int fd) {
76  sqe_->opcode = op;
77  sqe_->fd = fd;
78  sqe_->flags = 0;
79  sqe_->ioprio = 0;
80  sqe_->addr = 0;
81  sqe_->off = 0;
82  sqe_->len = 0;
83  sqe_->rw_flags = 0;
84  sqe_->__pad2[0] = sqe_->__pad2[1] = sqe_->__pad2[2] = 0;
85  }
86 
87  friend class Proactor;
88 };
89 
90 } // namespace uring
91 } // namespace util