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/server.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/server.c')
-rw-r--r-- | src/server.c | 73 |
1 files changed, 60 insertions, 13 deletions
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 <unistd.h> #include <sys/epoll.h> #include <errno.h> +#include <sys/sysinfo.h> #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); } |