From 7bb3515bc303a2a35fe859bcdba2795fbe06643d Mon Sep 17 00:00:00 2001 From: Guangxiong Lin Date: Sat, 17 Dec 2022 09:33:30 +0800 Subject: Make server as a library --- src/acceptor.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) (limited to 'src/acceptor.c') diff --git a/src/acceptor.c b/src/acceptor.c index 1f28fcc..ca7bfb4 100644 --- a/src/acceptor.c +++ b/src/acceptor.c @@ -7,12 +7,26 @@ #include "util.h" #include "connection.h" #include "evloop.h" +#include "server.h" struct conn_acceptor { - struct tsocket *sock; - evloop_t *el; + tsocket_t *sock; + evloop_t **evloops; + int nevloops; }; -typedef struct conn_acceptor conn_acceptor_t; + +conn_acceptor_t *conn_acceptor_create(tsocket_t *sock, evloop_t **evloops, int nevloops) +{ + conn_acceptor_t *acceptor = malloc(sizeof(*acceptor)); + if (!acceptor) + return NULL; + + acceptor->sock = sock; + acceptor->evloops = evloops; + acceptor->nevloops = nevloops; + + return acceptor; +} static void conn_acceptor_accept(conn_acceptor_t *ca) { @@ -30,7 +44,9 @@ static void conn_acceptor_accept(conn_acceptor_t *ca) event_t *conn_ev = connection_create_event(conn_sock); - if (evloop_add(ca->el, conn_ev, EPOLLIN | EPOLLET) == -1) { + // TODO: Use a better way to decide which sub reactor to use. + int ind = conn_sock->fd % ca->nevloops; + if (evloop_add(ca->evloops[ind], conn_ev, EPOLLIN | EPOLLET) == -1) { perror("eventloop add fd: conn_sock"); return; } @@ -45,14 +61,12 @@ static void conn_acceptor_destroy(conn_acceptor_t *ca) free(ca); } -event_t *conn_acceptor_create_event(struct tsocket *sock, evloop_t *el) +event_t *conn_acceptor_event_create(struct tsocket *sock, evloop_t **evloops, int nevloops) { - conn_acceptor_t *ca = malloc(sizeof(*ca)); - ca->sock = sock; - ca->el = el; - - struct event *ev = event_create(ca, sock->fd, + conn_acceptor_t *acceptor = conn_acceptor_create(sock, evloops, nevloops); + event_t *ev = event_create(acceptor, sock->fd, (evloop_process_func_t) conn_acceptor_accept, (evloop_destroy_func_t) conn_acceptor_destroy); + return ev; } -- cgit v1.2.3