From aaab39cfd1d6a6092783e1ec8187549ac16b9f85 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Sun, 28 Sep 2025 09:37:43 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E6=AD=A5=E6=90=AD=E5=BB=BA=20?= =?UTF-8?q?EpollLoop=20=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/ouc_server/epoll/epoll_loop.cpp | 44 ++++++++++++++++++++++--- include/ouc_server/epoll/epoll_loop.hpp | 14 ++++++-- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/include/ouc_server/epoll/epoll_loop.cpp b/include/ouc_server/epoll/epoll_loop.cpp index eb48fc6..2d4dc62 100644 --- a/include/ouc_server/epoll/epoll_loop.cpp +++ b/include/ouc_server/epoll/epoll_loop.cpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace ouc_server { @@ -20,13 +21,48 @@ namespace ouc_server close(epoll_fd); } - bool EpollLoop::add_fd(int fd, uint32_t event_flags, std::function callback) + void EpollLoop::run(int timeout_ms) + { + std::vector events(1024); + int nfds = epoll_wait(epoll_fd, events.data(), events.size(), timeout_ms); + + for (int i = 0; i < nfds; ++i) + { + int fd = events[i].data.fd; + if (events_map.count(fd)) + events_map[fd].callback(); + } + } + + bool EpollLoop::add_fd(int fd, uint32_t event_flags, EpollCallback callback) + { + auto ev = pack_event(fd, event_flags); + int code = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev); + events_map[fd] = Event{fd, event_flags, callback}; + return code == 0; + } + + bool EpollLoop::modify_fd(int fd, uint32_t event_flags) + { + auto ev = pack_event(fd, event_flags); + int code = epoll_ctl(epoll_fd, EPOLL_CTL_MOD, fd, &ev); + events_map[fd].events = event_flags; + return code == 0; + } + + bool EpollLoop::remove_fd(int fd) + { + int code = epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd, nullptr); + events_map.erase(fd); + return code == 0; + } + + struct epoll_event EpollLoop::pack_event(int fd, uint32_t flags) { struct epoll_event ev; - ev.events = event_flags; + ev.events = flags; ev.data.fd = fd; - epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev); - events_map[fd] = Event{fd, event_flags, callback}; + return ev; } } } \ No newline at end of file diff --git a/include/ouc_server/epoll/epoll_loop.hpp b/include/ouc_server/epoll/epoll_loop.hpp index 84ae087..56d7209 100644 --- a/include/ouc_server/epoll/epoll_loop.hpp +++ b/include/ouc_server/epoll/epoll_loop.hpp @@ -14,15 +14,18 @@ namespace ouc_server { namespace epoll { + using EpollCallback = std::function; + struct Event { int fd; uint32_t events; - std::function callback; + EpollCallback callback; }; class EpollLoop { + public: private: int epoll_fd; std::unordered_map events_map; @@ -33,7 +36,14 @@ namespace ouc_server ~EpollLoop(); public: - bool add_fd(int, uint32_t, std::function); + void run(int = -1); + + bool add_fd(int, uint32_t, EpollCallback); + bool modify_fd(int, uint32_t); + bool remove_fd(int); + + private: + struct epoll_event pack_event(int, uint32_t); }; } }