MEDIUM: queue: make pendconn_free() work on the stream instead

Now pendconn_free() takes a stream, checks that pend_pos is set, clears
it, and uses pendconn_unlink() to complete the job. It's cleaner and
centralizes all the bookkeeping work in pendconn_unlink() only and
ensures that there's a single place where the stream's position in the
queue is manipulated.
diff --git a/src/proto_http.c b/src/proto_http.c
index 6fa38dd..42c9d1a 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -4429,8 +4429,7 @@
 	s->logs.bytes_in = s->req.total = ci_data(&s->req);
 	s->logs.bytes_out = s->res.total = ci_data(&s->res);
 
-	if (s->pend_pos)
-		pendconn_free(s->pend_pos);
+	pendconn_free(s);
 
 	if (objt_server(s->target)) {
 		if (s->flags & SF_CURR_SESS) {
diff --git a/src/queue.c b/src/queue.c
index b081595..c4f7366 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -386,44 +386,6 @@
 	return 0;
 }
 
-/* Release the pending connection <p>, and decreases the pending count if
- * needed. The connection might have been queued to a specific server as well as
- * to the proxy. The stream also gets marked unqueued. <p> must always be
- * defined here. So it is the caller responsibility to check its existance.
- *
- * This function must be called by the stream itself, so in the context of
- * process_stream.
- */
-void pendconn_free(struct pendconn *p)
-{
-	struct stream *strm = p->strm;
-
-	HA_SPIN_LOCK(PENDCONN_LOCK, &p->lock);
-
-	/* The pendconn was already unlinked, just release it. */
-	if (LIST_ISEMPTY(&p->list))
-		goto release;
-
-	if (p->srv) {
-		HA_SPIN_LOCK(SERVER_LOCK, &p->srv->lock);
-		p->srv->nbpend--;
-		LIST_DEL(&p->list);
-		HA_SPIN_UNLOCK(SERVER_LOCK, &p->srv->lock);
-	}
-	else {
-		HA_SPIN_LOCK(PROXY_LOCK, &p->px->lock);
-		p->px->nbpend--;
-		LIST_DEL(&p->list);
-		HA_SPIN_UNLOCK(PROXY_LOCK, &p->px->lock);
-	}
-	HA_ATOMIC_SUB(&p->px->totpend, 1);
-
-  release:
-	strm->pend_pos = NULL;
-	HA_SPIN_UNLOCK(PENDCONN_LOCK, &p->lock);
-	pool_free(pool_head_pendconn, p);
-}
-
 /*
  * Local variables:
  *  c-indent-level: 8
diff --git a/src/stream.c b/src/stream.c
index d07a928..d794c28 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -304,8 +304,7 @@
 	int must_free_sess;
 	int i;
 
-	if (s->pend_pos)
-		pendconn_free(s->pend_pos);
+	pendconn_free(s);
 
 	if (objt_server(s->target)) { /* there may be requests left pending in queue */
 		if (s->flags & SF_CURR_SESS) {