diff options
author | Roman Arutyunyan <arut@nginx.com> | 2022-02-14 14:54:34 +0300 |
---|---|---|
committer | Roman Arutyunyan <arut@nginx.com> | 2022-02-14 14:54:34 +0300 |
commit | cac8623697fadd1a42134ca3af8d0c55c9b755b7 (patch) | |
tree | 764762091b2a91c8bde5aad695041eaf5cc63ad4 /src | |
parent | f15459fc466b12e3c1591b4d0a06c113f7a591c5 (diff) | |
download | nginx-cac8623697fadd1a42134ca3af8d0c55c9b755b7.tar.gz nginx-cac8623697fadd1a42134ca3af8d0c55c9b755b7.zip |
QUIC: optimize insertion at the end of QUIC buffer.
Diffstat (limited to 'src')
-rw-r--r-- | src/event/quic/ngx_event_quic.h | 2 | ||||
-rw-r--r-- | src/event/quic/ngx_event_quic_frames.c | 21 |
2 files changed, 21 insertions, 2 deletions
diff --git a/src/event/quic/ngx_event_quic.h b/src/event/quic/ngx_event_quic.h index 8f6dd7e78..109cd54ef 100644 --- a/src/event/quic/ngx_event_quic.h +++ b/src/event/quic/ngx_event_quic.h @@ -51,7 +51,9 @@ typedef enum { typedef struct { uint64_t size; uint64_t offset; + uint64_t last_offset; ngx_chain_t *chain; + ngx_chain_t **last_chain; } ngx_quic_buffer_t; diff --git a/src/event/quic/ngx_event_quic_frames.c b/src/event/quic/ngx_event_quic_frames.c index c6d8de74e..5ffae32c3 100644 --- a/src/event/quic/ngx_event_quic_frames.c +++ b/src/event/quic/ngx_event_quic_frames.c @@ -421,6 +421,10 @@ ngx_quic_read_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, uint64_t limit) qb->offset += n; } + if (qb->offset >= qb->last_offset) { + qb->last_chain = NULL; + } + qb->chain = *ll; *ll = NULL; @@ -462,6 +466,10 @@ ngx_quic_skip_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, if (qb->chain == NULL) { qb->offset = offset; } + + if (qb->offset >= qb->last_offset) { + qb->last_chain = NULL; + } } @@ -493,8 +501,14 @@ ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, ngx_buf_t *b; ngx_chain_t *cl, **chain; - base = qb->offset; - chain = &qb->chain; + if (qb->last_chain && offset >= qb->last_offset) { + base = qb->last_offset; + chain = qb->last_chain; + + } else { + base = qb->offset; + chain = &qb->chain; + } while (in && limit) { @@ -585,6 +599,9 @@ ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, } } + qb->last_offset = base; + qb->last_chain = chain; + return in; } |