static void pool_schedule_waiters(TDS_POOL * pool) { TDS_POOL_USER *puser; TDS_POOL_MEMBER *pmbr; int i, free_mbrs; /* first see if there are free members to do the request */ free_mbrs = 0; for (i = 0; i < pool->num_members; i++) { pmbr = (TDS_POOL_MEMBER *) & pool->members[i]; if (pmbr->tds && pmbr->state == TDS_IDLE) free_mbrs++; } if (!free_mbrs) return; for (i = 0; i < pool->max_users; i++) { puser = (TDS_POOL_USER *) & pool->users[i]; if (puser->user_state == TDS_SRV_WAIT) { /* place back in query state */ puser->user_state = TDS_SRV_QUERY; waiters--; /* now try again */ pool_user_query(pool, puser); return; } } }
static void pool_schedule_waiters(TDS_POOL * pool) { TDS_POOL_USER *puser; /* first see if there are free members to do the request */ if (!dlist_member_first(&pool->idle_members)) return; while ((puser = dlist_user_first(&pool->waiters)) != NULL) { if (puser->user_state == TDS_SRV_WAIT) { /* place back in query state */ puser->user_state = TDS_SRV_QUERY; dlist_user_remove(&pool->waiters, puser); dlist_user_append(&pool->users, puser); /* now try again */ pool_user_query(pool, puser); return; } } }
static void login_execute(TDS_POOL_EVENT *base_event) { LOGIN_EVENT *ev = (LOGIN_EVENT *) base_event; TDS_POOL_USER *puser = ev->puser; TDS_POOL *pool = ev->pool; if (!ev->success) { /* login failed...free socket */ pool_free_user(pool, puser); return; } puser->sock.poll_recv = true; /* try to assign a member, connection can have transactions * and so on so deassign only when disconnected */ pool_user_query(pool, puser); tdsdump_log(TDS_DBG_INFO1, "user state %d\n", puser->user_state); assert(puser->login || puser->user_state == TDS_SRV_QUERY); }