diff options
author | Håvard Pettersen <havardpe@oath.com> | 2021-06-01 09:13:14 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2021-06-01 11:22:31 +0000 |
commit | 5a66d61ea772f59583c9af03087014d74051fecf (patch) | |
tree | 77dda4d754178a287eb98c53b0789eccca2abb7b /vespalib | |
parent | 97bb8e47324450b1cd2ec77a5ee2b03686631bce (diff) |
drop empty buffers
Diffstat (limited to 'vespalib')
8 files changed, 39 insertions, 0 deletions
diff --git a/vespalib/src/vespa/vespalib/data/smart_buffer.cpp b/vespalib/src/vespa/vespalib/data/smart_buffer.cpp index 401b6729601..4c3a3e6f379 100644 --- a/vespalib/src/vespa/vespalib/data/smart_buffer.cpp +++ b/vespalib/src/vespa/vespalib/data/smart_buffer.cpp @@ -23,6 +23,15 @@ SmartBuffer::ensure_free(size_t bytes) _read_pos = 0; } +void +SmartBuffer::drop() +{ + alloc::Alloc empty_buf; + _data.swap(empty_buf); + _read_pos = 0; + _write_pos = 0; +} + SmartBuffer::SmartBuffer(size_t initial_size) : _data(alloc::Alloc::alloc(initial_size)), _read_pos(0), diff --git a/vespalib/src/vespa/vespalib/data/smart_buffer.h b/vespalib/src/vespa/vespalib/data/smart_buffer.h index f7c4dd05c3e..c63c948b07d 100644 --- a/vespalib/src/vespa/vespalib/data/smart_buffer.h +++ b/vespalib/src/vespa/vespalib/data/smart_buffer.h @@ -28,10 +28,17 @@ private: size_t unused() const { return (_data.size() - read_len()); } void ensure_free(size_t bytes); + void drop(); + public: SmartBuffer(size_t initial_size); ~SmartBuffer(); size_t capacity() const { return _data.size(); } + void drop_if_empty() { + if ((read_len() == 0) && (_data.size() > 0)) { + drop(); + } + } Memory obtain() override; Input &evict(size_t bytes) override; WritableMemory reserve(size_t bytes) override; diff --git a/vespalib/src/vespa/vespalib/net/crypto_engine.cpp b/vespalib/src/vespa/vespalib/net/crypto_engine.cpp index 81ff28f17a1..a59bc6a9869 100644 --- a/vespalib/src/vespa/vespalib/net/crypto_engine.cpp +++ b/vespalib/src/vespa/vespalib/net/crypto_engine.cpp @@ -53,6 +53,7 @@ public: ssize_t write(const char *buf, size_t len) override { return _socket.write(buf, len); } ssize_t flush() override { return 0; } ssize_t half_close() override { return _socket.half_close(); } + void drop_empty_buffers() override {} }; class XorCryptoSocket : public CryptoSocket @@ -186,6 +187,10 @@ public: } return _socket.half_close(); } + void drop_empty_buffers() override { + _input.drop_if_empty(); + _output.drop_if_empty(); + } }; using net::tls::AuthorizationMode; diff --git a/vespalib/src/vespa/vespalib/net/crypto_socket.h b/vespalib/src/vespa/vespalib/net/crypto_socket.h index d51a97e2743..91af71296de 100644 --- a/vespalib/src/vespa/vespalib/net/crypto_socket.h +++ b/vespalib/src/vespa/vespalib/net/crypto_socket.h @@ -136,6 +136,13 @@ struct CryptoSocket { **/ virtual ssize_t half_close() = 0; + /** + * This function can be called at any time to drop any currently + * empty internal buffers. Typically called after drain or flush + * indicates that no further progress can be made. + **/ + virtual void drop_empty_buffers() = 0; + virtual ~CryptoSocket(); }; diff --git a/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.cpp b/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.cpp index 660eee95132..4c0533a409a 100644 --- a/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.cpp +++ b/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.cpp @@ -201,4 +201,11 @@ CryptoCodecAdapter::half_close() return _socket.half_close(); } +void +CryptoCodecAdapter::drop_empty_buffers() +{ + _input.drop_if_empty(); + _output.drop_if_empty(); +} + } // namespace vespalib::net::tls diff --git a/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.h b/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.h index a31e8c5dfed..372a2191a88 100644 --- a/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.h +++ b/vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.h @@ -45,6 +45,7 @@ public: ssize_t write(const char *buf, size_t len) override; ssize_t flush() override; ssize_t half_close() override; + void drop_empty_buffers() override; }; } // namespace vespalib::net::tls diff --git a/vespalib/src/vespa/vespalib/net/tls/maybe_tls_crypto_socket.cpp b/vespalib/src/vespa/vespalib/net/tls/maybe_tls_crypto_socket.cpp index d5ab1113013..3035387e4f0 100644 --- a/vespalib/src/vespa/vespalib/net/tls/maybe_tls_crypto_socket.cpp +++ b/vespalib/src/vespa/vespalib/net/tls/maybe_tls_crypto_socket.cpp @@ -77,12 +77,14 @@ public: if (frame > 0) { memcpy(buf, src.data, frame); _buffer.evict(frame); + _buffer.drop_if_empty(); } return frame; } ssize_t write(const char *buf, size_t len) override { return _socket.write(buf, len); } ssize_t flush() override { return 0; } ssize_t half_close() override { return _socket.half_close(); } + void drop_empty_buffers() override {} }; } // namespace vespalib::<unnamed> diff --git a/vespalib/src/vespa/vespalib/net/tls/maybe_tls_crypto_socket.h b/vespalib/src/vespa/vespalib/net/tls/maybe_tls_crypto_socket.h index cd2d84bcc08..2768bc0fc52 100644 --- a/vespalib/src/vespa/vespalib/net/tls/maybe_tls_crypto_socket.h +++ b/vespalib/src/vespa/vespalib/net/tls/maybe_tls_crypto_socket.h @@ -32,6 +32,7 @@ public: ssize_t write(const char *buf, size_t len) override { return _socket->write(buf, len); } ssize_t flush() override { return _socket->flush(); } ssize_t half_close() override { return _socket->half_close(); } + void drop_empty_buffers() override { _socket->drop_empty_buffers(); } }; } // namespace vespalib |