From 3c51802fb9a10f18b0823562432de641d0571b1a Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Wed, 23 May 2018 14:58:55 +0200 Subject: [PATCH] MINOR: conn_stream: add an tx buffer to the conn_stream To be symmetrical with the recv() part, we no handle retryable and partial transmission using a intermediary buffer in the conn_stream. For now it's only set to BUF_NULL and never allocated nor used. It cannot yet be used as-is without risking to lose data on close since conn_streams need to be orphaned for this. --- include/proto/connection.h | 13 +++++++++++++ include/types/connection.h | 1 + 2 files changed, 14 insertions(+) diff --git a/include/proto/connection.h b/include/proto/connection.h index dba7fca99..2111f67d2 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -616,6 +616,7 @@ static inline void cs_init(struct conn_stream *cs, struct connection *conn) LIST_INIT(&cs->send_wait_list); cs->conn = conn; cs->rxbuf = BUF_NULL; + cs->txbuf = BUF_NULL; } /* Initializes all required fields for a new connection. Note that it does the @@ -687,6 +688,17 @@ static inline void cs_drop_rxbuf(struct conn_stream *cs) } } +/* Releases the conn_stream's tx buf if it exists. The buffer is automatically + * replaced with a pointer to the empty buffer. + */ +static inline void cs_drop_txbuf(struct conn_stream *cs) +{ + if (b_size(&cs->txbuf)) { + b_free(&cs->txbuf); + offer_buffers(NULL, tasks_run_queue); + } +} + /* Releases a conn_stream previously allocated by cs_new(), as well as any * buffer it would still hold. */ @@ -696,6 +708,7 @@ static inline void cs_free(struct conn_stream *cs) tasklet_free(cs->wait_list.task); cs_drop_rxbuf(cs); + cs_drop_txbuf(cs); pool_free(pool_head_connstream, cs); } diff --git a/include/types/connection.h b/include/types/connection.h index 83c6bd182..cf5dbb6b7 100644 --- a/include/types/connection.h +++ b/include/types/connection.h @@ -373,6 +373,7 @@ struct conn_stream { 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) */ + struct buffer txbuf; /* transmission 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 */