/* state change means moving between lists */ void change_client_state(PgSocket *client, SocketState newstate) { PgPool *pool = client->pool; /* remove from old location */ switch (client->state) { case CL_FREE: break; case CL_JUSTFREE: statlist_remove(&justfree_client_list, &client->head); break; case CL_LOGIN: if (newstate == CL_WAITING) newstate = CL_WAITING_LOGIN; statlist_remove(&login_client_list, &client->head); break; case CL_WAITING_LOGIN: if (newstate == CL_ACTIVE) newstate = CL_LOGIN; case CL_WAITING: statlist_remove(&pool->waiting_client_list, &client->head); break; case CL_ACTIVE: statlist_remove(&pool->active_client_list, &client->head); break; case CL_CANCEL: statlist_remove(&pool->cancel_req_list, &client->head); break; default: fatal("bad cur client state: %d", client->state); } client->state = newstate; /* put to new location */ switch (client->state) { case CL_FREE: varcache_clean(&client->vars); slab_free(client_cache, client); break; case CL_JUSTFREE: statlist_append(&justfree_client_list, &client->head); break; case CL_LOGIN: statlist_append(&login_client_list, &client->head); break; case CL_WAITING: case CL_WAITING_LOGIN: statlist_append(&pool->waiting_client_list, &client->head); break; case CL_ACTIVE: statlist_append(&pool->active_client_list, &client->head); break; case CL_CANCEL: statlist_append(&pool->cancel_req_list, &client->head); break; default: fatal("bad new client state: %d", client->state); } }
static void launch_db(const char *dbname) { struct PgDatabase *db; db = calloc(1, sizeof(*db)); db->name = strdup(dbname); statlist_init(&db->maint_item_list, "maint_item_list"); list_init(&db->head); statlist_append(&database_list, &db->head); launch_ticker(db); }
/* state change means moving between lists */ void change_server_state(PgSocket *server, SocketState newstate) { PgPool *pool = server->pool; /* remove from old location */ switch (server->state) { case SV_FREE: break; case SV_JUSTFREE: statlist_remove(&justfree_server_list, &server->head); break; case SV_LOGIN: statlist_remove(&pool->new_server_list, &server->head); break; case SV_USED: statlist_remove(&pool->used_server_list, &server->head); break; case SV_TESTED: statlist_remove(&pool->tested_server_list, &server->head); break; case SV_IDLE: statlist_remove(&pool->idle_server_list, &server->head); break; case SV_ACTIVE: statlist_remove(&pool->active_server_list, &server->head); break; default: fatal("change_server_state: bad old server state: %d", server->state); } server->state = newstate; /* put to new location */ switch (server->state) { case SV_FREE: varcache_clean(&server->vars); slab_free(server_cache, server); break; case SV_JUSTFREE: statlist_append(&justfree_server_list, &server->head); break; case SV_LOGIN: statlist_append(&pool->new_server_list, &server->head); break; case SV_USED: /* use LIFO */ statlist_prepend(&pool->used_server_list, &server->head); break; case SV_TESTED: statlist_append(&pool->tested_server_list, &server->head); break; case SV_IDLE: if (server->close_needed || cf_server_round_robin) { /* try to avoid immediate usage then */ statlist_append(&pool->idle_server_list, &server->head); } else { /* otherwise use LIFO */ statlist_prepend(&pool->idle_server_list, &server->head); } break; case SV_ACTIVE: statlist_append(&pool->active_server_list, &server->head); break; default: fatal("bad server state"); } }