struct connection *srv_lookup_conn(struct ceb_root **tree, uint64_t hash);
struct connection *srv_lookup_conn_next(struct ceb_root **tree, struct connection *conn);
-void _srv_add_idle(struct server *srv, struct connection *conn, int is_safe);
+void srv_add_idle(struct server *srv, struct connection *conn, int is_safe);
int srv_add_to_idle_list(struct server *srv, struct connection *conn, int is_safe);
void srv_add_to_avail_list(struct server *srv, struct connection *conn);
struct task *srv_cleanup_toremove_conns(struct task *task, void *context, unsigned int state);
}
else {
ASSUME_NONNULL(srv); /* srv is guaranteed by CO_FL_LIST_MASK */
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
}
}
}
}
else {
ASSUME_NONNULL(srv); /* srv is guaranteed by CO_FL_LIST_MASK */
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
}
}
else {
}
else {
ASSUME_NONNULL(srv); /* srv is guaranteed by CO_FL_LIST_MASK */
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
}
}
else {
}
else {
ASSUME_NONNULL(srv); /* srv is guaranteed by CO_FL_LIST_MASK */
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
}
}
else {
}
}
else {
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
}
/* Do not access conn without protection as soon as it is reinserted in idle list. */
}
else {
ASSUME_NONNULL(srv); /* srv is guaranteed by CO_FL_LIST_MASK */
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
}
}
else {
*
* Must be called with idle_conns_lock.
*/
-void _srv_add_idle(struct server *srv, struct connection *conn, int is_safe)
+static inline void _srv_add_idle(struct server *srv, struct connection *conn, int is_safe)
{
struct ceb_root **tree = is_safe ? &srv->per_thr[tid].safe_conns :
&srv->per_thr[tid].idle_conns;
LIST_APPEND(&srv->per_thr[tid].idle_conn_list, &conn->idle_list);
}
+/* Add <conn> in <srv> idle trees. Set <is_safe> if connection is deemed safe
+ * for reuse.
+ *
+ * This function is a simple wrapper for tree insert. It should only be used
+ * for internal usage or when removing briefly the connection to avoid takeover
+ * on it before reinserting it with this function. In other context, prefer to
+ * use the full feature srv_add_to_idle_list(). This function takes the idle
+ * conns lock for the current thread (thus the owner must not already have it).
+ */
+void srv_add_idle(struct server *srv, struct connection *conn, int is_safe)
+{
+ HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ _srv_add_idle(srv, conn, is_safe);
+ HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+}
+
/* This adds an idle connection to the server's list if the connection is
* reusable, not held by any owner anymore, but still has available streams.
*/
else {
ASSUME_NONNULL(srv); /* srv is guaranteed by CO_FL_LIST_MASK */
TRACE_DEVEL("adding conn back to idle list", SSL_EV_CONN_IO_CB, conn);
- HA_SPIN_LOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
- _srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
- HA_SPIN_UNLOCK(IDLE_CONNS_LOCK, &idle_conns[tid].idle_conns_lock);
+ srv_add_idle(srv, conn, conn_in_list == CO_FL_SAFE_LIST);
}
}
else {