#include #include #include #include #include #include #include #include #include #include #include #include #include "evloop.h" #include "tsocket.h" #include "util.h" #include "acceptor.h" #include "tpool.h" #include "server.h" struct server { tpool_t *tpool; evloop_t *evloop; evloop_t **subevloops; conn_acceptor_t *acceptor; }; server_t *server_create(void) { int nprocs = get_nprocs(); server_t *serv = (server_t *)malloc(sizeof(*serv)); tsocket_t *sock; conn_acceptor_t *acceptor; event_t *acceptor_event; if (!(sock = tsocket_create()) || tsocket_bind(sock, "127.0.0.1", 8888) == -1 || tsocket_listen(sock) == -1) panic("socket creation"); 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(); serv->acceptor = conn_acceptor_create(sock, serv->subevloops, nprocs); if (!(acceptor_event = conn_acceptor_event_create(serv->acceptor))) 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); conn_acceptor_destroy(serv->acceptor); for (int i = 0; i < nprocs; i++) evloop_destroy(serv->subevloops[i]); free(serv->subevloops); free(serv); } void server_on_connect(server_t *serv, connection_callback_func_t func) { conn_acceptor_on_connect(serv->acceptor, func); } void server_run(server_t *serv) { evloop_loop(serv->evloop); }