mirror of
https://github.com/haproxy/haproxy.git
synced 2026-02-20 00:10:41 -05:00
The pendconn struct uses ->px and ->srv to designate where the element is queued. There is something confusing regarding threads though, because we have to lock the appropriate queue before inserting/removing elements, and this queue may only be determined by looking at ->srv (if it's not NULL it's the server, otherwise use the proxy). But pendconn_grab_from_px() and pendconn_process_next_strm() both assign this ->srv field, making it complicated to know what queue to lock before manipulating the element, which is exactly why we have the pendconn_lock in the first place. This commit introduces pendconn->target which is the target server that the two aforementioned functions will set when assigning the server. Thanks to this, the server pointer may always be relied on to determine what queue to use.
50 lines
1.5 KiB
C
50 lines
1.5 KiB
C
/*
|
|
include/types/queue.h
|
|
This file defines variables and structures needed for queues.
|
|
|
|
Copyright (C) 2000-2006 Willy Tarreau - w@1wt.eu
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation, version 2.1
|
|
exclusively.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef _TYPES_QUEUE_H
|
|
#define _TYPES_QUEUE_H
|
|
|
|
#include <common/config.h>
|
|
#include <common/mini-clist.h>
|
|
#include <common/hathreads.h>
|
|
|
|
#include <types/server.h>
|
|
|
|
struct stream;
|
|
|
|
struct pendconn {
|
|
int strm_flags; /* stream flags */
|
|
struct stream *strm;
|
|
struct proxy *px;
|
|
struct server *srv; /* the server we are waiting for, may be NULL if don't care */
|
|
struct server *target; /* the server that was assigned, = srv except if srv==NULL */
|
|
struct list list; /* next pendconn */
|
|
__decl_hathreads(HA_SPINLOCK_T lock);
|
|
};
|
|
|
|
#endif /* _TYPES_QUEUE_H */
|
|
|
|
/*
|
|
* Local variables:
|
|
* c-indent-level: 8
|
|
* c-basic-offset: 8
|
|
* End:
|
|
*/
|