diff --git a/kernel/include/kernel/Epoll.h b/kernel/include/kernel/Epoll.h index 89a29c35..e7e3d0ad 100644 --- a/kernel/include/kernel/Epoll.h +++ b/kernel/include/kernel/Epoll.h @@ -1,12 +1,8 @@ #pragma once -#include -#include #include -#include #include -#include #include namespace Kernel @@ -63,38 +59,41 @@ namespace Kernel struct ListenEventList { - BAN::Array events; - uint32_t bitmap[(OPEN_MAX + 31) / 32] {}; + ListenEventList() = default; + + ListenEventList(const ListenEventList&) = delete; + ListenEventList& operator=(const ListenEventList&) = delete; + + ListenEventList(ListenEventList&& other) + : events(BAN::move(other.events)) + {} + ListenEventList& operator=(ListenEventList&& other) + { + events = BAN::move(other.events); + return *this; + } + + BAN::HashMap events; bool has_fd(int fd) const { - // For some reason having (fd < 0 || ...) makes GCC 15.1.0 - // think bitmap access can be out of bounds... - if (static_cast(fd) >= events.size()) - return false; - return bitmap[fd / 32] & (1u << (fd % 32)); + return events.contains(fd); } bool empty() const { - for (auto val : bitmap) - if (val != 0) - return false; - return true; + return events.empty(); } - void add_fd(int fd, epoll_event event) + BAN::ErrorOr add_fd(int fd, epoll_event event) { - ASSERT(!has_fd(fd)); - bitmap[fd / 32] |= (1u << (fd % 32)); - events[fd] = event; + TRY(events.insert(fd, event)); + return {}; } void remove_fd(int fd) { - ASSERT(has_fd(fd)); - bitmap[fd / 32] &= ~(1u << (fd % 32)); - events[fd] = {}; + events.remove(fd); } }; diff --git a/kernel/kernel/Epoll.cpp b/kernel/kernel/Epoll.cpp index aa7dfdba..dd9de2ea 100644 --- a/kernel/kernel/Epoll.cpp +++ b/kernel/kernel/Epoll.cpp @@ -16,7 +16,7 @@ namespace Kernel Epoll::~Epoll() { - for (auto [inode, _] : m_listening_events) + for (auto& [inode, _] : m_listening_events) inode->del_epoll(this); } @@ -44,7 +44,7 @@ namespace Kernel if (!contains_inode) TRY(inode->add_epoll(this)); - it->value.add_fd(fd, event); + TRY(it->value.add_fd(fd, event)); SpinLockGuard _(m_ready_lock); auto ready_it = m_ready_events.find(inode); @@ -144,9 +144,8 @@ namespace Kernel { uint32_t listen_mask = EPOLLHUP | EPOLLERR; - for (size_t fd = 0; fd < listen.events.size(); fd++) - if (listen.has_fd(fd)) - listen_mask |= listen.events[fd].events; + for (const auto& [_, events] : listen.events) + listen_mask |= events.events; events &= listen_mask; } @@ -171,11 +170,10 @@ namespace Kernel #undef REMOVE_IT - for (size_t fd = 0; fd < listen.events.size() && event_count < event_span.size(); fd++) + for (auto& [_, listen_event] : listen.events) { - if (!listen.has_fd(fd)) - continue; - auto& listen_event = listen.events[fd]; + if (event_count >= event_span.size()) + break; const auto new_events = (listen_event.events | EPOLLHUP | EPOLLERR) & events; if (new_events == 0)