From d693aa53482d859461068757a3c0084360fdfcc0 Mon Sep 17 00:00:00 2001 From: jackjoesh Date: Tue, 6 Jul 2021 17:04:01 +0800 Subject: [PATCH 1/3] avoid flush repeatedly when has finished flushing (#839) * avoid repeat flush when position finish * Formatting Co-authored-by: jerry.l Co-authored-by: Thomas Heigl --- .../kryo/io/OutputChunked.java | 216 +++++++++--------- 1 file changed, 107 insertions(+), 109 deletions(-) diff --git a/src/com/esotericsoftware/kryo/io/OutputChunked.java b/src/com/esotericsoftware/kryo/io/OutputChunked.java index 207442aa9..74d912c77 100644 --- a/src/com/esotericsoftware/kryo/io/OutputChunked.java +++ b/src/com/esotericsoftware/kryo/io/OutputChunked.java @@ -1,109 +1,107 @@ -/* Copyright (c) 2008, Nathan Sweet - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the distribution. - * - Neither the name of Esoteric Software nor the names of its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -package com.esotericsoftware.kryo.io; - -import static com.esotericsoftware.minlog.Log.*; - -import java.io.IOException; -import java.io.OutputStream; - -import com.esotericsoftware.kryo.KryoException; - -/** An OutputStream that buffers data in a byte array and flushes to another OutputStream, writing the length before each flush. - * The length allows the chunks to be skipped when reading. - * @author Nathan Sweet */ -public class OutputChunked extends Output { - /** Creates an uninitialized OutputChunked with a maximum chunk size of 2048. The OutputStream must be set before it can be - * used. */ - public OutputChunked () { - super(2048); - } - - /** Creates an uninitialized OutputChunked. The OutputStream must be set before it can be used. - * @param bufferSize The maximum size of a chunk. */ - public OutputChunked (int bufferSize) { - super(bufferSize); - } - - /** Creates an OutputChunked with a maximum chunk size of 2048. */ - public OutputChunked (OutputStream outputStream) { - super(outputStream, 2048); - } - - /** @param bufferSize The maximum size of a chunk. */ - public OutputChunked (OutputStream outputStream, int bufferSize) { - super(outputStream, bufferSize); - } - - public void flush () throws KryoException { - if (position() > 0) { - try { - writeChunkSize(); - super.flush(); - } catch (IOException ex) { - throw new KryoException(ex); - } - } - super.flush(); - } - - private void writeChunkSize () throws IOException { - int size = position(); - if (TRACE) trace("kryo", "Write chunk: " + size); - OutputStream outputStream = getOutputStream(); - if ((size & ~0x7F) == 0) { - outputStream.write(size); - return; - } - outputStream.write((size & 0x7F) | 0x80); - size >>>= 7; - if ((size & ~0x7F) == 0) { - outputStream.write(size); - return; - } - outputStream.write((size & 0x7F) | 0x80); - size >>>= 7; - if ((size & ~0x7F) == 0) { - outputStream.write(size); - return; - } - outputStream.write((size & 0x7F) | 0x80); - size >>>= 7; - if ((size & ~0x7F) == 0) { - outputStream.write(size); - return; - } - outputStream.write((size & 0x7F) | 0x80); - size >>>= 7; - outputStream.write(size); - } - - /** Marks the end of some data that may have been written by any number of chunks. These chunks can then be skipped when - * reading. */ - public void endChunks () { - flush(); // Flush any partial chunk. - if (TRACE) trace("kryo", "End chunks."); - try { - getOutputStream().write(0); // Zero length chunk. - } catch (IOException ex) { - throw new KryoException(ex); - } - } -} +/* Copyright (c) 2008-2020, Nathan Sweet + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the distribution. + * - Neither the name of Esoteric Software nor the names of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +package com.esotericsoftware.kryo.io; + +import static com.esotericsoftware.kryo.util.Util.*; +import static com.esotericsoftware.minlog.Log.*; + +import com.esotericsoftware.kryo.KryoException; + +import java.io.IOException; +import java.io.OutputStream; + +/** An {@link Output} that writes the length before each flush. The length allows the chunks to be skipped when reading. + * @author Nathan Sweet */ +public class OutputChunked extends Output { + /** @see Output#Output() */ + public OutputChunked () { + super(); + } + + /** @see Output#Output(int) */ + public OutputChunked (int bufferSize) { + super(bufferSize); + } + + /** @see Output#Output(OutputStream) */ + public OutputChunked (OutputStream outputStream) { + super(outputStream); + } + + /** @see Output#Output(OutputStream, int) */ + public OutputChunked (OutputStream outputStream, int bufferSize) { + super(outputStream, bufferSize); + } + + public void flush () throws KryoException { + if (position() > 0) { + try { + writeChunkSize(); + super.flush(); + } catch (IOException ex) { + throw new KryoException(ex); + } + } else { + super.flush(); + } + } + + private void writeChunkSize () throws IOException { + int size = position(); + if (TRACE) trace("kryo", "Write chunk: " + size + pos(size)); + OutputStream outputStream = getOutputStream(); + if ((size & ~0x7F) == 0) { + outputStream.write(size); + return; + } + outputStream.write((size & 0x7F) | 0x80); + size >>>= 7; + if ((size & ~0x7F) == 0) { + outputStream.write(size); + return; + } + outputStream.write((size & 0x7F) | 0x80); + size >>>= 7; + if ((size & ~0x7F) == 0) { + outputStream.write(size); + return; + } + outputStream.write((size & 0x7F) | 0x80); + size >>>= 7; + if ((size & ~0x7F) == 0) { + outputStream.write(size); + return; + } + outputStream.write((size & 0x7F) | 0x80); + size >>>= 7; + outputStream.write(size); + } + + /** Marks the current written data as the end of a chunk. This chunk can then be skipped when reading. */ + public void endChunk () { + flush(); + if (TRACE) trace("kryo", "End chunk."); + try { + getOutputStream().write(0); // Zero length chunk. + } catch (IOException ex) { + throw new KryoException(ex); + } + } +} From 91c5d0cf1aa8da8c26e2d37a7f7898111d9fd4ff Mon Sep 17 00:00:00 2001 From: Ankit Singhal Date: Wed, 10 May 2023 15:45:55 +0530 Subject: [PATCH 2/3] Revert "avoid flush repeatedly when has finished flushing (#839)" This reverts commit d693aa53482d859461068757a3c0084360fdfcc0. --- .../kryo/io/OutputChunked.java | 216 +++++++++--------- 1 file changed, 109 insertions(+), 107 deletions(-) diff --git a/src/com/esotericsoftware/kryo/io/OutputChunked.java b/src/com/esotericsoftware/kryo/io/OutputChunked.java index 74d912c77..207442aa9 100644 --- a/src/com/esotericsoftware/kryo/io/OutputChunked.java +++ b/src/com/esotericsoftware/kryo/io/OutputChunked.java @@ -1,107 +1,109 @@ -/* Copyright (c) 2008-2020, Nathan Sweet - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following - * conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with the distribution. - * - Neither the name of Esoteric Software nor the names of its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -package com.esotericsoftware.kryo.io; - -import static com.esotericsoftware.kryo.util.Util.*; -import static com.esotericsoftware.minlog.Log.*; - -import com.esotericsoftware.kryo.KryoException; - -import java.io.IOException; -import java.io.OutputStream; - -/** An {@link Output} that writes the length before each flush. The length allows the chunks to be skipped when reading. - * @author Nathan Sweet */ -public class OutputChunked extends Output { - /** @see Output#Output() */ - public OutputChunked () { - super(); - } - - /** @see Output#Output(int) */ - public OutputChunked (int bufferSize) { - super(bufferSize); - } - - /** @see Output#Output(OutputStream) */ - public OutputChunked (OutputStream outputStream) { - super(outputStream); - } - - /** @see Output#Output(OutputStream, int) */ - public OutputChunked (OutputStream outputStream, int bufferSize) { - super(outputStream, bufferSize); - } - - public void flush () throws KryoException { - if (position() > 0) { - try { - writeChunkSize(); - super.flush(); - } catch (IOException ex) { - throw new KryoException(ex); - } - } else { - super.flush(); - } - } - - private void writeChunkSize () throws IOException { - int size = position(); - if (TRACE) trace("kryo", "Write chunk: " + size + pos(size)); - OutputStream outputStream = getOutputStream(); - if ((size & ~0x7F) == 0) { - outputStream.write(size); - return; - } - outputStream.write((size & 0x7F) | 0x80); - size >>>= 7; - if ((size & ~0x7F) == 0) { - outputStream.write(size); - return; - } - outputStream.write((size & 0x7F) | 0x80); - size >>>= 7; - if ((size & ~0x7F) == 0) { - outputStream.write(size); - return; - } - outputStream.write((size & 0x7F) | 0x80); - size >>>= 7; - if ((size & ~0x7F) == 0) { - outputStream.write(size); - return; - } - outputStream.write((size & 0x7F) | 0x80); - size >>>= 7; - outputStream.write(size); - } - - /** Marks the current written data as the end of a chunk. This chunk can then be skipped when reading. */ - public void endChunk () { - flush(); - if (TRACE) trace("kryo", "End chunk."); - try { - getOutputStream().write(0); // Zero length chunk. - } catch (IOException ex) { - throw new KryoException(ex); - } - } -} +/* Copyright (c) 2008, Nathan Sweet + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided with the distribution. + * - Neither the name of Esoteric Software nor the names of its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +package com.esotericsoftware.kryo.io; + +import static com.esotericsoftware.minlog.Log.*; + +import java.io.IOException; +import java.io.OutputStream; + +import com.esotericsoftware.kryo.KryoException; + +/** An OutputStream that buffers data in a byte array and flushes to another OutputStream, writing the length before each flush. + * The length allows the chunks to be skipped when reading. + * @author Nathan Sweet */ +public class OutputChunked extends Output { + /** Creates an uninitialized OutputChunked with a maximum chunk size of 2048. The OutputStream must be set before it can be + * used. */ + public OutputChunked () { + super(2048); + } + + /** Creates an uninitialized OutputChunked. The OutputStream must be set before it can be used. + * @param bufferSize The maximum size of a chunk. */ + public OutputChunked (int bufferSize) { + super(bufferSize); + } + + /** Creates an OutputChunked with a maximum chunk size of 2048. */ + public OutputChunked (OutputStream outputStream) { + super(outputStream, 2048); + } + + /** @param bufferSize The maximum size of a chunk. */ + public OutputChunked (OutputStream outputStream, int bufferSize) { + super(outputStream, bufferSize); + } + + public void flush () throws KryoException { + if (position() > 0) { + try { + writeChunkSize(); + super.flush(); + } catch (IOException ex) { + throw new KryoException(ex); + } + } + super.flush(); + } + + private void writeChunkSize () throws IOException { + int size = position(); + if (TRACE) trace("kryo", "Write chunk: " + size); + OutputStream outputStream = getOutputStream(); + if ((size & ~0x7F) == 0) { + outputStream.write(size); + return; + } + outputStream.write((size & 0x7F) | 0x80); + size >>>= 7; + if ((size & ~0x7F) == 0) { + outputStream.write(size); + return; + } + outputStream.write((size & 0x7F) | 0x80); + size >>>= 7; + if ((size & ~0x7F) == 0) { + outputStream.write(size); + return; + } + outputStream.write((size & 0x7F) | 0x80); + size >>>= 7; + if ((size & ~0x7F) == 0) { + outputStream.write(size); + return; + } + outputStream.write((size & 0x7F) | 0x80); + size >>>= 7; + outputStream.write(size); + } + + /** Marks the end of some data that may have been written by any number of chunks. These chunks can then be skipped when + * reading. */ + public void endChunks () { + flush(); // Flush any partial chunk. + if (TRACE) trace("kryo", "End chunks."); + try { + getOutputStream().write(0); // Zero length chunk. + } catch (IOException ex) { + throw new KryoException(ex); + } + } +} From d32069fa928e02d5d55e98f5014cdcdd6cfc5867 Mon Sep 17 00:00:00 2001 From: Ankit Singhal Date: Wed, 10 May 2023 15:48:48 +0530 Subject: [PATCH 3/3] avoid flush repeatedly when has finished flushing --- src/com/esotericsoftware/kryo/io/OutputChunked.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/esotericsoftware/kryo/io/OutputChunked.java b/src/com/esotericsoftware/kryo/io/OutputChunked.java index 207442aa9..56f5fe436 100644 --- a/src/com/esotericsoftware/kryo/io/OutputChunked.java +++ b/src/com/esotericsoftware/kryo/io/OutputChunked.java @@ -60,8 +60,9 @@ public void flush () throws KryoException { } catch (IOException ex) { throw new KryoException(ex); } + } else { + super.flush(); } - super.flush(); } private void writeChunkSize () throws IOException {