summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHåvard Pettersen <havardpe@oath.com>2021-06-01 09:13:14 +0000
committerHåvard Pettersen <havardpe@oath.com>2021-06-01 11:22:31 +0000
commit5a66d61ea772f59583c9af03087014d74051fecf (patch)
tree77dda4d754178a287eb98c53b0789eccca2abb7b /vespalib
parent97bb8e47324450b1cd2ec77a5ee2b03686631bce (diff)
drop empty buffers
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/vespa/vespalib/data/smart_buffer.cpp9
-rw-r--r--vespalib/src/vespa/vespalib/data/smart_buffer.h7
-rw-r--r--vespalib/src/vespa/vespalib/net/crypto_engine.cpp5
-rw-r--r--vespalib/src/vespa/vespalib/net/crypto_socket.h7
-rw-r--r--vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.cpp7
-rw-r--r--vespalib/src/vespa/vespalib/net/tls/crypto_codec_adapter.h1
-rw-r--r--vespalib/src/vespa/vespalib/net/tls/maybe_tls_crypto_socket.cpp2
-rw-r--r--vespalib/src/vespa/vespalib/net/tls/maybe_tls_crypto_socket.h1
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