Orbit Framework
An ultra-modern, asynchronous, cross-platform C++ Web Framework.
Loading...
Searching...
No Matches
IoUringProactor.hpp
Go to the documentation of this file.
1#pragma once
3#include <liburing.h>
4#include <mutex>
5#include <functional>
6
7namespace network {
8
9class IoUringProactor : public Proactor {
10public:
11 IoUringProactor(unsigned entries = 1024);
12 ~IoUringProactor() override;
13
14 void run_once(int timeout_ms) override;
15
16 void async_read(socket_t fd, void* buffer, size_t size, std::function<void(ssize_t)> callback) override;
17 void async_write(socket_t fd, const void* buffer, size_t size, std::function<void(ssize_t)> callback) override;
18 void async_wait_read(socket_t fd, std::function<void()> callback) override;
19 void async_wait_write(socket_t fd, std::function<void()> callback) override;
20 void async_sendfile(socket_t out_fd, int in_fd, off_t offset, size_t count, std::function<void(ssize_t)> callback) override;
21 void async_accept(socket_t fd, std::function<void(socket_t, sockaddr_in)> callback) override;
22 void async_connect(socket_t fd, const sockaddr_in& addr, std::function<void(int)> callback) override;
23
24 void remove(socket_t fd) override;
25
26private:
27 struct io_uring ring_;
28 std::mutex sq_mutex_;
29
30 enum class OpType {
31 READ,
32 WRITE,
33 WAIT_READ,
34 WAIT_WRITE,
35 SENDFILE,
36 ACCEPT,
37 CONNECT
38 };
39
40 struct IoContext {
41 OpType type;
42 int fd{-1};
43
44 std::function<void(ssize_t)> io_cb;
45 std::function<void()> wait_cb;
46 std::function<void(socket_t, sockaddr_in)> accept_cb;
47 std::function<void(int)> connect_cb;
48
49 sockaddr_in client_addr{};
50 socklen_t client_len{sizeof(sockaddr_in)};
51
52 // For sendfile fallback
53 int in_fd{-1};
54 off_t offset{0};
55 size_t count{0};
56 };
57
58 struct io_uring_sqe* get_sqe_safe();
59};
60
61} // namespace network
Definition IoUringProactor.hpp:9
void async_wait_write(socket_t fd, std::function< void()> callback) override
Definition IoUringProactor.cpp:82
void remove(socket_t fd) override
Definition IoUringProactor.cpp:159
void async_sendfile(socket_t out_fd, int in_fd, off_t offset, size_t count, std::function< void(ssize_t)> callback) override
Definition IoUringProactor.cpp:99
~IoUringProactor() override
Definition IoUringProactor.cpp:16
void run_once(int timeout_ms) override
Definition IoUringProactor.cpp:171
void async_accept(socket_t fd, std::function< void(socket_t, sockaddr_in)> callback) override
Definition IoUringProactor.cpp:121
void async_wait_read(socket_t fd, std::function< void()> callback) override
Definition IoUringProactor.cpp:65
void async_write(socket_t fd, const void *buffer, size_t size, std::function< void(ssize_t)> callback) override
Definition IoUringProactor.cpp:47
void async_read(socket_t fd, void *buffer, size_t size, std::function< void(ssize_t)> callback) override
Definition IoUringProactor.cpp:29
void async_connect(socket_t fd, const sockaddr_in &addr, std::function< void(int)> callback) override
Definition IoUringProactor.cpp:140
Definition Proactor.hpp:8
Definition ResponseWriter.hpp:7
::socklen_t socklen_t
Definition PlatformSocket.hpp:40
int socket_t
Definition PlatformSocket.hpp:36
::ssize_t ssize_t
Definition PlatformSocket.hpp:41