MEDIUM: servers: Used a locked list for idle_orphan_conns.

Use the locked macros when manipulating idle_orphan_conns, so that other
threads can remove elements from it.
It will be useful later to avoid having a task per server and per thread to
cleanup the orphan list.
diff --git a/include/proto/connection.h b/include/proto/connection.h
index 45b8a8a..3bfad58 100644
--- a/include/proto/connection.h
+++ b/include/proto/connection.h
@@ -698,7 +698,7 @@
 	}
 
 	conn_force_unsubscribe(conn);
-	LIST_DEL(&conn->list);
+	LIST_DEL_LOCKED(&conn->list);
 	LIST_INIT(&conn->list);
 	pool_free(pool_head_connection, conn);
 }
diff --git a/include/proto/server.h b/include/proto/server.h
index 9467f69..82c9cbf 100644
--- a/include/proto/server.h
+++ b/include/proto/server.h
@@ -252,7 +252,7 @@
 			return 0;
 		}
 		LIST_DEL(&conn->list);
-		LIST_ADDQ(&srv->idle_orphan_conns[tid], &conn->list);
+		LIST_ADDQ_LOCKED(&srv->idle_orphan_conns[tid], &conn->list);
 		srv->curr_idle_thr[tid]++;
 
 		conn->idle_time = now_ms;
diff --git a/src/backend.c b/src/backend.c
index d15020a..489927e 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -1307,9 +1307,12 @@
 		    (((s->be->options & PR_O_REUSE_MASK) == PR_O_REUSE_ALWS) ||
 		    (((s->be->options & PR_O_REUSE_MASK) != PR_O_REUSE_NEVR) &&
 		     s->txn && (s->txn->flags & TX_NOT_FIRST)))) {
-			srv_conn = LIST_ELEM(srv->idle_orphan_conns[tid].n,
+			srv_conn = LIST_POP_LOCKED(&srv->idle_orphan_conns[tid],
 			    struct connection *, list);
-			reuse_orphan = 1;
+			if (srv_conn) {
+				LIST_INIT(&srv_conn->list);
+				reuse_orphan = 1;
+			}
 		}
 
 		/* If we've picked a connection from the pool, we now have to
@@ -1341,7 +1344,6 @@
 	 * list and add it back to the idle list.
 	 */
 	if (reuse && reuse_orphan) {
-		LIST_DEL(&srv_conn->list);
 		srv_conn->idle_time = 0;
 		HA_ATOMIC_SUB(&srv->curr_idle_conns, 1);
 		srv->curr_idle_thr[tid]--;