struct queue {
struct eb_root head; /* queued pendconnds */
+ struct proxy *px; /* the proxy we're waiting for, never NULL in queue */
+ struct server *sv; /* the server we are waiting for, may be NULL if don't care */
__decl_thread(HA_SPINLOCK_T lock); /* for manipulations in the tree */
unsigned int idx; /* current queuing index */
unsigned int length; /* number of entries */
return offset;
}
-static inline void queue_init(struct queue *queue)
+/* initialize the queue <queue> for proxy <px> and server <sv>. A server's
+ * always has both a valid proxy and a valid server. A proxy's queue only
+ * has a valid proxy and NULL for the server queue. This is how they're
+ * distinguished during operations.
+ */
+static inline void queue_init(struct queue *queue, struct proxy *px, struct server *sv)
{
queue->head = EB_ROOT;
queue->length = 0;
queue->idx = 0;
+ queue->px = px;
+ queue->sv = sv;
HA_SPIN_INIT(&queue->lock);
}
{
memset(p, 0, sizeof(struct proxy));
p->obj_type = OBJ_TYPE_PROXY;
- queue_init(&p->queue);
+ queue_init(&p->queue, p, NULL);
LIST_INIT(&p->acl);
LIST_INIT(&p->http_req_rules);
LIST_INIT(&p->http_res_rules);
srv->obj_type = OBJ_TYPE_SERVER;
srv->proxy = proxy;
- queue_init(&srv->queue);
+ queue_init(&srv->queue, proxy, srv);
LIST_APPEND(&servers_list, &srv->global_list);
LIST_INIT(&srv->srv_rec_item);
LIST_INIT(&srv->ip_rec_item);