mirror of
https://github.com/Mercantec-GHC/h5-projekt-mst.git
synced 2026-08-27 05:37:39 +02:00
move register code into event mgr
This commit is contained in:
parent
181908772b
commit
e31561bcd3
@ -1,5 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "errno_shim.hpp"
|
||||||
#include "result.hpp"
|
#include "result.hpp"
|
||||||
|
#include <sys/epoll.h>
|
||||||
namespace mst::event {
|
namespace mst::event {
|
||||||
enum Variant { Server, Client };
|
enum Variant { Server, Client };
|
||||||
struct Event {
|
struct Event {
|
||||||
@ -23,10 +25,22 @@ template <typename Data> auto make_event(Variant variant, Data data) -> Event*
|
|||||||
class Manager {
|
class Manager {
|
||||||
public:
|
public:
|
||||||
auto start() -> Result<void>;
|
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>;
|
static auto create() -> Result<Manager>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
int epoll_fd;
|
||||||
Manager(int epoll_fd)
|
Manager(int epoll_fd)
|
||||||
: epoll_fd(epoll_fd) { };
|
: epoll_fd(epoll_fd) { };
|
||||||
};
|
};
|
||||||
|
|||||||
@ -29,12 +29,9 @@ auto Server::bind(mst::event::Manager& mgr, const std::string& host,
|
|||||||
return std::unexpected(x.error());
|
return std::unexpected(x.error());
|
||||||
}
|
}
|
||||||
auto listener = x.value();
|
auto listener = x.value();
|
||||||
auto context = event::make_event(event::Server, Server(listener));
|
auto res = mgr.register_event(event::Server, Server(listener), listener.fd);
|
||||||
auto poll_event
|
if (!res) {
|
||||||
= epoll_event { .events = EPOLLIN, .data = { .ptr = context } };
|
return std::unexpected(res.error());
|
||||||
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"));
|
|
||||||
}
|
}
|
||||||
return { };
|
return { };
|
||||||
}
|
}
|
||||||
@ -44,16 +41,11 @@ auto Server::wake(event::Manager& mgr) -> Result<void>
|
|||||||
auto x = this->listener.accept();
|
auto x = this->listener.accept();
|
||||||
auto connection = x.value();
|
auto connection = x.value();
|
||||||
|
|
||||||
auto context
|
auto res = mgr.register_event(
|
||||||
= event::make_event(event::Client, mst::Client(*this, connection));
|
event::Client, mst::Client(*this, connection), connection.fd);
|
||||||
|
|
||||||
auto poll_event
|
if (!res) {
|
||||||
= epoll_event { .events = EPOLLIN, .data = { .ptr = context } };
|
return std::unexpected(res.error());
|
||||||
|
|
||||||
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"));
|
|
||||||
}
|
}
|
||||||
return { };
|
return { };
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user