From 7eb69f4fa4d87203289d26723a287339e59a524d 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 --- .../common/buffers/CompositeArrayBufferData.java | 14 ++++++++++++-- .../common/buffers/CompositeListBufferData.java | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 4 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..f7abee18b39 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Oracle and/or its affiliates. + * Copyright (c) 2022, 2024 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,7 +38,17 @@ public BufferData rewind() { @Override public void writeTo(OutputStream out) { - 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..9957a3911d8 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Oracle and/or its affiliates. + * Copyright (c) 2022, 2024 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -56,7 +56,17 @@ public BufferData rewind() { @Override public void writeTo(OutputStream out) { - 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