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