From 8b889a0e28faee02bfc1b128835a9ecbd3d3fe44 Mon Sep 17 00:00:00 2001 From: Santiago Pericasgeertsen Date: Mon, 8 Jan 2024 17:19:03 -0500 Subject: [PATCH] Avoid buffer copies during writes. Signed-off-by: Santiago Pericasgeertsen --- .../buffers/CompositeArrayBufferData.java | 19 ++++++++++++++++++- .../buffers/CompositeListBufferData.java | 19 ++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/common/buffers/src/main/java/io/helidon/common/buffers/CompositeArrayBufferData.java b/common/buffers/src/main/java/io/helidon/common/buffers/CompositeArrayBufferData.java index c9d33a6cccd..d3a31ea2b4a 100644 --- a/common/buffers/src/main/java/io/helidon/common/buffers/CompositeArrayBufferData.java +++ b/common/buffers/src/main/java/io/helidon/common/buffers/CompositeArrayBufferData.java @@ -38,7 +38,24 @@ public BufferData rewind() { @Override public void writeTo(OutputStream out) { - copy().writeTo(out); + /* + if (data.length == 1) { + data[0].writeTo(out); + } else { + copy().writeTo(out); + } + */ + for (BufferData datum : data) { + if (datum instanceof CompositeBufferData) { + datum.writeTo(out); + } else { + int available = datum.available(); + if (available > 0) { + datum.writeTo(out); + datum.skip(-available); + } + } + } } @Override diff --git a/common/buffers/src/main/java/io/helidon/common/buffers/CompositeListBufferData.java b/common/buffers/src/main/java/io/helidon/common/buffers/CompositeListBufferData.java index bf5fcdaefec..a7ec6ab353e 100644 --- a/common/buffers/src/main/java/io/helidon/common/buffers/CompositeListBufferData.java +++ b/common/buffers/src/main/java/io/helidon/common/buffers/CompositeListBufferData.java @@ -56,7 +56,24 @@ public BufferData rewind() { @Override public void writeTo(OutputStream out) { - copy().writeTo(out); + /* + if (data.size() == 1) { + data.get(0).writeTo(out); + } else { + copy().writeTo(out); + } + */ + for (BufferData datum : data) { + if (datum instanceof CompositeBufferData) { + datum.writeTo(out); + } else { + int available = datum.available(); + if (available > 0) { + datum.writeTo(out); + datum.skip(-available); + } + } + } } @Override