diff options
author | Guangxiong Lin <[email protected]> | 2022-12-17 09:33:30 +0800 |
---|---|---|
committer | Guangxiong Lin <[email protected]> | 2022-12-17 20:51:37 +0800 |
commit | 7bb3515bc303a2a35fe859bcdba2795fbe06643d (patch) | |
tree | 453d9cc321bc561ae8bae911308925d61dccb2f7 /src/acceptor.c | |
parent | 1def149b9245563a8ba1db9e937d537da8de8d27 (diff) | |
download | tinyserver-7bb3515bc303a2a35fe859bcdba2795fbe06643d.tar.gz tinyserver-7bb3515bc303a2a35fe859bcdba2795fbe06643d.tar.bz2 tinyserver-7bb3515bc303a2a35fe859bcdba2795fbe06643d.zip |
Make server as a library
Diffstat (limited to 'src/acceptor.c')
-rw-r--r-- | src/acceptor.c | 34 |
1 files changed, 24 insertions, 10 deletions
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; } |