aboutsummaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c73
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);
}