diff --git a/core/od_periodic.c b/core/od_periodic.c index 0ffc1941..b64e5b23 100644 --- a/core/od_periodic.c +++ b/core/od_periodic.c @@ -76,7 +76,7 @@ void od_periodic(void *arg) /* sweep */ for (;;) { od_server_t *server = - od_routepool_pop(&pooler->route_pool, OD_SEXPIRE); + od_routepool_next(&pooler->route_pool, OD_SEXPIRE); if (server == NULL) break; od_debug(&pooler->od->log, "S: closing idle connection (%d secs)", diff --git a/core/od_server.h b/core/od_server.h index 550baf57..c174130f 100644 --- a/core/od_server.h +++ b/core/od_server.h @@ -13,6 +13,7 @@ typedef enum { OD_SUNDEF, OD_SIDLE, OD_SEXPIRE, + OD_SCLOSE, OD_SCONNECT, OD_SRESET, OD_SACTIVE diff --git a/core/od_server_pool.c b/core/od_server_pool.c index 33c03383..c33cb674 100644 --- a/core/od_server_pool.c +++ b/core/od_server_pool.c @@ -32,12 +32,14 @@ void od_serverpool_init(od_serverpool_t *p) p->count_connect = 0; p->count_reset = 0; p->count_expire = 0; + p->count_close = 0; p->count_idle = 0; od_listinit(&p->active); od_listinit(&p->connect); od_listinit(&p->reset); od_listinit(&p->idle); od_listinit(&p->expire); + od_listinit(&p->close); od_listinit(&p->link); } @@ -53,6 +55,10 @@ void od_serverpool_free(od_serverpool_t *p) server = od_container_of(i, od_server_t, link); od_serverfree(server); } + od_listforeach_safe(&p->close, i, n) { + server = od_container_of(i, od_server_t, link); + od_serverfree(server); + } od_listforeach_safe(&p->connect, i, n) { server = od_container_of(i, od_server_t, link); od_serverfree(server); @@ -78,6 +84,9 @@ void od_serverpool_set(od_serverpool_t *p, od_server_t *server, case OD_SEXPIRE: p->count_expire--; break; + case OD_SCLOSE: + p->count_close--; + break; case OD_SIDLE: p->count_idle--; break; @@ -99,6 +108,10 @@ void od_serverpool_set(od_serverpool_t *p, od_server_t *server, target = &p->expire; p->count_expire++; break; + case OD_SCLOSE: + target = &p->close; + p->count_close++; + break; case OD_SIDLE: target = &p->idle; p->count_idle++; @@ -124,7 +137,7 @@ void od_serverpool_set(od_serverpool_t *p, od_server_t *server, } od_server_t* -od_serverpool_pop(od_serverpool_t *p, od_serverstate_t state) +od_serverpool_next(od_serverpool_t *p, od_serverstate_t state) { od_list_t *target = NULL; switch (state) { @@ -132,6 +145,8 @@ od_serverpool_pop(od_serverpool_t *p, od_serverstate_t state) break; case OD_SEXPIRE: target = &p->expire; break; + case OD_SCLOSE: target = &p->close; + break; case OD_SCONNECT: target = &p->connect; break; case OD_SRESET: target = &p->reset; @@ -159,6 +174,8 @@ od_serverpool_foreach(od_serverpool_t *p, od_serverstate_t state, break; case OD_SEXPIRE: target = &p->expire; break; + case OD_SCLOSE: target = &p->close; + break; case OD_SCONNECT: target = &p->connect; break; case OD_SRESET: target = &p->reset; diff --git a/core/od_server_pool.h b/core/od_server_pool.h index 88e12a58..b382e083 100644 --- a/core/od_server_pool.h +++ b/core/od_server_pool.h @@ -16,11 +16,13 @@ struct od_serverpool_t { od_list_t connect; od_list_t reset; od_list_t expire; + od_list_t close; od_list_t idle; int count_active; int count_connect; int count_reset; int count_expire; + int count_close; int count_idle; od_list_t link; }; @@ -31,7 +33,7 @@ void od_serverpool_set(od_serverpool_t*, od_server_t*, od_serverstate_t); od_server_t* -od_serverpool_pop(od_serverpool_t*, od_serverstate_t); +od_serverpool_next(od_serverpool_t*, od_serverstate_t); od_server_t* od_serverpool_foreach(od_serverpool_t*, od_serverstate_t,