MINOR: conn_stream: add an rx buffer to the conn_stream

In order to reorganize the connection layers, recv() operations will
need to be retryable and to support partial transfers. This requires
an intermediary buffer to hold the data coming from the mux. After a
few attempts, it turns out that this buffer is best placed inside the
conn_stream itself. For now it's only set to buf_empty and it will be
up to the caller to allocate it if required.
This commit is contained in:
Willy Tarreau 2018-03-02 10:43:58 +01:00
parent a3f7efe009
commit 5e1cc5ea83
2 changed files with 19 additions and 1 deletions

View File

@ -601,6 +601,7 @@ static inline void cs_init(struct conn_stream *cs, struct connection *conn)
LIST_INIT(&cs->wait_list.list);
LIST_INIT(&cs->send_wait_list);
cs->conn = conn;
cs->rxbuf = BUF_NULL;
}
/* Initializes all required fields for a new connection. Note that it does the
@ -661,11 +662,26 @@ static inline struct connection *conn_new()
return conn;
}
/* Releases a conn_stream previously allocated by cs_new() */
/* Releases the conn_stream's rx buf if it exists. The buffer is automatically
* replaced with a pointer to the empty buffer.
*/
static inline void cs_drop_rxbuf(struct conn_stream *cs)
{
if (b_size(&cs->rxbuf)) {
b_free(&cs->rxbuf);
offer_buffers(NULL, tasks_run_queue);
}
}
/* Releases a conn_stream previously allocated by cs_new(), as well as any
* buffer it would still hold.
*/
static inline void cs_free(struct conn_stream *cs)
{
if (cs->wait_list.task)
tasklet_free(cs->wait_list.task);
cs_drop_rxbuf(cs);
pool_free(pool_head_connstream, cs);
}

View File

@ -367,10 +367,12 @@ struct conn_src {
*/
struct conn_stream {
enum obj_type obj_type; /* differentiates connection from applet context */
/* 3 bytes hole here */
unsigned int flags; /* CS_FL_* */
struct connection *conn; /* xprt-level connection */
struct wait_list wait_list; /* We're in a wait list for send */
struct list send_wait_list; /* list of tasks to wake when we're ready to send */
struct buffer rxbuf; /* receive buffer, always valid (buf_empty or real buffer) */
void *data; /* pointer to upper layer's entity (eg: stream interface) */
const struct data_cb *data_cb; /* data layer callbacks. Must be set before xprt->init() */
void *ctx; /* mux-specific context */