backend: c++17pilled

This commit is contained in:
Theis Pieter Hollebeek 2026-03-26 11:58:43 +01:00
parent a2b36a37ff
commit c5349719cd
4 changed files with 68 additions and 58 deletions

View File

@ -1,11 +1,11 @@
#include "event_loop.hpp" #include "event_loop.hpp"
#include "errno_shim.hpp" #include "errno_shim.hpp"
#include "server.hpp" #include "server.hpp"
#include <print>
#include <sys/epoll.h> #include <sys/epoll.h>
#include <utility>
#include <variant>
namespace mst::event { namespace mst::event {
auto Manager::start() -> Result<void> auto Manager::start() -> Result<void>
{ {
epoll_event events[128] = { }; epoll_event events[128] = { };
@ -15,27 +15,28 @@ auto Manager::start() -> Result<void>
return std::unexpected(errno_shim("could not poll")); return std::unexpected(errno_shim("could not poll"));
} }
for (int i = 0; i < events_len; ++i) { for (int i = 0; i < events_len; ++i) {
auto event = (event::Event*)events[i].data.ptr; auto event = (mst::event::Event*)events[i].data.ptr;
switch (event->data.index()) {
switch (event->variant) { case 0: {
case event::Server: { auto& ref
auto ptr = (mst::Server*)event->data; = std::get<std::unique_ptr<mst::Server>>(event->data);
auto res = ptr->wake(*this); auto res = ref->wake(*this);
if (!res) {
return std::unexpected(res.error());
}
break;
}
case event::Client: {
std::println("client call scheduled");
auto ptr = (mst::Client*)event->data;
auto res = ptr->wake();
if (!res) { if (!res) {
return std::unexpected(res.error()); return std::unexpected(res.error());
} }
break; break;
} }
case 1: {
auto& ref
= std::get<std::unique_ptr<mst::Client>>(event->data);
auto res = ref->wake();
if (!res) {
return std::unexpected(res.error());
}
break;
}
default:
std::unreachable();
} }
} }
} }

View File

@ -1,37 +1,41 @@
#pragma once #pragma once
#include "errno_shim.hpp" #include "errno_shim.hpp"
#include "result.hpp" #include "result.hpp"
#include "server.hpp"
#include <memory>
#include <sys/epoll.h> #include <sys/epoll.h>
namespace mst::event { #include <variant>
enum Variant { Server, Client }; #include <vector>
namespace mst {
class Server;
class Client;
namespace event {
struct Event { struct Event {
Variant variant; std::variant<std::unique_ptr<mst::Server>, std::unique_ptr<mst::Client>>
int fd; data;
void* data;
}; };
template <typename Data> auto make_event(Variant variant, Data data) -> Event* template <typename Data>
auto make_event(Data&& data) -> std::unique_ptr<Event>
{ {
auto event = (Event*)malloc(sizeof(Event)); return std::make_unique<Event>(std::make_unique<Data>(std::move(data)));
auto ptr = (Data*)std::malloc(sizeof(Data));
*ptr = data;
event->variant = variant;
event->data = ptr;
return event;
} }
class Manager { class Manager {
public: public:
auto start() -> Result<void>; auto start() -> Result<void>;
template <typename Data> template <typename Data>
auto register_event(Variant variant, Data data, int fd) -> Result<void> auto register_event(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) { auto event = make_event(std::move(data));
this->events.emplace_back(std::move(event));
auto poll_event = epoll_event { .events = EPOLLIN,
.data = { .ptr = events.back().get() } };
if (::epoll_ctl(this->epoll_fd, EPOLL_CTL_ADD, fd, &poll_event)
< 0) {
return std::unexpected( return std::unexpected(
errno_shim("could not add listener to epoll")); errno_shim("could not add listener to epoll"));
} }
@ -41,7 +45,9 @@ public:
private: private:
int epoll_fd; int epoll_fd;
std::vector<std::unique_ptr<Event>> events;
Manager(int epoll_fd) Manager(int epoll_fd)
: epoll_fd(epoll_fd) { }; : epoll_fd(epoll_fd) { };
}; };
} }
}

View File

@ -1,5 +1,4 @@
#include "server.hpp" #include "server.hpp"
#include "errno_shim.hpp"
#include "event_loop.hpp" #include "event_loop.hpp"
#include <print> #include <print>
#include <sys/epoll.h> #include <sys/epoll.h>
@ -30,7 +29,7 @@ auto Server::bind(
return std::unexpected(x.error()); return std::unexpected(x.error());
} }
auto listener = x.value(); auto listener = x.value();
auto res = mgr.register_event(event::Server, Server(listener), listener.fd); auto res = mgr.register_event(Server(listener), listener.fd);
if (!res) { if (!res) {
return std::unexpected(res.error()); return std::unexpected(res.error());
} }
@ -42,8 +41,8 @@ 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 res = mgr.register_event( auto res
event::Client, mst::Client(*this, connection), connection.fd); = mgr.register_event(mst::Client(*this, connection), connection.fd);
if (!res) { if (!res) {
return std::unexpected(res.error()); return std::unexpected(res.error());

View File

@ -5,6 +5,10 @@
namespace mst { namespace mst {
namespace event {
class Manager;
}
class Server { class Server {
public: public:
auto wake(mst::event::Manager& mgr) -> Result<void>; auto wake(mst::event::Manager& mgr) -> Result<void>;