|
|
|
@ -119,8 +119,15 @@ void server_free(server* srv) {
|
|
|
|
|
guint i;
|
|
|
|
|
for (i = 0; i < srv->worker_count; i++) {
|
|
|
|
|
worker *wrk;
|
|
|
|
|
struct ev_loop *loop;
|
|
|
|
|
wrk = g_array_index(srv->workers, worker*, i);
|
|
|
|
|
loop = wrk->loop;
|
|
|
|
|
worker_free(wrk);
|
|
|
|
|
if (i == 0) {
|
|
|
|
|
ev_default_destroy();
|
|
|
|
|
} else {
|
|
|
|
|
ev_loop_destroy(loop);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -244,7 +251,7 @@ static void server_listen_cb(struct ev_loop *loop, ev_io *w, int revents) {
|
|
|
|
|
while (-1 != (s = accept(w->fd, (struct sockaddr*) &remote_addr, &l))) {
|
|
|
|
|
connection *con = con_get(srv);
|
|
|
|
|
worker *wrk = srv->main_worker;
|
|
|
|
|
guint i, min_load = g_atomic_int_get(&wrk->connection_load);
|
|
|
|
|
guint i, min_load = g_atomic_int_get(&wrk->connection_load), sel = 0;
|
|
|
|
|
|
|
|
|
|
for (i = 1; i < srv->worker_count; i++) {
|
|
|
|
|
worker *wt = g_array_index(srv->workers, worker*, i);
|
|
|
|
@ -252,10 +259,12 @@ static void server_listen_cb(struct ev_loop *loop, ev_io *w, int revents) {
|
|
|
|
|
if (load < min_load) {
|
|
|
|
|
wrk = wt;
|
|
|
|
|
min_load = load;
|
|
|
|
|
sel = i;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
g_atomic_int_inc((gint*) &wrk->connection_load);
|
|
|
|
|
/* TRACE(srv, "selected worker %u with load %u", sel, min_load); */
|
|
|
|
|
con->wrk = wrk;
|
|
|
|
|
con->state = CON_STATE_REQUEST_START;
|
|
|
|
|
con->remote_addr = remote_addr;
|
|
|
|
|