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/server.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 13 deletions(-) (limited to 'src/server.c') diff --git a/src/server.c b/src/server.c index 8525689..a13d525 100644 --- a/src/server.c +++ b/src/server.c @@ -9,32 +9,79 @@ #include #include #include +#include #include "evloop.h" #include "tsocket.h" #include "util.h" #include "acceptor.h" #include "tpool.h" +#include "server.h" -int main() +struct server { + tpool_t *tpool; + evloop_t *evloop; + evloop_t **subevloops; +}; + +server_t *server_create(void) { - evloop_t *el = evloop_create(); - if (el == NULL) - panic("eventloop creation"); + int nprocs = get_nprocs(); + server_t *serv = (server_t *)malloc(sizeof(*serv)); + tsocket_t *sock; + event_t *acceptor_event; - struct tsocket *sock = tsocket_create(); - if (sock == NULL + if (!(sock = tsocket_create()) || tsocket_bind(sock, "127.0.0.1", 8888) == -1 || tsocket_listen(sock) == -1) panic("socket creation"); - tpool = tpool_create(0); - if (!tpool) - panic("tpool_create"); + serv = (server_t *)malloc(sizeof(*serv)); + if (!serv) + return NULL; + + serv->tpool = tpool_create(nprocs); + serv->evloop = evloop_create(); + serv->subevloops = calloc(nprocs, sizeof(evloop_t*)); + for (int i = 0; i < nprocs; i++) + serv->subevloops[i] = evloop_create(); + + if (!(acceptor_event = conn_acceptor_event_create(sock, serv->subevloops, nprocs))) + return NULL; + if (evloop_add(serv->evloop, acceptor_event, EPOLLIN) == -1) + panic("evloop add fd"); + + for (int i = 0; i < nprocs; i++) + tpool_add_work(serv->tpool, (thread_func_t) evloop_loop, + serv->subevloops[i]); + + return serv; +} + +void server_destroy(server_t *serv) +{ + int nprocs = get_nprocs(); + + if (!serv) + return; + + evloop_destroy(serv->evloop); + tpool_destroy(serv->tpool); - event_t *acceptEvent = conn_acceptor_create_event(sock, el); - if (evloop_add(el, acceptEvent, EPOLLIN) == -1) - panic("eventloop add fd"); + for (int i = 0; i < nprocs; i++) + evloop_destroy(serv->subevloops[i]); - evloop_loop(el); + free(serv->subevloops); + free(serv); +} + +void server_run(server_t *serv) +{ + evloop_loop(serv->evloop); +} + +int main() +{ + server_t *serv = server_create(); + server_run(serv); } -- cgit v1.2.3