Orbit Framework
An ultra-modern, asynchronous, cross-platform C++ Web Framework.
Loading...
Searching...
No Matches
EpollProactor.hpp
Go to the documentation of this file.
1#pragma once
3#include <sys/epoll.h>
4#include <unordered_map>
5#include <mutex>
6#include <vector>
7
8namespace network {
9
10class EpollProactor : public Proactor {
11public:
13 ~EpollProactor() override;
14
15 void run_once(int timeout_ms) override;
16
17 void async_read(socket_t fd, void* buffer, size_t size, std::function<void(ssize_t)> callback) override;
18 void async_write(socket_t fd, const void* buffer, size_t size, std::function<void(ssize_t)> callback) override;
19 void async_wait_read(socket_t fd, std::function<void()> callback) override;
20 void async_wait_write(socket_t fd, std::function<void()> callback) override;
21 void async_sendfile(socket_t out_fd, int in_fd, off_t offset, size_t count, std::function<void(ssize_t)> callback) override;
22 void async_accept(socket_t fd, std::function<void(socket_t, sockaddr_in)> callback) override;
23 void async_connect(socket_t fd, const sockaddr_in& addr, std::function<void(int)> callback) override;
24
25 void remove(socket_t fd) override;
26
27private:
28 struct Context {
29 int fd{-1};
30 bool tracked{false};
31
32 bool reading{false};
33 void* read_buf{nullptr};
34 size_t read_size{0};
35 std::function<void(ssize_t)> read_cb;
36
37 bool writing{false};
38 const void* write_buf{nullptr};
39 size_t write_size{0};
40 std::function<void(ssize_t)> write_cb;
41
42 bool waiting_read{false};
43 std::function<void()> wait_read_cb;
44
45 bool waiting_write{false};
46 std::function<void()> wait_write_cb;
47
48 bool sendfile_in_progress{false};
49 int sendfile_in_fd{-1};
50 off_t sendfile_offset{0};
51 size_t sendfile_count{0};
52 std::function<void(ssize_t)> sendfile_cb;
53
54 bool accepting{false};
55 std::function<void(socket_t, sockaddr_in)> accept_cb;
56
57 bool connecting{false};
58 std::function<void(int)> connect_cb;
59 };
60
61 void update_epoll(Context& ctx);
62 void handle_event(const epoll_event& event);
63
64 int epoll_fd_;
65 std::unordered_map<int, Context> contexts_;
66 std::mutex ctx_mutex_;
67 std::vector<epoll_event> events_;
68};
69
70} // namespace network
Definition EpollProactor.hpp:10
~EpollProactor() override
Definition EpollProactor.cpp:18
void async_write(socket_t fd, const void *buffer, size_t size, std::function< void(ssize_t)> callback) override
Definition EpollProactor.cpp:63
void async_connect(socket_t fd, const sockaddr_in &addr, std::function< void(int)> callback) override
Definition EpollProactor.cpp:113
void async_read(socket_t fd, void *buffer, size_t size, std::function< void(ssize_t)> callback) override
Definition EpollProactor.cpp:52
EpollProactor()
Definition EpollProactor.cpp:11
void async_accept(socket_t fd, std::function< void(socket_t, sockaddr_in)> callback) override
Definition EpollProactor.cpp:104
void async_sendfile(socket_t out_fd, int in_fd, off_t offset, size_t count, std::function< void(ssize_t)> callback) override
Definition EpollProactor.cpp:92
void run_once(int timeout_ms) override
Definition EpollProactor.cpp:142
void remove(socket_t fd) override
Definition EpollProactor.cpp:131
void async_wait_write(socket_t fd, std::function< void()> callback) override
Definition EpollProactor.cpp:83
void async_wait_read(socket_t fd, std::function< void()> callback) override
Definition EpollProactor.cpp:74
Definition Proactor.hpp:8
Definition ResponseWriter.hpp:7
int socket_t
Definition PlatformSocket.hpp:36
::ssize_t ssize_t
Definition PlatformSocket.hpp:41