mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-09 16:47:18 +02:00
[MINOR] add the splice_len member to the buffer struct in preparation of splice support
In preparation of splice support, let's add the splice_len member to the buffer struct. An earlier implementation made it conditional, which made the whole logics very complex due to a large number of ifdefs. Now BF_EMPTY is only set once both buf->l and buf->splice_len are null. Splice_len is initialized to zero during buffer creation and is currently not changed, so the whole logics remains unaffected. When splice gets merged, splice_len will reflect the number of bytes in flight out of the buffer but not yet sent, typically in a pipe for the Linux case.
This commit is contained in:
parent
6b66f3e4f6
commit
dcef33fa9b
@ -48,6 +48,7 @@ static inline void buffer_init(struct buffer *buf)
|
|||||||
buf->send_max = 0;
|
buf->send_max = 0;
|
||||||
buf->to_forward = 0;
|
buf->to_forward = 0;
|
||||||
buf->l = buf->total = 0;
|
buf->l = buf->total = 0;
|
||||||
|
buf->splice_len = 0;
|
||||||
buf->analysers = 0;
|
buf->analysers = 0;
|
||||||
buf->cons = NULL;
|
buf->cons = NULL;
|
||||||
buf->flags = BF_EMPTY;
|
buf->flags = BF_EMPTY;
|
||||||
|
@ -127,6 +127,7 @@ struct buffer {
|
|||||||
int wto; /* write timeout, in ticks */
|
int wto; /* write timeout, in ticks */
|
||||||
int cto; /* connect timeout, in ticks */
|
int cto; /* connect timeout, in ticks */
|
||||||
unsigned int l; /* data length */
|
unsigned int l; /* data length */
|
||||||
|
unsigned int splice_len; /* number of bytes remaining in splice, out of buffer */
|
||||||
char *r, *w, *lr; /* read ptr, write ptr, last read */
|
char *r, *w, *lr; /* read ptr, write ptr, last read */
|
||||||
char *rlim; /* read limit, used for header rewriting */
|
char *rlim; /* read limit, used for header rewriting */
|
||||||
unsigned int send_max; /* number of bytes the sender can consume */
|
unsigned int send_max; /* number of bytes the sender can consume */
|
||||||
|
@ -116,8 +116,8 @@ int stream_sock_read(int fd) {
|
|||||||
cur_read += ret;
|
cur_read += ret;
|
||||||
|
|
||||||
/* if noone is interested in analysing data, let's forward everything */
|
/* if noone is interested in analysing data, let's forward everything */
|
||||||
if (b->to_forward > b->send_max)
|
if (b->to_forward - b->splice_len > b->send_max)
|
||||||
b->send_max = MIN(b->to_forward, b->l);
|
b->send_max = MIN(b->to_forward - b->splice_len, b->l);
|
||||||
|
|
||||||
if (fdtab[fd].state == FD_STCONN)
|
if (fdtab[fd].state == FD_STCONN)
|
||||||
fdtab[fd].state = FD_STREADY;
|
fdtab[fd].state = FD_STREADY;
|
||||||
@ -406,7 +406,7 @@ int stream_sock_write(int fd) {
|
|||||||
b->w = b->data; /* wrap around the buffer */
|
b->w = b->data; /* wrap around the buffer */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!b->l) {
|
if (!b->l && !b->splice_len) {
|
||||||
b->flags |= BF_EMPTY;
|
b->flags |= BF_EMPTY;
|
||||||
|
|
||||||
/* Maybe we just wrote the last chunk and need to close ? */
|
/* Maybe we just wrote the last chunk and need to close ? */
|
||||||
@ -608,7 +608,7 @@ void stream_sock_data_finish(struct stream_interface *si)
|
|||||||
/* Check if we need to close the write side */
|
/* Check if we need to close the write side */
|
||||||
if (!(ob->flags & BF_SHUTW)) {
|
if (!(ob->flags & BF_SHUTW)) {
|
||||||
/* Write not closed, update FD status and timeout for writes */
|
/* Write not closed, update FD status and timeout for writes */
|
||||||
if ((ob->send_max == 0) ||
|
if ((ob->send_max == 0 && ob->splice_len == 0) ||
|
||||||
(ob->flags & BF_EMPTY) ||
|
(ob->flags & BF_EMPTY) ||
|
||||||
(ob->flags & (BF_HIJACK|BF_WRITE_ENA)) == 0) {
|
(ob->flags & (BF_HIJACK|BF_WRITE_ENA)) == 0) {
|
||||||
/* stop writing */
|
/* stop writing */
|
||||||
@ -693,7 +693,7 @@ void stream_sock_chk_snd(struct stream_interface *si)
|
|||||||
if (unlikely(si->state != SI_ST_EST || (ob->flags & BF_SHUTW)))
|
if (unlikely(si->state != SI_ST_EST || (ob->flags & BF_SHUTW)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((ob->send_max == 0) ||
|
if ((ob->send_max == 0 && ob->splice_len == 0) ||
|
||||||
(ob->flags & BF_EMPTY) ||
|
(ob->flags & BF_EMPTY) ||
|
||||||
(ob->flags & (BF_HIJACK|BF_WRITE_ENA)) == 0) {
|
(ob->flags & (BF_HIJACK|BF_WRITE_ENA)) == 0) {
|
||||||
/* stop writing */
|
/* stop writing */
|
||||||
|
Loading…
Reference in New Issue
Block a user