move register code into event mgr

This commit is contained in:
Theis Pieter Hollebeek 2026-03-25 21:16:54 +01:00
parent 181908772b
commit e31561bcd3
2 changed files with 22 additions and 16 deletions

View File

@ -1,5 +1,7 @@
#pragma once
#include "errno_shim.hpp"
#include "result.hpp"
#include <sys/epoll.h>
namespace mst::event {
enum Variant { Server, Client };
struct Event {
@ -23,10 +25,22 @@ template <typename Data> auto make_event(Variant variant, Data data) -> Event*
class Manager {
public:
auto start() -> Result<void>;
int epoll_fd;
template <typename Data>
auto register_event(Variant variant, Data data, int fd) -> Result<void>
{
auto poll_event = epoll_event { .events = EPOLLIN,
.data = { .ptr = make_event(variant, data) } };
if (::epoll_ctl(this->epoll_fd, EPOLL_CTL_ADD, fd, &poll_event) < 0) {
return std::unexpected(
errno_shim("could not add listener to epoll"));
}
return { };
}
static auto create() -> Result<Manager>;
private:
int epoll_fd;
Manager(int epoll_fd)
: epoll_fd(epoll_fd) { };
};

View File

@ -29,12 +29,9 @@ auto Server::bind(mst::event::Manager& mgr, const std::string& host,
return std::unexpected(x.error());
}
auto listener = x.value();
auto context = event::make_event(event::Server, Server(listener));
auto poll_event
= epoll_event { .events = EPOLLIN, .data = { .ptr = context } };
if (::epoll_ctl(mgr.epoll_fd, EPOLL_CTL_ADD, listener.fd, &poll_event)
< 0) {
return std::unexpected(errno_shim("could not add listener to epoll"));
auto res = mgr.register_event(event::Server, Server(listener), listener.fd);
if (!res) {
return std::unexpected(res.error());
}
return { };
}
@ -44,16 +41,11 @@ auto Server::wake(event::Manager& mgr) -> Result<void>
auto x = this->listener.accept();
auto connection = x.value();
auto context
= event::make_event(event::Client, mst::Client(*this, connection));
auto res = mgr.register_event(
event::Client, mst::Client(*this, connection), connection.fd);
auto poll_event
= epoll_event { .events = EPOLLIN, .data = { .ptr = context } };
if (::epoll_ctl(mgr.epoll_fd, EPOLL_CTL_ADD, connection.fd, &poll_event)
< 0) {
return std::unexpected(
mst::errno_shim("could not add connection to epoll"));
if (!res) {
return std::unexpected(res.error());
}
return { };
}