From 1143223407f091e16387bb472e8d725961c7d3c8 Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Thu, 20 May 2021 18:57:31 +0200 Subject: [PATCH 01/11] First draft of splitting the repo into multiple modules and allowing builds with Java 11 --- Dockerfile | 6 +- buffer-api/pom.xml | 43 +++ .../io/netty/buffer/api/AllocatorControl.java | 0 .../main/java/io/netty/buffer/api/Buffer.java | 0 .../io/netty/buffer/api/BufferAccessors.java | 0 .../io/netty/buffer/api/BufferAllocator.java | 0 .../io/netty/buffer/api/BufferHolder.java | 5 +- .../java/io/netty/buffer/api/BufferRef.java | 0 .../java/io/netty/buffer/api/ByteCursor.java | 0 .../io/netty/buffer/api/CompositeBuffer.java | 0 .../main/java/io/netty/buffer/api/Drop.java | 0 .../io/netty/buffer/api/LifecycleTracer.java | 2 - .../buffer/api/ManagedBufferAllocator.java | 0 .../io/netty/buffer/api/MemoryManager.java | 0 .../io/netty/buffer/api/MemoryManagers.java | 0 .../buffer/api/MemoryManagersOverride.java | 4 +- .../main/java/io/netty/buffer/api/Owned.java | 0 .../main/java/io/netty/buffer/api/Rc.java | 0 .../java/io/netty/buffer/api/RcSupport.java | 0 .../netty/buffer/api/ReadableComponent.java | 0 .../api/ReadableComponentProcessor.java | 0 .../api/ResourceDisposeFailedException.java | 0 .../main/java/io/netty/buffer/api/Scope.java | 0 .../main/java/io/netty/buffer/api/Send.java | 0 .../io/netty/buffer/api/TransferSend.java | 5 +- .../netty/buffer/api/WritableComponent.java | 0 .../api/WritableComponentProcessor.java | 0 .../api/adaptor/BufferIntegratable.java | 0 .../buffer/api/adaptor/ByteBufAdaptor.java | 7 +- .../api/adaptor/ByteBufAllocatorAdaptor.java | 0 .../buffer/api/adaptor/package-info.java | 0 .../bytebuffer/ByteBufferMemoryManager.java | 3 +- .../bytebuffer/ByteBufferMemoryManagers.java | 0 .../buffer/api/bytebuffer/NioBuffer.java | 20 +- .../buffer/api/bytebuffer/package-info.java | 0 .../io/netty/buffer/api/internal/ArcDrop.java | 0 .../buffer/api/internal/CleanerDrop.java | 2 - .../io/netty/buffer/api/internal/Statics.java | 20 + .../buffer/api/internal/package-info.java | 0 .../io/netty/buffer/api/package-info.java | 0 .../api/pool/BufferAllocatorMetric.java | 0 .../pool/BufferAllocatorMetricProvider.java | 0 .../buffer/api/pool/LongLongHashMap.java | 0 .../buffer/api/pool/LongPriorityQueue.java | 0 .../io/netty/buffer/api/pool/PoolArena.java | 0 .../buffer/api/pool/PoolArenaMetric.java | 0 .../io/netty/buffer/api/pool/PoolChunk.java | 2 +- .../netty/buffer/api/pool/PoolChunkList.java | 0 .../buffer/api/pool/PoolChunkListMetric.java | 0 .../buffer/api/pool/PoolChunkMetric.java | 0 .../io/netty/buffer/api/pool/PoolSubpage.java | 0 .../buffer/api/pool/PoolSubpageMetric.java | 0 .../buffer/api/pool/PoolThreadCache.java | 0 .../api/pool/PooledAllocatorControl.java | 0 .../api/pool/PooledBufferAllocator.java | 28 +- .../api/pool/PooledBufferAllocatorMetric.java | 0 .../io/netty/buffer/api/pool/PooledDrop.java | 0 .../io/netty/buffer/api/pool/SizeClasses.java | 363 +++++++++++------- .../buffer/api/pool/SizeClassesMetric.java | 0 .../api/pool/UnpooledUnthetheredMemory.java | 0 .../netty/buffer/api/pool/package-info.java | 0 .../netty/buffer/api/unsafe/CleanerDrop.java | 0 .../netty/buffer/api/unsafe/UnsafeBuffer.java | 7 +- .../netty/buffer/api/unsafe/UnsafeMemory.java | 0 .../api/unsafe/UnsafeMemoryManager.java | 0 .../api/unsafe/UnsafeMemoryManagers.java | 0 .../netty/buffer/api/unsafe/package-info.java | 0 buffer-api/src/main/java/module-info.java | 43 +++ buffer-memseg/pom.xml | 72 ++++ .../memseg/AbstractMemorySegmentManager.java | 11 +- .../api/memseg/HeapMemorySegmentManager.java | 0 .../netty/buffer/api/memseg/MemSegBuffer.java | 32 +- .../memseg/NativeMemorySegmentManager.java | 7 +- .../api/memseg/SegmentMemoryManagers.java | 0 .../netty/buffer/api/memseg/package-info.java | 0 .../src}/main/java/module-info.java | 19 +- .../benchmarks/MemSegBufAccessBenchmark.java | 2 +- .../MemorySegmentCloseBenchmark.java | 2 +- ...MemorySegmentClosedByCleanerBenchmark.java | 39 +- buffer-tests/pom.xml | 96 +++++ buffer-tests/src/main/java/module-info.java | 25 ++ .../api/tests}/BufferBulkAccessTest.java | 6 +- .../BufferByteOffsettedAccessorsTest.java | 4 +- .../BufferCharOffsettedAccessorsTest.java | 4 +- .../buffer/api/tests}/BufferCleanerTest.java | 16 +- .../buffer/api/tests}/BufferCompactTest.java | 4 +- .../tests}/BufferComponentIterationTest.java | 6 +- .../api/tests}/BufferCompositionTest.java | 5 +- .../BufferDoubleOffsettedAccessorsTest.java | 4 +- .../api/tests}/BufferEnsureWritableTest.java | 5 +- .../BufferFloatOffsettedAccessorsTest.java | 4 +- .../BufferIntOffsettedAccessorsTest.java | 4 +- .../BufferLongOffsettedAccessorsTest.java | 4 +- .../BufferMediumOffsettedAccessorsTest.java | 4 +- .../buffer/api/tests}/BufferOffsetsTest.java | 4 +- .../BufferPrimitiveRelativeAccessorsTest.java | 4 +- .../buffer/api/tests}/BufferReadOnlyTest.java | 6 +- .../buffer/api/tests}/BufferRefTest.java | 6 +- .../tests}/BufferReferenceCountingTest.java | 24 +- .../buffer/api/tests}/BufferSendTest.java | 6 +- .../BufferShortOffsettedAccessorsTest.java | 4 +- .../buffer/api/tests}/BufferTestSupport.java | 38 +- .../BufferWriteBytesCombinationsTest.java | 4 +- .../io/netty/buffer/api/tests}/EchoIT.java | 6 +- .../io/netty/buffer/api/tests}/Fixture.java | 4 +- .../io/netty/buffer/api/tests}/Memoize.java | 2 +- .../io/netty/buffer/api/tests}/ScopeTest.java | 6 +- .../tests}/adaptor/AbstractByteBufTest.java | 2 +- .../tests}/adaptor/ByteBufAdaptorTest.java | 3 +- .../benchmarks/ByteIterationBenchmark.java | 2 +- .../api/tests}/benchmarks/SendBenchmark.java | 2 +- .../api/tests}/examples/AsyncExample.java | 2 +- .../examples/ComposingAndSlicingExample.java | 4 +- .../api/tests}/examples/FileCopyExample.java | 4 +- .../api/tests}/examples/SendExample.java | 4 +- .../AlternativeMessageDecoder.java | 4 +- .../AlternativeMessageDecoderTest.java | 6 +- .../ByteToMessageDecoder.java | 4 +- .../ByteToMessageDecoderTest.java | 71 ++-- .../FixedLengthFrameDecoder.java | 2 +- .../api/tests}/examples/echo/EchoClient.java | 2 +- .../examples/echo/EchoClientHandler.java | 4 +- .../api/tests}/examples/echo/EchoServer.java | 2 +- .../examples/echo/EchoServerHandler.java | 4 +- .../examples/http/snoop/HttpSnoopClient.java | 2 +- .../http/snoop/HttpSnoopClientHandler.java | 2 +- .../snoop/HttpSnoopClientInitializer.java | 2 +- .../examples/http/snoop/HttpSnoopServer.java | 2 +- .../http/snoop/HttpSnoopServerHandler.java | 2 +- .../snoop/HttpSnoopServerInitializer.java | 2 +- .../http/upload/HttpUploadClient.java | 2 +- .../http/upload/HttpUploadClientHandler.java | 2 +- .../upload/HttpUploadClientInitializer.java | 2 +- .../http/upload/HttpUploadServer.java | 2 +- .../http/upload/HttpUploadServerHandler.java | 2 +- .../upload/HttpUploadServerInitializer.java | 2 +- pom.xml | 237 +++++++----- 137 files changed, 977 insertions(+), 455 deletions(-) create mode 100644 buffer-api/pom.xml rename {src => buffer-api/src}/main/java/io/netty/buffer/api/AllocatorControl.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/Buffer.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/BufferAccessors.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/BufferAllocator.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/BufferHolder.java (97%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/BufferRef.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/ByteCursor.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/CompositeBuffer.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/Drop.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/LifecycleTracer.java (99%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/ManagedBufferAllocator.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/MemoryManager.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/MemoryManagers.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/MemoryManagersOverride.java (92%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/Owned.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/Rc.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/RcSupport.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/ReadableComponent.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/ReadableComponentProcessor.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/ResourceDisposeFailedException.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/Scope.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/Send.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/TransferSend.java (91%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/WritableComponent.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/WritableComponentProcessor.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/adaptor/BufferIntegratable.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java (99%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/adaptor/ByteBufAllocatorAdaptor.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/adaptor/package-info.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManager.java (96%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManagers.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java (97%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/bytebuffer/package-info.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/internal/ArcDrop.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/internal/CleanerDrop.java (98%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/internal/Statics.java (76%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/internal/package-info.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/package-info.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/BufferAllocatorMetric.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/BufferAllocatorMetricProvider.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/LongLongHashMap.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/LongPriorityQueue.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PoolArena.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PoolArenaMetric.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PoolChunk.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PoolChunkList.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PoolChunkListMetric.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PoolChunkMetric.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PoolSubpage.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PoolSubpageMetric.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PoolThreadCache.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PooledAllocatorControl.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PooledBufferAllocator.java (97%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PooledBufferAllocatorMetric.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/PooledDrop.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/SizeClasses.java (56%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/SizeClassesMetric.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/UnpooledUnthetheredMemory.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/pool/package-info.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/unsafe/CleanerDrop.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java (99%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/unsafe/UnsafeMemory.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManager.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManagers.java (100%) rename {src => buffer-api/src}/main/java/io/netty/buffer/api/unsafe/package-info.java (100%) create mode 100644 buffer-api/src/main/java/module-info.java create mode 100644 buffer-memseg/pom.xml rename {src => buffer-memseg/src}/main/java/io/netty/buffer/api/memseg/AbstractMemorySegmentManager.java (89%) rename {src => buffer-memseg/src}/main/java/io/netty/buffer/api/memseg/HeapMemorySegmentManager.java (100%) rename {src => buffer-memseg/src}/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java (98%) rename {src => buffer-memseg/src}/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java (91%) rename {src => buffer-memseg/src}/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java (100%) rename {src => buffer-memseg/src}/main/java/io/netty/buffer/api/memseg/package-info.java (100%) rename {src => buffer-memseg/src}/main/java/module-info.java (69%) rename {src/test/java/io/netty/buffer/api => buffer-memseg/src/test/java/io/netty/buffer/api/memseg}/benchmarks/MemSegBufAccessBenchmark.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-memseg/src/test/java/io/netty/buffer/api/memseg}/benchmarks/MemorySegmentCloseBenchmark.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-memseg/src/test/java/io/netty/buffer/api/memseg}/benchmarks/MemorySegmentClosedByCleanerBenchmark.java (76%) create mode 100644 buffer-tests/pom.xml create mode 100644 buffer-tests/src/main/java/module-info.java rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferBulkAccessTest.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferByteOffsettedAccessorsTest.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferCharOffsettedAccessorsTest.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferCleanerTest.java (82%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferCompactTest.java (95%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferComponentIterationTest.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferCompositionTest.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferDoubleOffsettedAccessorsTest.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferEnsureWritableTest.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferFloatOffsettedAccessorsTest.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferIntOffsettedAccessorsTest.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferLongOffsettedAccessorsTest.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferMediumOffsettedAccessorsTest.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferOffsetsTest.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferPrimitiveRelativeAccessorsTest.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferReadOnlyTest.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferRefTest.java (95%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferReferenceCountingTest.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferSendTest.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferShortOffsettedAccessorsTest.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferTestSupport.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/BufferWriteBytesCombinationsTest.java (96%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/EchoIT.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/Fixture.java (96%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/Memoize.java (96%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/ScopeTest.java (92%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/adaptor/AbstractByteBufTest.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/adaptor/ByteBufAdaptorTest.java (96%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/benchmarks/ByteIterationBenchmark.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/benchmarks/SendBenchmark.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/AsyncExample.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/ComposingAndSlicingExample.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/FileCopyExample.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/SendExample.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/bytetomessagedecoder/AlternativeMessageDecoder.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/bytetomessagedecoder/AlternativeMessageDecoderTest.java (96%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/bytetomessagedecoder/ByteToMessageDecoder.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java (85%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/bytetomessagedecoder/FixedLengthFrameDecoder.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/echo/EchoClient.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/echo/EchoClientHandler.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/echo/EchoServer.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/echo/EchoServerHandler.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/snoop/HttpSnoopClient.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/snoop/HttpSnoopClientHandler.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/snoop/HttpSnoopClientInitializer.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/snoop/HttpSnoopServer.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/snoop/HttpSnoopServerHandler.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/snoop/HttpSnoopServerInitializer.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/upload/HttpUploadClient.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/upload/HttpUploadClientHandler.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/upload/HttpUploadClientInitializer.java (97%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/upload/HttpUploadServer.java (98%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/upload/HttpUploadServerHandler.java (99%) rename {src/test/java/io/netty/buffer/api => buffer-tests/src/test/java/io/netty/buffer/api/tests}/examples/http/upload/HttpUploadServerInitializer.java (96%) diff --git a/Dockerfile b/Dockerfile index 3b35ae9..b55f483 100644 --- a/Dockerfile +++ b/Dockerfile @@ -29,8 +29,12 @@ RUN git clone --depth 1 -b master https://github.com/netty/netty.git netty \ && rm -fr netty # Prepare our own build +RUN mkdir buffer-api && mkdir buffer-memseg && mkdir buffer-tests COPY pom.xml pom.xml -RUN mvn dependency:go-offline surefire:test checkstyle:check -ntp +COPY buffer-api/pom.xml buffer-api/pom.xml +COPY buffer-memseg/pom.xml buffer-memseg/pom.xml +COPY buffer-tests/pom.xml buffer-tests/pom.xml +RUN mvn install dependency:go-offline surefire:test checkstyle:check -ntp # Copy over the project code and run our build COPY . . diff --git a/buffer-api/pom.xml b/buffer-api/pom.xml new file mode 100644 index 0000000..a78b473 --- /dev/null +++ b/buffer-api/pom.xml @@ -0,0 +1,43 @@ + + + + 4.0.0 + + + io.netty.incubator + netty-incubator-buffer-parent + 0.0.1.Final-SNAPSHOT + + + netty-incubator-buffer-api + 0.0.1.Final-SNAPSHOT + Netty/Incubator/Buffer + jar + + + + io.netty + netty-common + + + io.netty + netty-buffer + + + \ No newline at end of file diff --git a/src/main/java/io/netty/buffer/api/AllocatorControl.java b/buffer-api/src/main/java/io/netty/buffer/api/AllocatorControl.java similarity index 100% rename from src/main/java/io/netty/buffer/api/AllocatorControl.java rename to buffer-api/src/main/java/io/netty/buffer/api/AllocatorControl.java diff --git a/src/main/java/io/netty/buffer/api/Buffer.java b/buffer-api/src/main/java/io/netty/buffer/api/Buffer.java similarity index 100% rename from src/main/java/io/netty/buffer/api/Buffer.java rename to buffer-api/src/main/java/io/netty/buffer/api/Buffer.java diff --git a/src/main/java/io/netty/buffer/api/BufferAccessors.java b/buffer-api/src/main/java/io/netty/buffer/api/BufferAccessors.java similarity index 100% rename from src/main/java/io/netty/buffer/api/BufferAccessors.java rename to buffer-api/src/main/java/io/netty/buffer/api/BufferAccessors.java diff --git a/src/main/java/io/netty/buffer/api/BufferAllocator.java b/buffer-api/src/main/java/io/netty/buffer/api/BufferAllocator.java similarity index 100% rename from src/main/java/io/netty/buffer/api/BufferAllocator.java rename to buffer-api/src/main/java/io/netty/buffer/api/BufferAllocator.java diff --git a/src/main/java/io/netty/buffer/api/BufferHolder.java b/buffer-api/src/main/java/io/netty/buffer/api/BufferHolder.java similarity index 97% rename from src/main/java/io/netty/buffer/api/BufferHolder.java rename to buffer-api/src/main/java/io/netty/buffer/api/BufferHolder.java index e17600d..0c0d66b 100644 --- a/src/main/java/io/netty/buffer/api/BufferHolder.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/BufferHolder.java @@ -15,10 +15,11 @@ */ package io.netty.buffer.api; +import io.netty.buffer.api.internal.Statics; + import java.lang.invoke.VarHandle; import java.util.Objects; -import static io.netty.buffer.api.internal.Statics.findVarHandle; import static java.lang.invoke.MethodHandles.lookup; /** @@ -36,7 +37,7 @@ import static java.lang.invoke.MethodHandles.lookup; * @param The concrete {@link BufferHolder} type. */ public abstract class BufferHolder> implements Rc { - private static final VarHandle BUF = findVarHandle(lookup(), BufferHolder.class, "buf", Buffer.class); + private static final VarHandle BUF = Statics.findVarHandle(lookup(), BufferHolder.class, "buf", Buffer.class); private Buffer buf; /** diff --git a/src/main/java/io/netty/buffer/api/BufferRef.java b/buffer-api/src/main/java/io/netty/buffer/api/BufferRef.java similarity index 100% rename from src/main/java/io/netty/buffer/api/BufferRef.java rename to buffer-api/src/main/java/io/netty/buffer/api/BufferRef.java diff --git a/src/main/java/io/netty/buffer/api/ByteCursor.java b/buffer-api/src/main/java/io/netty/buffer/api/ByteCursor.java similarity index 100% rename from src/main/java/io/netty/buffer/api/ByteCursor.java rename to buffer-api/src/main/java/io/netty/buffer/api/ByteCursor.java diff --git a/src/main/java/io/netty/buffer/api/CompositeBuffer.java b/buffer-api/src/main/java/io/netty/buffer/api/CompositeBuffer.java similarity index 100% rename from src/main/java/io/netty/buffer/api/CompositeBuffer.java rename to buffer-api/src/main/java/io/netty/buffer/api/CompositeBuffer.java diff --git a/src/main/java/io/netty/buffer/api/Drop.java b/buffer-api/src/main/java/io/netty/buffer/api/Drop.java similarity index 100% rename from src/main/java/io/netty/buffer/api/Drop.java rename to buffer-api/src/main/java/io/netty/buffer/api/Drop.java diff --git a/src/main/java/io/netty/buffer/api/LifecycleTracer.java b/buffer-api/src/main/java/io/netty/buffer/api/LifecycleTracer.java similarity index 99% rename from src/main/java/io/netty/buffer/api/LifecycleTracer.java rename to buffer-api/src/main/java/io/netty/buffer/api/LifecycleTracer.java index 92408ef..103d984 100644 --- a/src/main/java/io/netty/buffer/api/LifecycleTracer.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/LifecycleTracer.java @@ -15,7 +15,6 @@ */ package io.netty.buffer.api; -import java.io.Serial; import java.util.ArrayDeque; import java.util.Set; import java.util.function.Function; @@ -176,7 +175,6 @@ abstract class LifecycleTracer { } private static final class Traceback extends Throwable { - @Serial private static final long serialVersionUID = 941453986194634605L; Traceback(String message) { diff --git a/src/main/java/io/netty/buffer/api/ManagedBufferAllocator.java b/buffer-api/src/main/java/io/netty/buffer/api/ManagedBufferAllocator.java similarity index 100% rename from src/main/java/io/netty/buffer/api/ManagedBufferAllocator.java rename to buffer-api/src/main/java/io/netty/buffer/api/ManagedBufferAllocator.java diff --git a/src/main/java/io/netty/buffer/api/MemoryManager.java b/buffer-api/src/main/java/io/netty/buffer/api/MemoryManager.java similarity index 100% rename from src/main/java/io/netty/buffer/api/MemoryManager.java rename to buffer-api/src/main/java/io/netty/buffer/api/MemoryManager.java diff --git a/src/main/java/io/netty/buffer/api/MemoryManagers.java b/buffer-api/src/main/java/io/netty/buffer/api/MemoryManagers.java similarity index 100% rename from src/main/java/io/netty/buffer/api/MemoryManagers.java rename to buffer-api/src/main/java/io/netty/buffer/api/MemoryManagers.java diff --git a/src/main/java/io/netty/buffer/api/MemoryManagersOverride.java b/buffer-api/src/main/java/io/netty/buffer/api/MemoryManagersOverride.java similarity index 92% rename from src/main/java/io/netty/buffer/api/MemoryManagersOverride.java rename to buffer-api/src/main/java/io/netty/buffer/api/MemoryManagersOverride.java index 4b7cf8a..c59125b 100644 --- a/src/main/java/io/netty/buffer/api/MemoryManagersOverride.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/MemoryManagersOverride.java @@ -15,7 +15,7 @@ */ package io.netty.buffer.api; -import io.netty.buffer.api.memseg.SegmentMemoryManagers; +import io.netty.buffer.api.bytebuffer.ByteBufferMemoryManagers; import java.util.Collections; import java.util.IdentityHashMap; @@ -24,7 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; final class MemoryManagersOverride { - private static final MemoryManagers DEFAULT = new SegmentMemoryManagers(); + private static final MemoryManagers DEFAULT = new ByteBufferMemoryManagers(); private static final AtomicInteger OVERRIDES_AVAILABLE = new AtomicInteger(); private static final Map OVERRIDES = Collections.synchronizedMap(new IdentityHashMap<>()); diff --git a/src/main/java/io/netty/buffer/api/Owned.java b/buffer-api/src/main/java/io/netty/buffer/api/Owned.java similarity index 100% rename from src/main/java/io/netty/buffer/api/Owned.java rename to buffer-api/src/main/java/io/netty/buffer/api/Owned.java diff --git a/src/main/java/io/netty/buffer/api/Rc.java b/buffer-api/src/main/java/io/netty/buffer/api/Rc.java similarity index 100% rename from src/main/java/io/netty/buffer/api/Rc.java rename to buffer-api/src/main/java/io/netty/buffer/api/Rc.java diff --git a/src/main/java/io/netty/buffer/api/RcSupport.java b/buffer-api/src/main/java/io/netty/buffer/api/RcSupport.java similarity index 100% rename from src/main/java/io/netty/buffer/api/RcSupport.java rename to buffer-api/src/main/java/io/netty/buffer/api/RcSupport.java diff --git a/src/main/java/io/netty/buffer/api/ReadableComponent.java b/buffer-api/src/main/java/io/netty/buffer/api/ReadableComponent.java similarity index 100% rename from src/main/java/io/netty/buffer/api/ReadableComponent.java rename to buffer-api/src/main/java/io/netty/buffer/api/ReadableComponent.java diff --git a/src/main/java/io/netty/buffer/api/ReadableComponentProcessor.java b/buffer-api/src/main/java/io/netty/buffer/api/ReadableComponentProcessor.java similarity index 100% rename from src/main/java/io/netty/buffer/api/ReadableComponentProcessor.java rename to buffer-api/src/main/java/io/netty/buffer/api/ReadableComponentProcessor.java diff --git a/src/main/java/io/netty/buffer/api/ResourceDisposeFailedException.java b/buffer-api/src/main/java/io/netty/buffer/api/ResourceDisposeFailedException.java similarity index 100% rename from src/main/java/io/netty/buffer/api/ResourceDisposeFailedException.java rename to buffer-api/src/main/java/io/netty/buffer/api/ResourceDisposeFailedException.java diff --git a/src/main/java/io/netty/buffer/api/Scope.java b/buffer-api/src/main/java/io/netty/buffer/api/Scope.java similarity index 100% rename from src/main/java/io/netty/buffer/api/Scope.java rename to buffer-api/src/main/java/io/netty/buffer/api/Scope.java diff --git a/src/main/java/io/netty/buffer/api/Send.java b/buffer-api/src/main/java/io/netty/buffer/api/Send.java similarity index 100% rename from src/main/java/io/netty/buffer/api/Send.java rename to buffer-api/src/main/java/io/netty/buffer/api/Send.java diff --git a/src/main/java/io/netty/buffer/api/TransferSend.java b/buffer-api/src/main/java/io/netty/buffer/api/TransferSend.java similarity index 91% rename from src/main/java/io/netty/buffer/api/TransferSend.java rename to buffer-api/src/main/java/io/netty/buffer/api/TransferSend.java index d73e104..1b8a0f9 100644 --- a/src/main/java/io/netty/buffer/api/TransferSend.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/TransferSend.java @@ -15,13 +15,14 @@ */ package io.netty.buffer.api; +import io.netty.buffer.api.internal.Statics; + import java.lang.invoke.VarHandle; -import static io.netty.buffer.api.internal.Statics.findVarHandle; import static java.lang.invoke.MethodHandles.lookup; class TransferSend, T extends Rc> implements Send { - private static final VarHandle RECEIVED = findVarHandle(lookup(), TransferSend.class, "received", boolean.class); + private static final VarHandle RECEIVED = Statics.findVarHandle(lookup(), TransferSend.class, "received", boolean.class); private final Owned outgoing; private final Drop drop; private final Class concreteType; diff --git a/src/main/java/io/netty/buffer/api/WritableComponent.java b/buffer-api/src/main/java/io/netty/buffer/api/WritableComponent.java similarity index 100% rename from src/main/java/io/netty/buffer/api/WritableComponent.java rename to buffer-api/src/main/java/io/netty/buffer/api/WritableComponent.java diff --git a/src/main/java/io/netty/buffer/api/WritableComponentProcessor.java b/buffer-api/src/main/java/io/netty/buffer/api/WritableComponentProcessor.java similarity index 100% rename from src/main/java/io/netty/buffer/api/WritableComponentProcessor.java rename to buffer-api/src/main/java/io/netty/buffer/api/WritableComponentProcessor.java diff --git a/src/main/java/io/netty/buffer/api/adaptor/BufferIntegratable.java b/buffer-api/src/main/java/io/netty/buffer/api/adaptor/BufferIntegratable.java similarity index 100% rename from src/main/java/io/netty/buffer/api/adaptor/BufferIntegratable.java rename to buffer-api/src/main/java/io/netty/buffer/api/adaptor/BufferIntegratable.java diff --git a/src/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java b/buffer-api/src/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java similarity index 99% rename from src/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java rename to buffer-api/src/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java index 370b462..927ea26 100644 --- a/src/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java @@ -22,8 +22,9 @@ import io.netty.buffer.ByteBufUtil; import io.netty.buffer.DuplicatedByteBuf; import io.netty.buffer.SlicedByteBuf; import io.netty.buffer.Unpooled; -import io.netty.buffer.api.Buffer; import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.internal.Statics; +import io.netty.buffer.api.Buffer; import io.netty.buffer.api.RcSupport; import io.netty.util.ByteProcessor; import io.netty.util.IllegalReferenceCountException; @@ -1514,7 +1515,7 @@ public final class ByteBufAdaptor extends ByteBuf { }); ByteBuffer buffer = bufRef.get(); if (index != readerIndex() || length != readableBytes()) { - buffer = buffer.slice(index - readerIndex(), length); + buffer = Statics.bbslice(buffer, index - readerIndex(), length); } return buffer; } else if (writerIndex() <= index && length <= writableBytes()) { @@ -1530,7 +1531,7 @@ public final class ByteBufAdaptor extends ByteBuf { }); ByteBuffer buffer = bufRef.get(); if (index != writerIndex() || length != writableBytes()) { - buffer = buffer.slice(index - writerIndex(), length); + buffer = Statics.bbslice(buffer, index - writerIndex(), length); } return buffer; } else { diff --git a/src/main/java/io/netty/buffer/api/adaptor/ByteBufAllocatorAdaptor.java b/buffer-api/src/main/java/io/netty/buffer/api/adaptor/ByteBufAllocatorAdaptor.java similarity index 100% rename from src/main/java/io/netty/buffer/api/adaptor/ByteBufAllocatorAdaptor.java rename to buffer-api/src/main/java/io/netty/buffer/api/adaptor/ByteBufAllocatorAdaptor.java diff --git a/src/main/java/io/netty/buffer/api/adaptor/package-info.java b/buffer-api/src/main/java/io/netty/buffer/api/adaptor/package-info.java similarity index 100% rename from src/main/java/io/netty/buffer/api/adaptor/package-info.java rename to buffer-api/src/main/java/io/netty/buffer/api/adaptor/package-info.java diff --git a/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManager.java b/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManager.java similarity index 96% rename from src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManager.java rename to buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManager.java index bd7bfea..f4925a0 100644 --- a/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManager.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManager.java @@ -25,6 +25,7 @@ import java.lang.ref.Cleaner; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import static io.netty.buffer.api.internal.Statics.bbslice; import static io.netty.buffer.api.internal.Statics.convert; public class ByteBufferMemoryManager implements MemoryManager { @@ -84,6 +85,6 @@ public class ByteBufferMemoryManager implements MemoryManager { @Override public Object sliceMemory(Object memory, int offset, int length) { var buffer = (ByteBuffer) memory; - return buffer.slice(offset, length); + return bbslice(buffer, offset, length); } } diff --git a/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManagers.java b/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManagers.java similarity index 100% rename from src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManagers.java rename to buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManagers.java diff --git a/src/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java b/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java similarity index 97% rename from src/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java rename to buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java index 4364958..4c99a2e 100644 --- a/src/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java @@ -34,6 +34,8 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.ReadOnlyBufferException; +import static io.netty.buffer.api.internal.Statics.bbput; +import static io.netty.buffer.api.internal.Statics.bbslice; import static io.netty.buffer.api.internal.Statics.bufferIsClosed; import static io.netty.buffer.api.internal.Statics.bufferIsReadOnly; @@ -64,7 +66,7 @@ class NioBuffer extends RcSupport implements Buffer, Readable super(new MakeInaccisbleOnDrop(new ArcDrop<>(ArcDrop.acquire(parent.unsafeGetDrop())))); control = parent.control; base = parent.base; - rmem = parent.rmem.slice(0, parent.rmem.capacity()); // Need to slice to get independent byte orders. + rmem = bbslice(parent.rmem, 0, parent.rmem.capacity()); // Need to slice to get independent byte orders. assert parent.wmem == CLOSED_BUFFER; wmem = CLOSED_BUFFER; roff = parent.roff; @@ -193,7 +195,7 @@ class NioBuffer extends RcSupport implements Buffer, Readable if (!isAccessible()) { throw new IllegalStateException("This buffer is closed: " + this + '.'); } - ByteBuffer slice = rmem.slice(offset, length); + ByteBuffer slice = bbslice(rmem, offset, length); ArcDrop drop = (ArcDrop) unsafeGetDrop(); drop.increment(); Buffer sliceBuffer = new NioBuffer(base, slice, control, drop) @@ -226,7 +228,7 @@ class NioBuffer extends RcSupport implements Buffer, Readable "srcPos = " + srcPos + ", length = " + length + '.'); } dest = dest.duplicate().clear(); - dest.put(destPos, rmem, srcPos, length); + bbput(dest, destPos, rmem, srcPos, length); } @Override @@ -453,12 +455,13 @@ class NioBuffer extends RcSupport implements Buffer, Readable } var drop = (ArcDrop) unsafeGetDrop(); unsafeSetDrop(new ArcDrop<>(drop)); - var splitByteBuffer = rmem.slice(0, splitOffset); + var splitByteBuffer = bbslice(rmem, 0, splitOffset); // TODO maybe incrementing the existing ArcDrop is enough; maybe we don't need to wrap it in another ArcDrop. var splitBuffer = new NioBuffer(base, splitByteBuffer, control, new ArcDrop<>(drop.increment())); splitBuffer.woff = Math.min(woff, splitOffset); splitBuffer.roff = Math.min(roff, splitOffset); - splitBuffer.order(order()); + ByteOrder order = order(); + splitBuffer.order(order); boolean readOnly = readOnly(); if (readOnly) { splitBuffer.makeReadOnly(); @@ -466,12 +469,13 @@ class NioBuffer extends RcSupport implements Buffer, Readable // Note that split, unlike slice, does not deconstify, because data changes in either buffer are not visible // in the other. The split buffers can later deconstify independently if needed. splitBuffer.constBuffer = constBuffer; - rmem = rmem.slice(splitOffset, rmem.capacity() - splitOffset); + rmem = bbslice(rmem, splitOffset, rmem.capacity() - splitOffset); if (!readOnly) { wmem = rmem; } woff = Math.max(woff, splitOffset) - splitOffset; roff = Math.max(roff, splitOffset) - splitOffset; + order(order); return splitBuffer; } @@ -534,7 +538,7 @@ class NioBuffer extends RcSupport implements Buffer, Readable @Override public ByteBuffer readableBuffer() { - return rmem.asReadOnlyBuffer().slice(readerOffset(), readableBytes()).order(order()); + return bbslice(rmem.asReadOnlyBuffer(), readerOffset(), readableBytes()).order(order()); } @Override @@ -564,7 +568,7 @@ class NioBuffer extends RcSupport implements Buffer, Readable @Override public ByteBuffer writableBuffer() { - return wmem.slice(writerOffset(), writableBytes()).order(order()); + return bbslice(wmem, writerOffset(), writableBytes()).order(order()); } // diff --git a/src/main/java/io/netty/buffer/api/bytebuffer/package-info.java b/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/package-info.java similarity index 100% rename from src/main/java/io/netty/buffer/api/bytebuffer/package-info.java rename to buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/package-info.java diff --git a/src/main/java/io/netty/buffer/api/internal/ArcDrop.java b/buffer-api/src/main/java/io/netty/buffer/api/internal/ArcDrop.java similarity index 100% rename from src/main/java/io/netty/buffer/api/internal/ArcDrop.java rename to buffer-api/src/main/java/io/netty/buffer/api/internal/ArcDrop.java diff --git a/src/main/java/io/netty/buffer/api/internal/CleanerDrop.java b/buffer-api/src/main/java/io/netty/buffer/api/internal/CleanerDrop.java similarity index 98% rename from src/main/java/io/netty/buffer/api/internal/CleanerDrop.java rename to buffer-api/src/main/java/io/netty/buffer/api/internal/CleanerDrop.java index 225a067..75eae0c 100644 --- a/src/main/java/io/netty/buffer/api/internal/CleanerDrop.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/internal/CleanerDrop.java @@ -17,7 +17,6 @@ package io.netty.buffer.api.internal; import io.netty.buffer.api.Drop; -import java.io.Serial; import java.lang.ref.Cleaner; import java.util.concurrent.atomic.AtomicReference; @@ -62,7 +61,6 @@ public final class CleanerDrop implements Drop { } private static final class GatedRunner extends AtomicReference implements Runnable { - @Serial private static final long serialVersionUID = 2685535951915798850L; final Drop drop; diff --git a/src/main/java/io/netty/buffer/api/internal/Statics.java b/buffer-api/src/main/java/io/netty/buffer/api/internal/Statics.java similarity index 76% rename from src/main/java/io/netty/buffer/api/internal/Statics.java rename to buffer-api/src/main/java/io/netty/buffer/api/internal/Statics.java index c440a35..76d2605 100644 --- a/src/main/java/io/netty/buffer/api/internal/Statics.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/internal/Statics.java @@ -21,9 +21,12 @@ import io.netty.buffer.api.Drop; import java.lang.invoke.MethodHandles.Lookup; import java.lang.invoke.VarHandle; import java.lang.ref.Cleaner; +import java.nio.ByteBuffer; import java.nio.ByteOrder; +import java.util.concurrent.atomic.LongAdder; public interface Statics { + LongAdder MEM_USAGE_NATIVE = new LongAdder(); Cleaner CLEANER = Cleaner.create(); Drop NO_OP_DROP = new Drop() { @Override @@ -69,6 +72,23 @@ public interface Statics { } } + /** + * The ByteBuffer slice-with-offset-and-length method is only available from Java 13 and onwards, but we need to + * support Java 11. + */ + static ByteBuffer bbslice(ByteBuffer buffer, int fromOffset, int length) { + return buffer.slice(fromOffset, length); +// return buffer.clear().position(fromOffset).limit(fromOffset + length).slice(); + } + + /** + * The ByteBuffer put-buffer-with-offset-and-length method is not available in Java 11. + */ + static void bbput(ByteBuffer dest, int destPos, ByteBuffer src, int srcPos, int length) { + dest.put(destPos, src, srcPos, length); +// dest.position(destPos).put(bbslice(src, srcPos, length)); + } + static IllegalStateException bufferIsClosed() { return new IllegalStateException("This buffer is closed."); } diff --git a/src/main/java/io/netty/buffer/api/internal/package-info.java b/buffer-api/src/main/java/io/netty/buffer/api/internal/package-info.java similarity index 100% rename from src/main/java/io/netty/buffer/api/internal/package-info.java rename to buffer-api/src/main/java/io/netty/buffer/api/internal/package-info.java diff --git a/src/main/java/io/netty/buffer/api/package-info.java b/buffer-api/src/main/java/io/netty/buffer/api/package-info.java similarity index 100% rename from src/main/java/io/netty/buffer/api/package-info.java rename to buffer-api/src/main/java/io/netty/buffer/api/package-info.java diff --git a/src/main/java/io/netty/buffer/api/pool/BufferAllocatorMetric.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/BufferAllocatorMetric.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/BufferAllocatorMetric.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/BufferAllocatorMetric.java diff --git a/src/main/java/io/netty/buffer/api/pool/BufferAllocatorMetricProvider.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/BufferAllocatorMetricProvider.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/BufferAllocatorMetricProvider.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/BufferAllocatorMetricProvider.java diff --git a/src/main/java/io/netty/buffer/api/pool/LongLongHashMap.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/LongLongHashMap.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/LongLongHashMap.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/LongLongHashMap.java diff --git a/src/main/java/io/netty/buffer/api/pool/LongPriorityQueue.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/LongPriorityQueue.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/LongPriorityQueue.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/LongPriorityQueue.java diff --git a/src/main/java/io/netty/buffer/api/pool/PoolArena.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArena.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PoolArena.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArena.java diff --git a/src/main/java/io/netty/buffer/api/pool/PoolArenaMetric.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArenaMetric.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PoolArenaMetric.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArenaMetric.java diff --git a/src/main/java/io/netty/buffer/api/pool/PoolChunk.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolChunk.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PoolChunk.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PoolChunk.java index 78b07ed..7b98ade 100644 --- a/src/main/java/io/netty/buffer/api/pool/PoolChunk.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolChunk.java @@ -15,12 +15,12 @@ */ package io.netty.buffer.api.pool; +import io.netty.buffer.api.internal.CleanerDrop; import io.netty.buffer.api.AllocatorControl.UntetheredMemory; import io.netty.buffer.api.Buffer; import io.netty.buffer.api.Drop; import io.netty.buffer.api.MemoryManager; import io.netty.buffer.api.internal.ArcDrop; -import io.netty.buffer.api.internal.CleanerDrop; import io.netty.buffer.api.internal.Statics; import java.util.PriorityQueue; diff --git a/src/main/java/io/netty/buffer/api/pool/PoolChunkList.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolChunkList.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PoolChunkList.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PoolChunkList.java diff --git a/src/main/java/io/netty/buffer/api/pool/PoolChunkListMetric.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolChunkListMetric.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PoolChunkListMetric.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PoolChunkListMetric.java diff --git a/src/main/java/io/netty/buffer/api/pool/PoolChunkMetric.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolChunkMetric.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PoolChunkMetric.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PoolChunkMetric.java diff --git a/src/main/java/io/netty/buffer/api/pool/PoolSubpage.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolSubpage.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PoolSubpage.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PoolSubpage.java diff --git a/src/main/java/io/netty/buffer/api/pool/PoolSubpageMetric.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolSubpageMetric.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PoolSubpageMetric.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PoolSubpageMetric.java diff --git a/src/main/java/io/netty/buffer/api/pool/PoolThreadCache.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolThreadCache.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PoolThreadCache.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PoolThreadCache.java diff --git a/src/main/java/io/netty/buffer/api/pool/PooledAllocatorControl.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PooledAllocatorControl.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PooledAllocatorControl.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PooledAllocatorControl.java diff --git a/src/main/java/io/netty/buffer/api/pool/PooledBufferAllocator.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PooledBufferAllocator.java similarity index 97% rename from src/main/java/io/netty/buffer/api/pool/PooledBufferAllocator.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PooledBufferAllocator.java index 8052f28..c8ae60b 100644 --- a/src/main/java/io/netty/buffer/api/pool/PooledBufferAllocator.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/pool/PooledBufferAllocator.java @@ -431,22 +431,22 @@ public class PooledBufferAllocator implements BufferAllocator, BufferAllocatorMe protected void onRemoval(PoolThreadCache threadCache) { threadCache.free(); } + } - private static PoolArena leastUsedArena(PoolArena[] arenas) { - if (arenas == null || arenas.length == 0) { - return null; - } - - PoolArena minArena = arenas[0]; - for (int i = 1; i < arenas.length; i++) { - PoolArena arena = arenas[i]; - if (arena.numThreadCaches.get() < minArena.numThreadCaches.get()) { - minArena = arena; - } - } - - return minArena; + static PoolArena leastUsedArena(PoolArena[] arenas) { + if (arenas == null || arenas.length == 0) { + return null; } + + PoolArena minArena = arenas[0]; + for (int i = 1; i < arenas.length; i++) { + PoolArena arena = arenas[i]; + if (arena.numThreadCaches.get() < minArena.numThreadCaches.get()) { + minArena = arena; + } + } + + return minArena; } @Override diff --git a/src/main/java/io/netty/buffer/api/pool/PooledBufferAllocatorMetric.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PooledBufferAllocatorMetric.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PooledBufferAllocatorMetric.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PooledBufferAllocatorMetric.java diff --git a/src/main/java/io/netty/buffer/api/pool/PooledDrop.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PooledDrop.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/PooledDrop.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/PooledDrop.java diff --git a/src/main/java/io/netty/buffer/api/pool/SizeClasses.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/SizeClasses.java similarity index 56% rename from src/main/java/io/netty/buffer/api/pool/SizeClasses.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/SizeClasses.java index 8ad00ad..534cdf1 100644 --- a/src/main/java/io/netty/buffer/api/pool/SizeClasses.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/pool/SizeClasses.java @@ -15,7 +15,7 @@ */ package io.netty.buffer.api.pool; -import static io.netty.buffer.api.pool.PoolThreadCache.*; +import java.util.concurrent.ConcurrentHashMap; /** * SizeClasses requires {@code pageShifts} to be defined prior to inclusion, @@ -79,13 +79,14 @@ import static io.netty.buffer.api.pool.PoolThreadCache.*; * ( 76, 24, 22, 1, yes, no, no) */ abstract class SizeClasses implements SizeClassesMetric { + private static final ConcurrentHashMap CACHE = + new ConcurrentHashMap(); static final int LOG2_QUANTUM = 4; private static final int LOG2_SIZE_CLASS_GROUP = 2; private static final int LOG2_MAX_LOOKUP_SIZE = 12; - private static final int INDEX_IDX = 0; private static final int LOG2GROUP_IDX = 1; private static final int LOG2DELTA_IDX = 2; private static final int NDELTA_IDX = 3; @@ -101,20 +102,17 @@ abstract class SizeClasses implements SizeClassesMetric { this.chunkSize = chunkSize; this.directMemoryCacheAlignment = directMemoryCacheAlignment; - int group = log2(chunkSize) + 1 - LOG2_QUANTUM; - - //generate size classes - //[index, log2Group, log2Delta, nDelta, isMultiPageSize, isSubPage, log2DeltaLookup] - sizeClasses = new short[group << LOG2_SIZE_CLASS_GROUP][7]; - nSizes = sizeClasses(); - - //generate lookup table - sizeIdx2sizeTab = new int[nSizes]; - pageIdx2sizeTab = new int[nPSizes]; - idx2SizeTab(sizeIdx2sizeTab, pageIdx2sizeTab); - - size2idxTab = new int[lookupMaxSize >> LOG2_QUANTUM]; - size2idxTab(size2idxTab); + SizeClassValue value = CACHE.computeIfAbsent( + new SizeClassKey(pageSize, pageShifts, chunkSize, directMemoryCacheAlignment), + SizeClassValue::new); + nSizes = value.nSizes; + nSubpages = value.nSubpages; + nPSizes = value.nPSizes; + smallMaxSizeIdx = value.smallMaxSizeIdx; + lookupMaxSize = value.lookupMaxSize; + pageIdx2sizeTab = value.pageIdx2sizeTab; + sizeIdx2sizeTab = value.sizeIdx2sizeTab; + size2idxTab = value.size2idxTab; } protected final int pageSize; @@ -123,15 +121,11 @@ abstract class SizeClasses implements SizeClassesMetric { protected final int directMemoryCacheAlignment; final int nSizes; - int nSubpages; - int nPSizes; - - int smallMaxSizeIdx; - - private int lookupMaxSize; - - private final short[][] sizeClasses; + final int nSubpages; + final int nPSizes; + final int smallMaxSizeIdx; + private final int lookupMaxSize; private final int[] pageIdx2sizeTab; // lookup table for sizeIdx <= smallMaxSizeIdx @@ -141,125 +135,6 @@ abstract class SizeClasses implements SizeClassesMetric { // spacing is 1 << LOG2_QUANTUM, so the size of array is lookupMaxclass >> LOG2_QUANTUM private final int[] size2idxTab; - private int sizeClasses() { - int normalMaxSize = -1; - - int index = 0; - int size = 0; - - int log2Group = LOG2_QUANTUM; - int log2Delta = LOG2_QUANTUM; - int ndeltaLimit = 1 << LOG2_SIZE_CLASS_GROUP; - - //First small group, nDelta start at 0. - //first size class is 1 << LOG2_QUANTUM - int nDelta = 0; - while (nDelta < ndeltaLimit) { - size = sizeClass(index++, log2Group, log2Delta, nDelta++); - } - log2Group += LOG2_SIZE_CLASS_GROUP; - - //All remaining groups, nDelta start at 1. - while (size < chunkSize) { - nDelta = 1; - - while (nDelta <= ndeltaLimit && size < chunkSize) { - size = sizeClass(index++, log2Group, log2Delta, nDelta++); - normalMaxSize = size; - } - - log2Group++; - log2Delta++; - } - - //chunkSize must be normalMaxSize - assert chunkSize == normalMaxSize; - - //return number of size index - return index; - } - - //calculate size class - private int sizeClass(int index, int log2Group, int log2Delta, int nDelta) { - short isMultiPageSize; - if (log2Delta >= pageShifts) { - isMultiPageSize = yes; - } else { - int pageSize = 1 << pageShifts; - int size = (1 << log2Group) + (1 << log2Delta) * nDelta; - - isMultiPageSize = size == size / pageSize * pageSize? yes : no; - } - - int log2Ndelta = nDelta == 0? 0 : log2(nDelta); - - byte remove = 1 << log2Ndelta < nDelta? yes : no; - - int log2Size = log2Delta + log2Ndelta == log2Group? log2Group + 1 : log2Group; - if (log2Size == log2Group) { - remove = yes; - } - - short isSubpage = log2Size < pageShifts + LOG2_SIZE_CLASS_GROUP? yes : no; - - int log2DeltaLookup = log2Size < LOG2_MAX_LOOKUP_SIZE || - log2Size == LOG2_MAX_LOOKUP_SIZE && remove == no - ? log2Delta : no; - - short[] sz = { - (short) index, (short) log2Group, (short) log2Delta, - (short) nDelta, isMultiPageSize, isSubpage, (short) log2DeltaLookup - }; - - sizeClasses[index] = sz; - int size = (1 << log2Group) + (nDelta << log2Delta); - - if (sz[PAGESIZE_IDX] == yes) { - nPSizes++; - } - if (sz[SUBPAGE_IDX] == yes) { - nSubpages++; - smallMaxSizeIdx = index; - } - if (sz[LOG2_DELTA_LOOKUP_IDX] != no) { - lookupMaxSize = size; - } - return size; - } - - private void idx2SizeTab(int[] sizeIdx2sizeTab, int[] pageIdx2sizeTab) { - int pageIdx = 0; - - for (int i = 0; i < nSizes; i++) { - short[] sizeClass = sizeClasses[i]; - int log2Group = sizeClass[LOG2GROUP_IDX]; - int log2Delta = sizeClass[LOG2DELTA_IDX]; - int nDelta = sizeClass[NDELTA_IDX]; - - int size = (1 << log2Group) + (nDelta << log2Delta); - sizeIdx2sizeTab[i] = size; - - if (sizeClass[PAGESIZE_IDX] == yes) { - pageIdx2sizeTab[pageIdx++] = size; - } - } - } - - private void size2idxTab(int[] size2idxTab) { - int idx = 0; - int size = 0; - - for (int i = 0; size <= lookupMaxSize; i++) { - int log2Delta = sizeClasses[i][LOG2DELTA_IDX]; - int times = 1 << log2Delta - LOG2_QUANTUM; - - while (size <= lookupMaxSize && times-- > 0) { - size2idxTab[idx++] = i; - size = idx + 1 << LOG2_QUANTUM; - } - } - } - @Override public int sizeIdx2size(int sizeIdx) { return sizeIdx2sizeTab[sizeIdx]; @@ -318,7 +193,7 @@ abstract class SizeClasses implements SizeClassesMetric { return size2idxTab[size - 1 >> LOG2_QUANTUM]; } - int x = log2((size << 1) - 1); + int x = PoolThreadCache.log2((size << 1) - 1); int shift = x < LOG2_SIZE_CLASS_GROUP + LOG2_QUANTUM + 1 ? 0 : x - (LOG2_SIZE_CLASS_GROUP + LOG2_QUANTUM); @@ -350,7 +225,7 @@ abstract class SizeClasses implements SizeClassesMetric { return nPSizes; } - int x = log2((pageSize << 1) - 1); + int x = PoolThreadCache.log2((pageSize << 1) - 1); int shift = x < LOG2_SIZE_CLASS_GROUP + pageShifts ? 0 : x - (LOG2_SIZE_CLASS_GROUP + pageShifts); @@ -397,11 +272,207 @@ abstract class SizeClasses implements SizeClassesMetric { } private static int normalizeSizeCompute(int size) { - int x = log2((size << 1) - 1); + int x = PoolThreadCache.log2((size << 1) - 1); int log2Delta = x < LOG2_SIZE_CLASS_GROUP + LOG2_QUANTUM + 1 ? LOG2_QUANTUM : x - LOG2_SIZE_CLASS_GROUP - 1; int delta = 1 << log2Delta; int delta_mask = delta - 1; return size + delta_mask & ~delta_mask; } + + private static final class SizeClassKey { + final int pageSize; + final int pageShifts; + final int chunkSize; + final int directMemoryCacheAlignment; + + private SizeClassKey(int pageSize, int pageShifts, int chunkSize, int directMemoryCacheAlignment) { + this.pageSize = pageSize; + this.pageShifts = pageShifts; + this.chunkSize = chunkSize; + this.directMemoryCacheAlignment = directMemoryCacheAlignment; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + SizeClassKey that = (SizeClassKey) o; + + if (pageSize != that.pageSize) { + return false; + } + if (pageShifts != that.pageShifts) { + return false; + } + if (chunkSize != that.chunkSize) { + return false; + } + return directMemoryCacheAlignment == that.directMemoryCacheAlignment; + } + + @Override + public int hashCode() { + int result = pageSize; + result = 31 * result + pageShifts; + result = 31 * result + chunkSize; + result = 31 * result + directMemoryCacheAlignment; + return result; + } + } + + private static final class SizeClassValue { + final SizeClassKey key; + final int nSizes; + int nSubpages; + int nPSizes; + int smallMaxSizeIdx; + int lookupMaxSize; + final short[][] sizeClasses; + final int[] pageIdx2sizeTab; + final int[] sizeIdx2sizeTab; + final int[] size2idxTab; + + SizeClassValue(SizeClassKey key) { + this.key = key; + int group = PoolThreadCache.log2(key.chunkSize) + 1 - LOG2_QUANTUM; + + //generate size classes + //[index, log2Group, log2Delta, nDelta, isMultiPageSize, isSubPage, log2DeltaLookup] + sizeClasses = new short[group << LOG2_SIZE_CLASS_GROUP][7]; + nSizes = sizeClasses(); + + //generate lookup table + sizeIdx2sizeTab = new int[nSizes]; + pageIdx2sizeTab = new int[nPSizes]; + idx2SizeTab(sizeIdx2sizeTab, pageIdx2sizeTab); + + size2idxTab = new int[lookupMaxSize >> LOG2_QUANTUM]; + size2idxTab(size2idxTab); + } + + private int sizeClasses() { + int normalMaxSize = -1; + + int index = 0; + int size = 0; + + int log2Group = LOG2_QUANTUM; + int log2Delta = LOG2_QUANTUM; + int ndeltaLimit = 1 << LOG2_SIZE_CLASS_GROUP; + + //First small group, nDelta start at 0. + //first size class is 1 << LOG2_QUANTUM + int nDelta = 0; + while (nDelta < ndeltaLimit) { + size = sizeClass(index++, log2Group, log2Delta, nDelta++); + } + log2Group += LOG2_SIZE_CLASS_GROUP; + + //All remaining groups, nDelta start at 1. + while (size < key.chunkSize) { + nDelta = 1; + + while (nDelta <= ndeltaLimit && size < key.chunkSize) { + size = sizeClass(index++, log2Group, log2Delta, nDelta++); + normalMaxSize = size; + } + + log2Group++; + log2Delta++; + } + + //chunkSize must be normalMaxSize + assert key.chunkSize == normalMaxSize; + + //return number of size index + return index; + } + + //calculate size class + private int sizeClass(int index, int log2Group, int log2Delta, int nDelta) { + short isMultiPageSize; + if (log2Delta >= key.pageShifts) { + isMultiPageSize = yes; + } else { + int pageSize = 1 << key.pageShifts; + int size = (1 << log2Group) + (1 << log2Delta) * nDelta; + + isMultiPageSize = size == size / pageSize * pageSize? yes : no; + } + + int log2Ndelta = nDelta == 0? 0 : PoolThreadCache.log2(nDelta); + + byte remove = 1 << log2Ndelta < nDelta? yes : no; + + int log2Size = log2Delta + log2Ndelta == log2Group? log2Group + 1 : log2Group; + if (log2Size == log2Group) { + remove = yes; + } + + short isSubpage = log2Size < key.pageShifts + LOG2_SIZE_CLASS_GROUP? yes : no; + + int log2DeltaLookup = log2Size < LOG2_MAX_LOOKUP_SIZE || + log2Size == LOG2_MAX_LOOKUP_SIZE && remove == no + ? log2Delta : no; + + short[] sz = { + (short) index, (short) log2Group, (short) log2Delta, + (short) nDelta, isMultiPageSize, isSubpage, (short) log2DeltaLookup + }; + + sizeClasses[index] = sz; + int size = (1 << log2Group) + (nDelta << log2Delta); + + if (sz[PAGESIZE_IDX] == yes) { + nPSizes++; + } + if (sz[SUBPAGE_IDX] == yes) { + nSubpages++; + smallMaxSizeIdx = index; + } + if (sz[LOG2_DELTA_LOOKUP_IDX] != no) { + lookupMaxSize = size; + } + return size; + } + + private void idx2SizeTab(int[] sizeIdx2sizeTab, int[] pageIdx2sizeTab) { + int pageIdx = 0; + + for (int i = 0; i < nSizes; i++) { + short[] sizeClass = sizeClasses[i]; + int log2Group = sizeClass[LOG2GROUP_IDX]; + int log2Delta = sizeClass[LOG2DELTA_IDX]; + int nDelta = sizeClass[NDELTA_IDX]; + + int size = (1 << log2Group) + (nDelta << log2Delta); + sizeIdx2sizeTab[i] = size; + + if (sizeClass[PAGESIZE_IDX] == yes) { + pageIdx2sizeTab[pageIdx++] = size; + } + } + } + + private void size2idxTab(int[] size2idxTab) { + int idx = 0; + int size = 0; + + for (int i = 0; size <= lookupMaxSize; i++) { + int log2Delta = sizeClasses[i][LOG2DELTA_IDX]; + int times = 1 << log2Delta - LOG2_QUANTUM; + + while (size <= lookupMaxSize && times-- > 0) { + size2idxTab[idx++] = i; + size = idx + 1 << LOG2_QUANTUM; + } + } + } + } } diff --git a/src/main/java/io/netty/buffer/api/pool/SizeClassesMetric.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/SizeClassesMetric.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/SizeClassesMetric.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/SizeClassesMetric.java diff --git a/src/main/java/io/netty/buffer/api/pool/UnpooledUnthetheredMemory.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/UnpooledUnthetheredMemory.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/UnpooledUnthetheredMemory.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/UnpooledUnthetheredMemory.java diff --git a/src/main/java/io/netty/buffer/api/pool/package-info.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/package-info.java similarity index 100% rename from src/main/java/io/netty/buffer/api/pool/package-info.java rename to buffer-api/src/main/java/io/netty/buffer/api/pool/package-info.java diff --git a/src/main/java/io/netty/buffer/api/unsafe/CleanerDrop.java b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/CleanerDrop.java similarity index 100% rename from src/main/java/io/netty/buffer/api/unsafe/CleanerDrop.java rename to buffer-api/src/main/java/io/netty/buffer/api/unsafe/CleanerDrop.java diff --git a/src/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java similarity index 99% rename from src/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java rename to buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java index bdbe06c..a40c743 100644 --- a/src/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java @@ -15,9 +15,9 @@ */ package io.netty.buffer.api.unsafe; +import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.AllocatorControl; import io.netty.buffer.api.Buffer; -import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.ByteCursor; import io.netty.buffer.api.Drop; import io.netty.buffer.api.Owned; @@ -34,6 +34,7 @@ import java.lang.ref.Reference; import java.nio.ByteBuffer; import java.nio.ByteOrder; +import static io.netty.buffer.api.internal.Statics.bbslice; import static io.netty.buffer.api.internal.Statics.bufferIsClosed; import static io.netty.buffer.api.internal.Statics.bufferIsReadOnly; import static io.netty.util.internal.PlatformDependent.BIG_ENDIAN_NATIVE_ORDER; @@ -596,7 +597,7 @@ class UnsafeBuffer extends RcSupport implements Buffer, Re public ByteBuffer readableBuffer() { final ByteBuffer buf; if (hasReadableArray()) { - buf = ByteBuffer.wrap(readableArray()).slice(readableArrayOffset(), readableArrayLength()); + buf = bbslice(ByteBuffer.wrap(readableArray()), readableArrayOffset(), readableArrayLength()); } else { buf = PlatformDependent.directBuffer(address + roff, readableBytes()); } @@ -640,7 +641,7 @@ class UnsafeBuffer extends RcSupport implements Buffer, Re public ByteBuffer writableBuffer() { final ByteBuffer buf; if (hasWritableArray()) { - buf = ByteBuffer.wrap(writableArray()).slice(writableArrayOffset(), writableArrayLength()); + buf = bbslice(ByteBuffer.wrap(writableArray()), writableArrayOffset(), writableArrayLength()); } else { buf = PlatformDependent.directBuffer(address + woff, writableBytes()); } diff --git a/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemory.java b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemory.java similarity index 100% rename from src/main/java/io/netty/buffer/api/unsafe/UnsafeMemory.java rename to buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemory.java diff --git a/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManager.java b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManager.java similarity index 100% rename from src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManager.java rename to buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManager.java diff --git a/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManagers.java b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManagers.java similarity index 100% rename from src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManagers.java rename to buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManagers.java diff --git a/src/main/java/io/netty/buffer/api/unsafe/package-info.java b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/package-info.java similarity index 100% rename from src/main/java/io/netty/buffer/api/unsafe/package-info.java rename to buffer-api/src/main/java/io/netty/buffer/api/unsafe/package-info.java diff --git a/buffer-api/src/main/java/module-info.java b/buffer-api/src/main/java/module-info.java new file mode 100644 index 0000000..ee28484 --- /dev/null +++ b/buffer-api/src/main/java/module-info.java @@ -0,0 +1,43 @@ +/* + * Copyright 2021 The Netty Project + * + * The Netty Project licenses this file to you under the Apache License, + * version 2.0 (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at: + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +import io.netty.buffer.api.MemoryManagers; +import io.netty.buffer.api.bytebuffer.ByteBufferMemoryManagers; +import io.netty.buffer.api.unsafe.UnsafeMemoryManagers; + +module netty.incubator.buffer { + requires io.netty.common; + requires io.netty.buffer; + + // Optional dependencies, needed for some examples. + requires static java.logging;//todo remove + + exports io.netty.buffer.api; + exports io.netty.buffer.api.adaptor; + + exports io.netty.buffer.api.internal to + netty.incubator.buffer.memseg, + netty.incubator.buffer.tests; + + uses MemoryManagers; + + // Permit reflective access to non-public members. + // Also means we don't have to make all test methods etc. public for JUnit to access them. + opens io.netty.buffer.api;//todo remove + + provides MemoryManagers with + ByteBufferMemoryManagers, + UnsafeMemoryManagers; +} diff --git a/buffer-memseg/pom.xml b/buffer-memseg/pom.xml new file mode 100644 index 0000000..215d02c --- /dev/null +++ b/buffer-memseg/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + + + io.netty.incubator + netty-incubator-buffer-parent + 0.0.1.Final-SNAPSHOT + + + netty-incubator-buffer-memseg + 0.0.1.Final-SNAPSHOT + Netty/Incubator/Buffer MemorySegment + jar + + + + io.netty.incubator + netty-incubator-buffer-api + + + io.netty + netty-common + + + io.netty + netty-buffer + + + org.openjdk.jmh + jmh-core + + + org.openjdk.jmh + jmh-generator-annprocess + + + org.junit.jupiter + junit-jupiter-engine + test + + + + + + + maven-compiler-plugin + 3.8.1 + + ${java.version} + true + ${java.compatibility} + ${java.compatibility} + ${java.version} + true + true + true + true + -Xlint:-options + 256m + 1024m + + --add-modules + jdk.incubator.foreign + + + + + + \ No newline at end of file diff --git a/src/main/java/io/netty/buffer/api/memseg/AbstractMemorySegmentManager.java b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/AbstractMemorySegmentManager.java similarity index 89% rename from src/main/java/io/netty/buffer/api/memseg/AbstractMemorySegmentManager.java rename to buffer-memseg/src/main/java/io/netty/buffer/api/memseg/AbstractMemorySegmentManager.java index 1aabd96..df68f16 100644 --- a/src/main/java/io/netty/buffer/api/memseg/AbstractMemorySegmentManager.java +++ b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/AbstractMemorySegmentManager.java @@ -15,23 +15,22 @@ */ package io.netty.buffer.api.memseg; +import io.netty.buffer.api.internal.ArcDrop; +import io.netty.buffer.api.internal.Statics; import io.netty.buffer.api.AllocatorControl; import io.netty.buffer.api.Buffer; import io.netty.buffer.api.Drop; import io.netty.buffer.api.MemoryManager; -import io.netty.buffer.api.internal.ArcDrop; import jdk.incubator.foreign.MemorySegment; import jdk.incubator.foreign.ResourceScope; import java.lang.ref.Cleaner; -import static io.netty.buffer.api.internal.Statics.convert; - public abstract class AbstractMemorySegmentManager implements MemoryManager { @Override public Buffer allocateShared(AllocatorControl allocatorControl, long size, Drop drop, Cleaner cleaner) { var segment = createSegment(size, cleaner); - return new MemSegBuffer(segment, segment, convert(drop), allocatorControl); + return new MemSegBuffer(segment, segment, Statics.convert(drop), allocatorControl); } @Override @@ -45,7 +44,7 @@ public abstract class AbstractMemorySegmentManager implements MemoryManager { @Override public Drop drop() { - return convert(MemSegBuffer.SEGMENT_CLOSE); + return Statics.convert(MemSegBuffer.SEGMENT_CLOSE); } @Override @@ -71,7 +70,7 @@ public abstract class AbstractMemorySegmentManager implements MemoryManager { @Override public Buffer recoverMemory(AllocatorControl allocatorControl, Object recoverableMemory, Drop drop) { var segment = (MemorySegment) recoverableMemory; - return new MemSegBuffer(segment, segment, convert(ArcDrop.acquire(drop)), allocatorControl); + return new MemSegBuffer(segment, segment, Statics.convert(ArcDrop.acquire(drop)), allocatorControl); } @Override diff --git a/src/main/java/io/netty/buffer/api/memseg/HeapMemorySegmentManager.java b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/HeapMemorySegmentManager.java similarity index 100% rename from src/main/java/io/netty/buffer/api/memseg/HeapMemorySegmentManager.java rename to buffer-memseg/src/main/java/io/netty/buffer/api/memseg/HeapMemorySegmentManager.java diff --git a/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java similarity index 98% rename from src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java rename to buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java index 426f99b..7b04aff 100644 --- a/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java +++ b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java @@ -17,6 +17,11 @@ package io.netty.buffer.api.memseg; import io.netty.buffer.ByteBuf; import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.adaptor.BufferIntegratable; +import io.netty.buffer.api.adaptor.ByteBufAdaptor; +import io.netty.buffer.api.adaptor.ByteBufAllocatorAdaptor; +import io.netty.buffer.api.internal.ArcDrop; +import io.netty.buffer.api.internal.Statics; import io.netty.buffer.api.AllocatorControl; import io.netty.buffer.api.Buffer; import io.netty.buffer.api.ByteCursor; @@ -27,19 +32,12 @@ import io.netty.buffer.api.WritableComponentProcessor; import io.netty.buffer.api.Drop; import io.netty.buffer.api.Owned; import io.netty.buffer.api.RcSupport; -import io.netty.buffer.api.adaptor.BufferIntegratable; -import io.netty.buffer.api.adaptor.ByteBufAdaptor; -import io.netty.buffer.api.adaptor.ByteBufAllocatorAdaptor; -import io.netty.buffer.api.internal.ArcDrop; -import io.netty.buffer.api.internal.Statics; import jdk.incubator.foreign.MemorySegment; import jdk.incubator.foreign.ResourceScope; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import static io.netty.buffer.api.internal.Statics.bufferIsClosed; -import static io.netty.buffer.api.internal.Statics.bufferIsReadOnly; import static jdk.incubator.foreign.MemoryAccess.getByteAtOffset; import static jdk.incubator.foreign.MemoryAccess.getCharAtOffset; import static jdk.incubator.foreign.MemoryAccess.getDoubleAtOffset; @@ -56,7 +54,7 @@ import static jdk.incubator.foreign.MemoryAccess.setLongAtOffset; import static jdk.incubator.foreign.MemoryAccess.setShortAtOffset; class MemSegBuffer extends RcSupport implements Buffer, ReadableComponent, WritableComponent, - BufferIntegratable { + BufferIntegratable { private static final MemorySegment CLOSED_SEGMENT; static final Drop SEGMENT_CLOSE; @@ -325,7 +323,7 @@ class MemSegBuffer extends RcSupport implements Buffer, Re private void copyInto(int srcPos, MemorySegment dest, int destPos, int length) { if (seg == CLOSED_SEGMENT) { - throw bufferIsClosed(); + throw Statics.bufferIsClosed(); } if (srcPos < 0) { throw new IllegalArgumentException("The srcPos cannot be negative: " + srcPos + '.'); @@ -360,7 +358,7 @@ class MemSegBuffer extends RcSupport implements Buffer, Re @Override public ByteCursor openCursor(int fromOffset, int length) { if (seg == CLOSED_SEGMENT) { - throw bufferIsClosed(); + throw Statics.bufferIsClosed(); } if (fromOffset < 0) { throw new IllegalArgumentException("The fromOffset cannot be negative: " + fromOffset + '.'); @@ -430,7 +428,7 @@ class MemSegBuffer extends RcSupport implements Buffer, Re @Override public ByteCursor openReverseCursor(int fromOffset, int length) { if (seg == CLOSED_SEGMENT) { - throw bufferIsClosed(); + throw Statics.bufferIsClosed(); } if (fromOffset < 0) { throw new IllegalArgumentException("The fromOffset cannot be negative: " + fromOffset + '.'); @@ -508,7 +506,7 @@ class MemSegBuffer extends RcSupport implements Buffer, Re throw new IllegalArgumentException("The minimum growth cannot be negative: " + minimumGrowth + '.'); } if (seg != wseg) { - throw bufferIsReadOnly(); + throw Statics.bufferIsReadOnly(); } if (writableBytes() >= size) { // We already have enough space. @@ -1172,27 +1170,27 @@ class MemSegBuffer extends RcSupport implements Buffer, Re private RuntimeException checkWriteState(IndexOutOfBoundsException ioobe) { if (seg == CLOSED_SEGMENT) { - return bufferIsClosed(); + return Statics.bufferIsClosed(); } if (wseg != seg) { - return bufferIsReadOnly(); + return Statics.bufferIsReadOnly(); } return ioobe; } private RuntimeException readAccessCheckException(int index) { if (seg == CLOSED_SEGMENT) { - throw bufferIsClosed(); + throw Statics.bufferIsClosed(); } return outOfBounds(index); } private RuntimeException writeAccessCheckException(int index) { if (seg == CLOSED_SEGMENT) { - throw bufferIsClosed(); + throw Statics.bufferIsClosed(); } if (wseg != seg) { - return bufferIsReadOnly(); + return Statics.bufferIsReadOnly(); } return outOfBounds(index); } diff --git a/src/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java similarity index 91% rename from src/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java rename to buffer-memseg/src/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java index 1575ff6..55b1c8c 100644 --- a/src/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java +++ b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/NativeMemorySegmentManager.java @@ -15,18 +15,17 @@ */ package io.netty.buffer.api.memseg; +import io.netty.buffer.api.internal.Statics; import jdk.incubator.foreign.MemorySegment; import jdk.incubator.foreign.ResourceScope; import java.lang.ref.Cleaner; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.LongAdder; import java.util.function.Function; import static jdk.incubator.foreign.ResourceScope.newSharedScope; public class NativeMemorySegmentManager extends AbstractMemorySegmentManager { - public static final LongAdder MEM_USAGE_NATIVE = new LongAdder(); private static final ConcurrentHashMap CLEANUP_ACTIONS = new ConcurrentHashMap<>(); private static final Function CLEANUP_ACTION_MAKER = s -> new ReduceNativeMemoryUsage(s); @@ -43,7 +42,7 @@ public class NativeMemorySegmentManager extends AbstractMemorySegmentManager { @Override public void run() { - MEM_USAGE_NATIVE.add(-size); + Statics.MEM_USAGE_NATIVE.add(-size); } @Override @@ -62,7 +61,7 @@ public class NativeMemorySegmentManager extends AbstractMemorySegmentManager { final ResourceScope scope = cleaner == null ? newSharedScope() : newSharedScope(cleaner); scope.addCloseAction(getCleanupAction(size)); var segment = MemorySegment.allocateNative(size, scope); - MEM_USAGE_NATIVE.add(size); + Statics.MEM_USAGE_NATIVE.add(size); return segment; } } diff --git a/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java similarity index 100% rename from src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java rename to buffer-memseg/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java diff --git a/src/main/java/io/netty/buffer/api/memseg/package-info.java b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/package-info.java similarity index 100% rename from src/main/java/io/netty/buffer/api/memseg/package-info.java rename to buffer-memseg/src/main/java/io/netty/buffer/api/memseg/package-info.java diff --git a/src/main/java/module-info.java b/buffer-memseg/src/main/java/module-info.java similarity index 69% rename from src/main/java/module-info.java rename to buffer-memseg/src/main/java/module-info.java index 53f3187..52f0beb 100644 --- a/src/main/java/module-info.java +++ b/buffer-memseg/src/main/java/module-info.java @@ -13,25 +13,22 @@ * License for the specific language governing permissions and limitations * under the License. */ -module netty.incubator.buffer { +import io.netty.buffer.api.MemoryManagers; +import io.netty.buffer.api.memseg.SegmentMemoryManagers; + +module netty.incubator.buffer.memseg { requires jdk.incubator.foreign; requires io.netty.common; requires io.netty.buffer; + requires netty.incubator.buffer; // Optional dependencies, needed for some examples. requires static java.logging; - exports io.netty.buffer.api; - exports io.netty.buffer.api.adaptor; - - uses io.netty.buffer.api.MemoryManagers; - // Permit reflective access to non-public members. // Also means we don't have to make all test methods etc. public for JUnit to access them. - opens io.netty.buffer.api; + opens io.netty.buffer.api.memseg; - provides io.netty.buffer.api.MemoryManagers with - io.netty.buffer.api.memseg.SegmentMemoryManagers, - io.netty.buffer.api.bytebuffer.ByteBufferMemoryManagers, - io.netty.buffer.api.unsafe.UnsafeMemoryManagers; + provides MemoryManagers with + SegmentMemoryManagers; } diff --git a/src/test/java/io/netty/buffer/api/benchmarks/MemSegBufAccessBenchmark.java b/buffer-memseg/src/test/java/io/netty/buffer/api/memseg/benchmarks/MemSegBufAccessBenchmark.java similarity index 98% rename from src/test/java/io/netty/buffer/api/benchmarks/MemSegBufAccessBenchmark.java rename to buffer-memseg/src/test/java/io/netty/buffer/api/memseg/benchmarks/MemSegBufAccessBenchmark.java index 757f6bd..f55b809 100644 --- a/src/test/java/io/netty/buffer/api/benchmarks/MemSegBufAccessBenchmark.java +++ b/buffer-memseg/src/test/java/io/netty/buffer/api/memseg/benchmarks/MemSegBufAccessBenchmark.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.benchmarks; +package io.netty.buffer.api.memseg.benchmarks; import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.Buffer; diff --git a/src/test/java/io/netty/buffer/api/benchmarks/MemorySegmentCloseBenchmark.java b/buffer-memseg/src/test/java/io/netty/buffer/api/memseg/benchmarks/MemorySegmentCloseBenchmark.java similarity index 98% rename from src/test/java/io/netty/buffer/api/benchmarks/MemorySegmentCloseBenchmark.java rename to buffer-memseg/src/test/java/io/netty/buffer/api/memseg/benchmarks/MemorySegmentCloseBenchmark.java index 083ff29..da70524 100644 --- a/src/test/java/io/netty/buffer/api/benchmarks/MemorySegmentCloseBenchmark.java +++ b/buffer-memseg/src/test/java/io/netty/buffer/api/memseg/benchmarks/MemorySegmentCloseBenchmark.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.benchmarks; +package io.netty.buffer.api.memseg.benchmarks; import jdk.incubator.foreign.MemorySegment; import jdk.incubator.foreign.ResourceScope; diff --git a/src/test/java/io/netty/buffer/api/benchmarks/MemorySegmentClosedByCleanerBenchmark.java b/buffer-memseg/src/test/java/io/netty/buffer/api/memseg/benchmarks/MemorySegmentClosedByCleanerBenchmark.java similarity index 76% rename from src/test/java/io/netty/buffer/api/benchmarks/MemorySegmentClosedByCleanerBenchmark.java rename to buffer-memseg/src/test/java/io/netty/buffer/api/memseg/benchmarks/MemorySegmentClosedByCleanerBenchmark.java index d719840..601400c 100644 --- a/src/test/java/io/netty/buffer/api/benchmarks/MemorySegmentClosedByCleanerBenchmark.java +++ b/buffer-memseg/src/test/java/io/netty/buffer/api/memseg/benchmarks/MemorySegmentClosedByCleanerBenchmark.java @@ -13,10 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.benchmarks; +package io.netty.buffer.api.memseg.benchmarks; import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.memseg.SegmentMemoryManagers; import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.MemoryManagers; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; @@ -41,10 +43,37 @@ import static java.util.concurrent.CompletableFuture.completedFuture; @OutputTimeUnit(TimeUnit.MICROSECONDS) @State(Scope.Benchmark) public class MemorySegmentClosedByCleanerBenchmark { - private static final BufferAllocator heap = BufferAllocator.heap(); - private static final BufferAllocator heapPooled = BufferAllocator.pooledHeap(); - private static final BufferAllocator direct = BufferAllocator.direct(); - private static final BufferAllocator directPooled = BufferAllocator.pooledDirect(); + private static final BufferAllocator heap; + private static final BufferAllocator heapPooled; + private static final BufferAllocator direct; + private static final BufferAllocator directPooled; + + static { + class Allocators { + final BufferAllocator heap; + final BufferAllocator pooledHeap; + final BufferAllocator direct; + final BufferAllocator pooledDirect; + + Allocators(BufferAllocator heap, BufferAllocator pooledHeap, + BufferAllocator direct, BufferAllocator pooledDirect) { + this.heap = heap; + this.pooledHeap = pooledHeap; + this.direct = direct; + this.pooledDirect = pooledDirect; + } + } + + var allocs = MemoryManagers.using(new SegmentMemoryManagers(), () -> { + return new Allocators(BufferAllocator.heap(), BufferAllocator.pooledHeap(), + BufferAllocator.direct(), BufferAllocator.pooledDirect()); + }); + + heap = allocs.heap; + heapPooled = allocs.pooledHeap; + direct = allocs.direct; + directPooled = allocs.pooledDirect; + } @Param({"heavy", "light"}) public String workload; diff --git a/buffer-tests/pom.xml b/buffer-tests/pom.xml new file mode 100644 index 0000000..2d05e9a --- /dev/null +++ b/buffer-tests/pom.xml @@ -0,0 +1,96 @@ + + + 4.0.0 + + + io.netty.incubator + netty-incubator-buffer-parent + 0.0.1.Final-SNAPSHOT + + + netty-incubator-buffer-tests + 0.0.1.Final-SNAPSHOT + Netty/Incubator/Buffer Tests + jar + + + + io.netty.incubator + netty-incubator-buffer-api + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params + test + + + org.junit.vintage + junit-vintage-engine + test + + + junit + junit + test + + + org.assertj + assertj-core + + + org.mockito + mockito-core + test + + + io.netty + netty-build-common + test + + + io.netty + netty-handler + test + + + io.netty + netty-codec-http + test + + + org.openjdk.jmh + jmh-core + + + org.openjdk.jmh + jmh-generator-annprocess + + + + + + Java 17 support + + 17 + + + + io.netty.incubator + netty-incubator-buffer-memseg + + + + + \ No newline at end of file diff --git a/buffer-tests/src/main/java/module-info.java b/buffer-tests/src/main/java/module-info.java new file mode 100644 index 0000000..7c72be3 --- /dev/null +++ b/buffer-tests/src/main/java/module-info.java @@ -0,0 +1,25 @@ +/* + * Copyright 2021 The Netty Project + * + * The Netty Project licenses this file to you under the Apache License, + * version 2.0 (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at: + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +open module netty.incubator.buffer.tests { + requires io.netty.common; + requires io.netty.buffer; + + // Optional dependencies, needed for some examples. + requires static java.logging; + + requires netty.incubator.buffer; + requires static netty.incubator.buffer.memseg; +} diff --git a/src/test/java/io/netty/buffer/api/BufferBulkAccessTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferBulkAccessTest.java similarity index 98% rename from src/test/java/io/netty/buffer/api/BufferBulkAccessTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferBulkAccessTest.java index 16845a4..fd59c33 100644 --- a/src/test/java/io/netty/buffer/api/BufferBulkAccessTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferBulkAccessTest.java @@ -13,8 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.CompositeBuffer; +import io.netty.buffer.api.Scope; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferByteOffsettedAccessorsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferByteOffsettedAccessorsTest.java similarity index 99% rename from src/test/java/io/netty/buffer/api/BufferByteOffsettedAccessorsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferByteOffsettedAccessorsTest.java index 22d8c0e..294940c 100644 --- a/src/test/java/io/netty/buffer/api/BufferByteOffsettedAccessorsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferByteOffsettedAccessorsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferCharOffsettedAccessorsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCharOffsettedAccessorsTest.java similarity index 98% rename from src/test/java/io/netty/buffer/api/BufferCharOffsettedAccessorsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCharOffsettedAccessorsTest.java index 2edac36..183be45 100644 --- a/src/test/java/io/netty/buffer/api/BufferCharOffsettedAccessorsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCharOffsettedAccessorsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferCleanerTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCleanerTest.java similarity index 82% rename from src/test/java/io/netty/buffer/api/BufferCleanerTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCleanerTest.java index 7785a89..4487549 100644 --- a/src/test/java/io/netty/buffer/api/BufferCleanerTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCleanerTest.java @@ -13,13 +13,17 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; -import io.netty.buffer.api.memseg.NativeMemorySegmentManager; +import io.netty.buffer.api.MemoryManagers; +import io.netty.buffer.api.internal.Statics; +import org.junit.jupiter.api.condition.DisabledForJreRange; +import org.junit.jupiter.api.condition.JRE; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import java.util.List; +import java.util.stream.Collectors; import java.util.stream.Stream; import static io.netty.buffer.api.MemoryManagers.using; @@ -36,21 +40,23 @@ public class BufferCleanerTest extends BufferTestSupport { Stream.Builder builder = Stream.builder(); builder.add(new Fixture(f + "/" + managers, () -> using(managers, f), f.getProperties())); return builder.build(); - }).toList(); + }).collect(Collectors.toList()); return fixtureCombinations(initFixtures).filter(f -> f.isDirect()).toArray(Fixture[]::new); } + // Only run this one on JDK 17. + @DisabledForJreRange(min = JRE.JAVA_11, max = JRE.JAVA_16) @ParameterizedTest @MethodSource("memorySegmentAllocators") public void bufferMustBeClosedByCleaner(Fixture fixture) throws InterruptedException { - var initial = NativeMemorySegmentManager.MEM_USAGE_NATIVE.sum(); + var initial = Statics.MEM_USAGE_NATIVE.sum(); int allocationSize = 1024; allocateAndForget(fixture, allocationSize); long sum = 0; for (int i = 0; i < 15; i++) { System.gc(); System.runFinalization(); - sum = NativeMemorySegmentManager.MEM_USAGE_NATIVE.sum() - initial; + sum = Statics.MEM_USAGE_NATIVE.sum() - initial; if (sum < allocationSize) { // The memory must have been cleaned. return; diff --git a/src/test/java/io/netty/buffer/api/BufferCompactTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCompactTest.java similarity index 95% rename from src/test/java/io/netty/buffer/api/BufferCompactTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCompactTest.java index 8eaf4e2..ba79516 100644 --- a/src/test/java/io/netty/buffer/api/BufferCompactTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCompactTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferComponentIterationTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferComponentIterationTest.java similarity index 98% rename from src/test/java/io/netty/buffer/api/BufferComponentIterationTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferComponentIterationTest.java index a6db788..006481e 100644 --- a/src/test/java/io/netty/buffer/api/BufferComponentIterationTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferComponentIterationTest.java @@ -13,8 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.ByteCursor; +import io.netty.buffer.api.CompositeBuffer; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferCompositionTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCompositionTest.java similarity index 99% rename from src/test/java/io/netty/buffer/api/BufferCompositionTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCompositionTest.java index 183833b..e003b5d 100644 --- a/src/test/java/io/netty/buffer/api/BufferCompositionTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferCompositionTest.java @@ -13,8 +13,11 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.CompositeBuffer; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferDoubleOffsettedAccessorsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferDoubleOffsettedAccessorsTest.java similarity index 98% rename from src/test/java/io/netty/buffer/api/BufferDoubleOffsettedAccessorsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferDoubleOffsettedAccessorsTest.java index d002692..12d6ea6 100644 --- a/src/test/java/io/netty/buffer/api/BufferDoubleOffsettedAccessorsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferDoubleOffsettedAccessorsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferEnsureWritableTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferEnsureWritableTest.java similarity index 97% rename from src/test/java/io/netty/buffer/api/BufferEnsureWritableTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferEnsureWritableTest.java index c2880d8..8626cc0 100644 --- a/src/test/java/io/netty/buffer/api/BufferEnsureWritableTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferEnsureWritableTest.java @@ -13,8 +13,11 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.CompositeBuffer; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferFloatOffsettedAccessorsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferFloatOffsettedAccessorsTest.java similarity index 98% rename from src/test/java/io/netty/buffer/api/BufferFloatOffsettedAccessorsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferFloatOffsettedAccessorsTest.java index fce4902..837718d 100644 --- a/src/test/java/io/netty/buffer/api/BufferFloatOffsettedAccessorsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferFloatOffsettedAccessorsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferIntOffsettedAccessorsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferIntOffsettedAccessorsTest.java similarity index 99% rename from src/test/java/io/netty/buffer/api/BufferIntOffsettedAccessorsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferIntOffsettedAccessorsTest.java index 3e463b4..ed41ad0 100644 --- a/src/test/java/io/netty/buffer/api/BufferIntOffsettedAccessorsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferIntOffsettedAccessorsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferLongOffsettedAccessorsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferLongOffsettedAccessorsTest.java similarity index 98% rename from src/test/java/io/netty/buffer/api/BufferLongOffsettedAccessorsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferLongOffsettedAccessorsTest.java index 702795e..9495bd4 100644 --- a/src/test/java/io/netty/buffer/api/BufferLongOffsettedAccessorsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferLongOffsettedAccessorsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferMediumOffsettedAccessorsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferMediumOffsettedAccessorsTest.java similarity index 99% rename from src/test/java/io/netty/buffer/api/BufferMediumOffsettedAccessorsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferMediumOffsettedAccessorsTest.java index 4be7196..d380fa7 100644 --- a/src/test/java/io/netty/buffer/api/BufferMediumOffsettedAccessorsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferMediumOffsettedAccessorsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferOffsetsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferOffsetsTest.java similarity index 98% rename from src/test/java/io/netty/buffer/api/BufferOffsetsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferOffsetsTest.java index 25090c6..7dd9b40 100644 --- a/src/test/java/io/netty/buffer/api/BufferOffsetsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferOffsetsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferPrimitiveRelativeAccessorsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferPrimitiveRelativeAccessorsTest.java similarity index 99% rename from src/test/java/io/netty/buffer/api/BufferPrimitiveRelativeAccessorsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferPrimitiveRelativeAccessorsTest.java index 6959a50..1b7c349 100644 --- a/src/test/java/io/netty/buffer/api/BufferPrimitiveRelativeAccessorsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferPrimitiveRelativeAccessorsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferReadOnlyTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferReadOnlyTest.java similarity index 98% rename from src/test/java/io/netty/buffer/api/BufferReadOnlyTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferReadOnlyTest.java index b28ffff..152be4b 100644 --- a/src/test/java/io/netty/buffer/api/BufferReadOnlyTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferReadOnlyTest.java @@ -13,8 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.CompositeBuffer; +import io.netty.buffer.api.Send; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferRefTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferRefTest.java similarity index 95% rename from src/test/java/io/netty/buffer/api/BufferRefTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferRefTest.java index 7a3b271..d6f3abf 100644 --- a/src/test/java/io/netty/buffer/api/BufferRefTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferRefTest.java @@ -13,8 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.BufferRef; +import io.netty.buffer.api.Send; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; diff --git a/src/test/java/io/netty/buffer/api/BufferReferenceCountingTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferReferenceCountingTest.java similarity index 97% rename from src/test/java/io/netty/buffer/api/BufferReferenceCountingTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferReferenceCountingTest.java index d641142..f7f2515 100644 --- a/src/test/java/io/netty/buffer/api/BufferReferenceCountingTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferReferenceCountingTest.java @@ -13,13 +13,16 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; -import org.junit.jupiter.api.Disabled; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.CompositeBuffer; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import java.nio.ByteOrder; import java.util.concurrent.Future; import java.util.concurrent.ThreadLocalRandom; @@ -607,6 +610,23 @@ public class BufferReferenceCountingTest extends BufferTestSupport { } } + @ParameterizedTest + @MethodSource("allocators") + public void splitMustPreserveByteOrder(Fixture fixture) { + try (BufferAllocator allocator = fixture.createAllocator()) { + try (Buffer a = allocator.allocate(8).order(BIG_ENDIAN); + Buffer b = a.split(4)) { + assertThat(a.order()).isEqualTo(BIG_ENDIAN); + assertThat(b.order()).isEqualTo(BIG_ENDIAN); + } + try (Buffer a = allocator.allocate(8).order(LITTLE_ENDIAN); + Buffer b = a.split(4)) { + assertThat(a.order()).isEqualTo(LITTLE_ENDIAN); + assertThat(b.order()).isEqualTo(LITTLE_ENDIAN); + } + } + } + @ParameterizedTest @MethodSource("allocators") public void ensureWritableOnSplitBuffers(Fixture fixture) { diff --git a/src/test/java/io/netty/buffer/api/BufferSendTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferSendTest.java similarity index 97% rename from src/test/java/io/netty/buffer/api/BufferSendTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferSendTest.java index 168ccd9..ba71bae 100644 --- a/src/test/java/io/netty/buffer/api/BufferSendTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferSendTest.java @@ -13,8 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.BufferRef; +import io.netty.buffer.api.Send; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferShortOffsettedAccessorsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferShortOffsettedAccessorsTest.java similarity index 99% rename from src/test/java/io/netty/buffer/api/BufferShortOffsettedAccessorsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferShortOffsettedAccessorsTest.java index 657f6e2..2cded12 100644 --- a/src/test/java/io/netty/buffer/api/BufferShortOffsettedAccessorsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferShortOffsettedAccessorsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/BufferTestSupport.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferTestSupport.java similarity index 97% rename from src/test/java/io/netty/buffer/api/BufferTestSupport.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferTestSupport.java index a5a131b..4fc8d48 100644 --- a/src/test/java/io/netty/buffer/api/BufferTestSupport.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferTestSupport.java @@ -13,9 +13,13 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; -import io.netty.buffer.api.Fixture.Properties; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.CompositeBuffer; +import io.netty.buffer.api.MemoryManagers; +import io.netty.buffer.api.RcSupport; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -35,16 +39,10 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.stream.Stream.Builder; -import static io.netty.buffer.api.Fixture.Properties.CLEANER; -import static io.netty.buffer.api.Fixture.Properties.COMPOSITE; -import static io.netty.buffer.api.Fixture.Properties.CONST; -import static io.netty.buffer.api.Fixture.Properties.DIRECT; -import static io.netty.buffer.api.Fixture.Properties.HEAP; -import static io.netty.buffer.api.Fixture.Properties.POOLED; -import static io.netty.buffer.api.MemoryManagers.using; import static java.nio.ByteOrder.BIG_ENDIAN; import static java.nio.ByteOrder.LITTLE_ENDIAN; import static org.assertj.core.api.Assertions.assertThat; @@ -136,10 +134,10 @@ public abstract class BufferTestSupport { static List initialAllocators() { return List.of( - new Fixture("heap", BufferAllocator::heap, HEAP), - new Fixture("direct", BufferAllocator::direct, DIRECT, CLEANER), - new Fixture("pooledHeap", BufferAllocator::pooledHeap, POOLED, HEAP), - new Fixture("pooledDirect", BufferAllocator::pooledDirect, POOLED, DIRECT, CLEANER)); + new Fixture("heap", BufferAllocator::heap, Fixture.Properties.HEAP), + new Fixture("direct", BufferAllocator::direct, Fixture.Properties.DIRECT, Fixture.Properties.CLEANER), + new Fixture("pooledHeap", BufferAllocator::pooledHeap, Fixture.Properties.POOLED, Fixture.Properties.HEAP), + new Fixture("pooledDirect", BufferAllocator::pooledDirect, Fixture.Properties.POOLED, Fixture.Properties.DIRECT, Fixture.Properties.CLEANER)); } static List initialFixturesForEachImplementation() { @@ -153,10 +151,10 @@ public abstract class BufferTestSupport { initFixtures = initFixtures.stream().flatMap(f -> { Builder builder = Stream.builder(); for (MemoryManagers managers : loadableManagers) { - builder.add(new Fixture(f + "/" + managers, () -> using(managers, f), f.getProperties())); + builder.add(new Fixture(f + "/" + managers, () -> MemoryManagers.using(managers, f), f.getProperties())); } return builder.build(); - }).toList(); + }).collect(Collectors.toList()); return initFixtures; } @@ -194,7 +192,7 @@ public abstract class BufferTestSupport { } } }; - }, COMPOSITE)); + }, Fixture.Properties.COMPOSITE)); } } @@ -221,7 +219,7 @@ public abstract class BufferTestSupport { } } }; - }, COMPOSITE)); + }, Fixture.Properties.COMPOSITE)); for (Fixture fixture : initFixtures) { builder.add(new Fixture(fixture + ".ensureWritable", () -> { @@ -269,7 +267,7 @@ public abstract class BufferTestSupport { } } }; - }, COMPOSITE)); + }, Fixture.Properties.COMPOSITE)); } var stream = builder.build(); @@ -307,7 +305,7 @@ public abstract class BufferTestSupport { private static Stream injectSlices(Fixture f) { Builder builder = Stream.builder(); builder.add(f); - var props = concat(f.getProperties(), Properties.SLICE); + var props = concat(f.getProperties(), Fixture.Properties.SLICE); builder.add(new Fixture(f + ".slice(0, capacity())", () -> { return new BufferAllocator() { BufferAllocator allocatorBase; @@ -351,7 +349,7 @@ public abstract class BufferTestSupport { return builder.build(); } - private static Properties[] concat(Properties[] props, Properties prop) { + private static Fixture.Properties[] concat(Fixture.Properties[] props, Fixture.Properties prop) { props = Arrays.copyOf(props, props.length + 1); props[props.length - 1] = prop; return props; diff --git a/src/test/java/io/netty/buffer/api/BufferWriteBytesCombinationsTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferWriteBytesCombinationsTest.java similarity index 96% rename from src/test/java/io/netty/buffer/api/BufferWriteBytesCombinationsTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferWriteBytesCombinationsTest.java index 0d10e96..001224f 100644 --- a/src/test/java/io/netty/buffer/api/BufferWriteBytesCombinationsTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferWriteBytesCombinationsTest.java @@ -13,8 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; diff --git a/src/test/java/io/netty/buffer/api/EchoIT.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/EchoIT.java similarity index 97% rename from src/test/java/io/netty/buffer/api/EchoIT.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/EchoIT.java index c9ea1fb..6009a9c 100644 --- a/src/test/java/io/netty/buffer/api/EchoIT.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/EchoIT.java @@ -13,13 +13,15 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; import io.netty.bootstrap.Bootstrap; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; +import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.adaptor.ByteBufAllocatorAdaptor; -import io.netty.buffer.api.examples.echo.EchoServerHandler; +import io.netty.buffer.api.tests.examples.echo.EchoServerHandler; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; diff --git a/src/test/java/io/netty/buffer/api/Fixture.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/Fixture.java similarity index 96% rename from src/test/java/io/netty/buffer/api/Fixture.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/Fixture.java index 8d0a677..97a3289 100644 --- a/src/test/java/io/netty/buffer/api/Fixture.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/Fixture.java @@ -13,7 +13,9 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; + +import io.netty.buffer.api.BufferAllocator; import java.util.Arrays; import java.util.EnumSet; diff --git a/src/test/java/io/netty/buffer/api/Memoize.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/Memoize.java similarity index 96% rename from src/test/java/io/netty/buffer/api/Memoize.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/Memoize.java index bc5db8d..fbfda6b 100644 --- a/src/test/java/io/netty/buffer/api/Memoize.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/Memoize.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; import java.util.function.Supplier; diff --git a/src/test/java/io/netty/buffer/api/ScopeTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/ScopeTest.java similarity index 92% rename from src/test/java/io/netty/buffer/api/ScopeTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/ScopeTest.java index a48fa3e..3c31881 100644 --- a/src/test/java/io/netty/buffer/api/ScopeTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/ScopeTest.java @@ -13,8 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api; +package io.netty.buffer.api.tests; +import io.netty.buffer.api.Drop; +import io.netty.buffer.api.Owned; +import io.netty.buffer.api.RcSupport; +import io.netty.buffer.api.Scope; import org.junit.jupiter.api.Test; import java.util.ArrayList; diff --git a/src/test/java/io/netty/buffer/api/adaptor/AbstractByteBufTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/adaptor/AbstractByteBufTest.java similarity index 99% rename from src/test/java/io/netty/buffer/api/adaptor/AbstractByteBufTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/adaptor/AbstractByteBufTest.java index eaf40f7..a6b58cd 100644 --- a/src/test/java/io/netty/buffer/api/adaptor/AbstractByteBufTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/adaptor/AbstractByteBufTest.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.adaptor; +package io.netty.buffer.api.tests.adaptor; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; diff --git a/src/test/java/io/netty/buffer/api/adaptor/ByteBufAdaptorTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/adaptor/ByteBufAdaptorTest.java similarity index 96% rename from src/test/java/io/netty/buffer/api/adaptor/ByteBufAdaptorTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/adaptor/ByteBufAdaptorTest.java index 3fdd2f3..34df8ff 100644 --- a/src/test/java/io/netty/buffer/api/adaptor/ByteBufAdaptorTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/adaptor/ByteBufAdaptorTest.java @@ -13,9 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.adaptor; +package io.netty.buffer.api.tests.adaptor; import io.netty.buffer.ByteBuf; +import io.netty.buffer.api.adaptor.ByteBufAllocatorAdaptor; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Ignore; diff --git a/src/test/java/io/netty/buffer/api/benchmarks/ByteIterationBenchmark.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/benchmarks/ByteIterationBenchmark.java similarity index 98% rename from src/test/java/io/netty/buffer/api/benchmarks/ByteIterationBenchmark.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/benchmarks/ByteIterationBenchmark.java index 4197826..f00a9b1 100644 --- a/src/test/java/io/netty/buffer/api/benchmarks/ByteIterationBenchmark.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/benchmarks/ByteIterationBenchmark.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.benchmarks; +package io.netty.buffer.api.tests.benchmarks; import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.Buffer; diff --git a/src/test/java/io/netty/buffer/api/benchmarks/SendBenchmark.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/benchmarks/SendBenchmark.java similarity index 98% rename from src/test/java/io/netty/buffer/api/benchmarks/SendBenchmark.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/benchmarks/SendBenchmark.java index d5c3176..4cbdd3e 100644 --- a/src/test/java/io/netty/buffer/api/benchmarks/SendBenchmark.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/benchmarks/SendBenchmark.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.benchmarks; +package io.netty.buffer.api.tests.benchmarks; import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.Buffer; diff --git a/src/test/java/io/netty/buffer/api/examples/AsyncExample.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/AsyncExample.java similarity index 97% rename from src/test/java/io/netty/buffer/api/examples/AsyncExample.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/AsyncExample.java index 0c8beaa..c9d0f28 100644 --- a/src/test/java/io/netty/buffer/api/examples/AsyncExample.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/AsyncExample.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples; +package io.netty.buffer.api.tests.examples; import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.Buffer; diff --git a/src/test/java/io/netty/buffer/api/examples/ComposingAndSlicingExample.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/ComposingAndSlicingExample.java similarity index 97% rename from src/test/java/io/netty/buffer/api/examples/ComposingAndSlicingExample.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/ComposingAndSlicingExample.java index 62315f3..946008c 100644 --- a/src/test/java/io/netty/buffer/api/examples/ComposingAndSlicingExample.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/ComposingAndSlicingExample.java @@ -13,10 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples; +package io.netty.buffer.api.tests.examples; -import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.CompositeBuffer; import io.netty.buffer.api.Scope; diff --git a/src/test/java/io/netty/buffer/api/examples/FileCopyExample.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/FileCopyExample.java similarity index 98% rename from src/test/java/io/netty/buffer/api/examples/FileCopyExample.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/FileCopyExample.java index 214c3dd..e6cea50 100644 --- a/src/test/java/io/netty/buffer/api/examples/FileCopyExample.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/FileCopyExample.java @@ -13,10 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples; +package io.netty.buffer.api.tests.examples; -import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.CompositeBuffer; import io.netty.buffer.api.Send; diff --git a/src/test/java/io/netty/buffer/api/examples/SendExample.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/SendExample.java similarity index 99% rename from src/test/java/io/netty/buffer/api/examples/SendExample.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/SendExample.java index 948ac13..8fcec60 100644 --- a/src/test/java/io/netty/buffer/api/examples/SendExample.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/SendExample.java @@ -13,10 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples; +package io.netty.buffer.api.tests.examples; -import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.Buffer; +import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.Send; import java.util.concurrent.ExecutorService; diff --git a/src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/AlternativeMessageDecoder.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/AlternativeMessageDecoder.java similarity index 98% rename from src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/AlternativeMessageDecoder.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/AlternativeMessageDecoder.java index 96ae572..249095c 100644 --- a/src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/AlternativeMessageDecoder.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/AlternativeMessageDecoder.java @@ -13,12 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.bytetomessagedecoder; +package io.netty.buffer.api.tests.examples.bytetomessagedecoder; -import io.netty.buffer.api.Buffer; import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.CompositeBuffer; import io.netty.buffer.api.Send; +import io.netty.buffer.api.Buffer; import io.netty.channel.ChannelHandlerAdapter; import io.netty.channel.ChannelHandlerContext; diff --git a/src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/AlternativeMessageDecoderTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/AlternativeMessageDecoderTest.java similarity index 96% rename from src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/AlternativeMessageDecoderTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/AlternativeMessageDecoderTest.java index 64d4d83..d9584ed 100644 --- a/src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/AlternativeMessageDecoderTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/AlternativeMessageDecoderTest.java @@ -13,10 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.bytetomessagedecoder; +package io.netty.buffer.api.tests.examples.bytetomessagedecoder; -import io.netty.buffer.api.Buffer; import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.Buffer; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.embedded.EmbeddedChannel; import org.junit.jupiter.api.Test; @@ -26,7 +26,7 @@ import java.util.Iterator; import java.util.List; import java.util.SplittableRandom; -import static io.netty.buffer.api.BufferTestSupport.toByteArray; +import static io.netty.buffer.api.tests.BufferTestSupport.toByteArray; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/ByteToMessageDecoder.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/ByteToMessageDecoder.java similarity index 99% rename from src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/ByteToMessageDecoder.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/ByteToMessageDecoder.java index cb7a2e3..871d39c 100644 --- a/src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/ByteToMessageDecoder.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/ByteToMessageDecoder.java @@ -13,12 +13,12 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.bytetomessagedecoder; +package io.netty.buffer.api.tests.examples.bytetomessagedecoder; import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.api.Buffer; import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.CompositeBuffer; +import io.netty.buffer.api.Buffer; import io.netty.channel.Channel; import io.netty.channel.ChannelConfig; import io.netty.channel.ChannelFuture; diff --git a/src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java similarity index 85% rename from src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java index cbf3684..cc72823 100644 --- a/src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/ByteToMessageDecoderTest.java @@ -13,10 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.bytetomessagedecoder; +package io.netty.buffer.api.tests.examples.bytetomessagedecoder; -import io.netty.buffer.api.Buffer; import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.Buffer; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.embedded.EmbeddedChannel; @@ -30,8 +30,7 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import static io.netty.buffer.api.BufferAllocator.heap; -import static io.netty.buffer.api.BufferTestSupport.assertEquals; +import static io.netty.buffer.api.tests.BufferTestSupport.assertEquals; import static io.netty.buffer.api.CompositeBuffer.compose; import static java.nio.ByteOrder.BIG_ENDIAN; import static java.nio.ByteOrder.LITTLE_ENDIAN; @@ -61,7 +60,7 @@ public class ByteToMessageDecoderTest { } }); - try (Buffer buf = heap().allocate(4).writeInt(0x01020304)) { + try (Buffer buf = BufferAllocator.heap().allocate(4).writeInt(0x01020304)) { channel.writeInbound(buf.slice()); try (Buffer b = channel.readInbound()) { buf.readByte(); @@ -72,7 +71,7 @@ public class ByteToMessageDecoderTest { @Test public void testRemoveItselfWriteBuffer() { - final Buffer buf = heap().allocate(5, BIG_ENDIAN).writeInt(0x01020304); + final Buffer buf = BufferAllocator.heap().allocate(5, BIG_ENDIAN).writeInt(0x01020304); EmbeddedChannel channel = new EmbeddedChannel(new ByteToMessageDecoder() { private boolean removed; @@ -89,7 +88,7 @@ public class ByteToMessageDecoderTest { }); channel.writeInbound(buf.slice()); - try (Buffer expected = heap().allocate(3, BIG_ENDIAN).writeShort((short) 0x0203).writeByte((byte) 0x04); + try (Buffer expected = BufferAllocator.heap().allocate(3, BIG_ENDIAN).writeShort((short) 0x0203).writeByte((byte) 0x04); Buffer b = channel.readInbound(); Buffer actual = b.slice(); // Only compare readable bytes. buf) { @@ -103,7 +102,7 @@ public class ByteToMessageDecoderTest { */ @Test public void testInternalBufferClearReadAll() { - Buffer buf = heap().allocate(1).writeByte((byte) 'a'); + Buffer buf = BufferAllocator.heap().allocate(1).writeByte((byte) 'a'); EmbeddedChannel channel = newInternalBufferTestChannel(); assertFalse(channel.writeInbound(buf)); assertFalse(channel.finish()); @@ -115,11 +114,11 @@ public class ByteToMessageDecoderTest { */ @Test public void testInternalBufferClearReadPartly() { - final Buffer buf = heap().allocate(2, BIG_ENDIAN).writeShort((short) 0x0102); + final Buffer buf = BufferAllocator.heap().allocate(2, BIG_ENDIAN).writeShort((short) 0x0102); EmbeddedChannel channel = newInternalBufferTestChannel(); assertTrue(channel.writeInbound(buf)); assertTrue(channel.finish()); - try (Buffer expected = heap().allocate(1).writeByte((byte) 0x02); + try (Buffer expected = BufferAllocator.heap().allocate(1).writeByte((byte) 0x02); Buffer b = channel.readInbound(); Buffer actual = b.slice()) { assertEquals(expected, actual); @@ -162,7 +161,7 @@ public class ByteToMessageDecoderTest { byte[] bytes = new byte[1024]; ThreadLocalRandom.current().nextBytes(bytes); - Buffer buffer = heap().allocate(bytes.length); + Buffer buffer = BufferAllocator.heap().allocate(bytes.length); for (byte b : bytes) { buffer.writeByte(b); } @@ -209,7 +208,7 @@ public class ByteToMessageDecoderTest { } } }); - Buffer buf = heap().allocate(2, BIG_ENDIAN).writeShort((short) 0x0102); + Buffer buf = BufferAllocator.heap().allocate(2, BIG_ENDIAN).writeShort((short) 0x0102); assertFalse(channel.writeInbound(buf)); channel.finish(); assertEquals(1, queue.take()); @@ -242,7 +241,7 @@ public class ByteToMessageDecoderTest { } }); - try (Buffer buf = heap().allocate(4, BIG_ENDIAN).writeInt(0x01020304)) { + try (Buffer buf = BufferAllocator.heap().allocate(4, BIG_ENDIAN).writeInt(0x01020304)) { assertTrue(channel.writeInbound(buf.slice())); try (Buffer expected = buf.slice(1, 3); Buffer b = channel.readInbound(); @@ -267,7 +266,7 @@ public class ByteToMessageDecoderTest { byte[] bytes = new byte[1024]; ThreadLocalRandom.current().nextBytes(bytes); - try (Buffer buf = heap().allocate(bytes.length)) { + try (Buffer buf = BufferAllocator.heap().allocate(bytes.length)) { for (byte b : bytes) { buf.writeByte(b); } @@ -308,7 +307,7 @@ public class ByteToMessageDecoderTest { }); byte[] bytes = new byte[1024]; ThreadLocalRandom.current().nextBytes(bytes); - try (Buffer buf = heap().allocate(bytes.length, BIG_ENDIAN); + try (Buffer buf = BufferAllocator.heap().allocate(bytes.length, BIG_ENDIAN); Buffer part1 = buf.slice(0, bytes.length - 1); Buffer part2 = buf.slice(bytes.length - 1, 1)) { for (byte b : bytes) { @@ -333,8 +332,8 @@ public class ByteToMessageDecoderTest { @Override protected void decode(ChannelHandlerContext ctx, Buffer in) { } }); - assertFalse(channel.writeInbound(heap().allocate(8).writeByte((byte) 1).makeReadOnly())); - assertFalse(channel.writeInbound(heap().allocate(1).writeByte((byte) 2))); + assertFalse(channel.writeInbound(BufferAllocator.heap().allocate(8).writeByte((byte) 1).makeReadOnly())); + assertFalse(channel.writeInbound(BufferAllocator.heap().allocate(1).writeByte((byte) 2))); assertFalse(channel.finish()); } @@ -342,11 +341,11 @@ public class ByteToMessageDecoderTest { public void releaseWhenMergeCumulateThrows() { Buffer oldCumulation = writeFailingCumulation(1, 64); oldCumulation.writeByte((byte) 0); - Buffer in = heap().allocate(12, BIG_ENDIAN).writerOffset(12); + Buffer in = BufferAllocator.heap().allocate(12, BIG_ENDIAN).writerOffset(12); Throwable thrown = null; try { - ByteToMessageDecoder.MERGE_CUMULATOR.cumulate(heap(), oldCumulation, in); + ByteToMessageDecoder.MERGE_CUMULATOR.cumulate(BufferAllocator.heap(), oldCumulation, in); } catch (Throwable t) { thrown = t; } @@ -358,7 +357,7 @@ public class ByteToMessageDecoderTest { } private static Buffer writeFailingCumulation(int untilFailure, int capacity) { - Buffer realBuffer = heap().allocate(capacity, BIG_ENDIAN); + Buffer realBuffer = BufferAllocator.heap().allocate(capacity, BIG_ENDIAN); Answer callRealBuffer = inv -> { Object result = inv.getMethod().invoke(realBuffer, inv.getArguments()); if (result == realBuffer) { @@ -386,7 +385,7 @@ public class ByteToMessageDecoderTest { } private static void releaseWhenMergeCumulateThrowsInExpand(int untilFailure, boolean shouldFail) { - Buffer oldCumulation = heap().allocate(8, BIG_ENDIAN).writeByte((byte) 0); + Buffer oldCumulation = BufferAllocator.heap().allocate(8, BIG_ENDIAN).writeByte((byte) 0); Buffer newCumulation = writeFailingCumulation(untilFailure, 16); BufferAllocator allocator = new BufferAllocator() { @@ -396,7 +395,7 @@ public class ByteToMessageDecoderTest { } }; - Buffer in = heap().allocate(12, BIG_ENDIAN).writerOffset(12); + Buffer in = BufferAllocator.heap().allocate(12, BIG_ENDIAN).writerOffset(12); Throwable thrown = null; try { ByteToMessageDecoder.MERGE_CUMULATOR.cumulate(allocator, oldCumulation, in); @@ -421,9 +420,9 @@ public class ByteToMessageDecoderTest { @Test public void releaseWhenCompositeCumulateThrows() { - Buffer in = heap().allocate(12, LITTLE_ENDIAN).writerOffset(12); - try (Buffer cumulation = compose(heap(), heap().allocate(1, BIG_ENDIAN).writeByte((byte) 0).send())) { - ByteToMessageDecoder.COMPOSITE_CUMULATOR.cumulate(heap(), cumulation, in); + Buffer in = BufferAllocator.heap().allocate(12, LITTLE_ENDIAN).writerOffset(12); + try (Buffer cumulation = compose(BufferAllocator.heap(), BufferAllocator.heap().allocate(1, BIG_ENDIAN).writeByte((byte) 0).send())) { + ByteToMessageDecoder.COMPOSITE_CUMULATOR.cumulate(BufferAllocator.heap(), cumulation, in); fail(); } catch (IllegalArgumentException expected) { assertThat(expected).hasMessageContaining("byte order"); @@ -450,30 +449,30 @@ public class ByteToMessageDecoderTest { assertEquals(0, interceptor.readsTriggered); // 0 complete frames, 1 partial frame: SHOULD trigger a read - channel.writeInbound(heap().allocate(2, BIG_ENDIAN).writeShort((short) 0x0001)); + channel.writeInbound(BufferAllocator.heap().allocate(2, BIG_ENDIAN).writeShort((short) 0x0001)); assertEquals(1, interceptor.readsTriggered); // 2 complete frames, 0 partial frames: should NOT trigger a read - channel.writeInbound(heap().allocate(1).writeByte((byte) 2), - heap().allocate(3).writeByte((byte) 3).writeByte((byte) 4).writeByte((byte) 5)); + channel.writeInbound(BufferAllocator.heap().allocate(1).writeByte((byte) 2), + BufferAllocator.heap().allocate(3).writeByte((byte) 3).writeByte((byte) 4).writeByte((byte) 5)); assertEquals(1, interceptor.readsTriggered); // 1 complete frame, 1 partial frame: should NOT trigger a read - channel.writeInbound(heap().allocate(3).writeByte((byte) 6).writeByte((byte) 7).writeByte((byte) 8), - heap().allocate(1).writeByte((byte) 9)); + channel.writeInbound(BufferAllocator.heap().allocate(3).writeByte((byte) 6).writeByte((byte) 7).writeByte((byte) 8), + BufferAllocator.heap().allocate(1).writeByte((byte) 9)); assertEquals(1, interceptor.readsTriggered); // 1 complete frame, 1 partial frame: should NOT trigger a read - channel.writeInbound(heap().allocate(2).writeByte((byte) 10).writeByte((byte) 11), - heap().allocate(1).writeByte((byte) 12)); + channel.writeInbound(BufferAllocator.heap().allocate(2).writeByte((byte) 10).writeByte((byte) 11), + BufferAllocator.heap().allocate(1).writeByte((byte) 12)); assertEquals(1, interceptor.readsTriggered); // 0 complete frames, 1 partial frame: SHOULD trigger a read - channel.writeInbound(heap().allocate(1).writeByte((byte) 13)); + channel.writeInbound(BufferAllocator.heap().allocate(1).writeByte((byte) 13)); assertEquals(2, interceptor.readsTriggered); // 1 complete frame, 0 partial frames: should NOT trigger a read - channel.writeInbound(heap().allocate(1).writeByte((byte) 14)); + channel.writeInbound(BufferAllocator.heap().allocate(1).writeByte((byte) 14)); assertEquals(2, interceptor.readsTriggered); for (int i = 0; i < 5; i++) { @@ -502,7 +501,7 @@ public class ByteToMessageDecoderTest { }; EmbeddedChannel channel = new EmbeddedChannel(decoder); byte[] bytes = {1, 2, 3, 4, 5}; - Buffer buf = heap().allocate(bytes.length); + Buffer buf = BufferAllocator.heap().allocate(bytes.length); for (byte b : bytes) { buf.writeByte(b); } @@ -533,7 +532,7 @@ public class ByteToMessageDecoderTest { }); byte[] bytes = new byte[1024]; ThreadLocalRandom.current().nextBytes(bytes); - try (Buffer buf = heap().allocate(bytes.length)) { + try (Buffer buf = BufferAllocator.heap().allocate(bytes.length)) { for (byte b : bytes) { buf.writeByte(b); } diff --git a/src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/FixedLengthFrameDecoder.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/FixedLengthFrameDecoder.java similarity index 97% rename from src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/FixedLengthFrameDecoder.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/FixedLengthFrameDecoder.java index 9927c10..5bc1807 100644 --- a/src/test/java/io/netty/buffer/api/examples/bytetomessagedecoder/FixedLengthFrameDecoder.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/bytetomessagedecoder/FixedLengthFrameDecoder.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.bytetomessagedecoder; +package io.netty.buffer.api.tests.examples.bytetomessagedecoder; import io.netty.buffer.api.Buffer; import io.netty.channel.ChannelHandlerContext; diff --git a/src/test/java/io/netty/buffer/api/examples/echo/EchoClient.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoClient.java similarity index 98% rename from src/test/java/io/netty/buffer/api/examples/echo/EchoClient.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoClient.java index 2b62c82..aa7a833 100644 --- a/src/test/java/io/netty/buffer/api/examples/echo/EchoClient.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoClient.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.echo; +package io.netty.buffer.api.tests.examples.echo; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; diff --git a/src/test/java/io/netty/buffer/api/examples/echo/EchoClientHandler.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoClientHandler.java similarity index 97% rename from src/test/java/io/netty/buffer/api/examples/echo/EchoClientHandler.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoClientHandler.java index b66bf37..321741f 100644 --- a/src/test/java/io/netty/buffer/api/examples/echo/EchoClientHandler.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoClientHandler.java @@ -13,10 +13,10 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.echo; +package io.netty.buffer.api.tests.examples.echo; -import io.netty.buffer.api.Buffer; import io.netty.buffer.api.BufferAllocator; +import io.netty.buffer.api.Buffer; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; diff --git a/src/test/java/io/netty/buffer/api/examples/echo/EchoServer.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoServer.java similarity index 98% rename from src/test/java/io/netty/buffer/api/examples/echo/EchoServer.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoServer.java index ee235d3..99485ca 100644 --- a/src/test/java/io/netty/buffer/api/examples/echo/EchoServer.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoServer.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.echo; +package io.netty.buffer.api.tests.examples.echo; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.api.adaptor.ByteBufAllocatorAdaptor; diff --git a/src/test/java/io/netty/buffer/api/examples/echo/EchoServerHandler.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoServerHandler.java similarity index 97% rename from src/test/java/io/netty/buffer/api/examples/echo/EchoServerHandler.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoServerHandler.java index bc4306c..921783c 100644 --- a/src/test/java/io/netty/buffer/api/examples/echo/EchoServerHandler.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/echo/EchoServerHandler.java @@ -13,11 +13,11 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.echo; +package io.netty.buffer.api.tests.examples.echo; import io.netty.buffer.ByteBuf; -import io.netty.buffer.api.Buffer; import io.netty.buffer.api.adaptor.ByteBufAdaptor; +import io.netty.buffer.api.Buffer; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; diff --git a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopClient.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopClient.java similarity index 98% rename from src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopClient.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopClient.java index 65ca764..c61a6ac 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopClient.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopClient.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.snoop; +package io.netty.buffer.api.tests.examples.http.snoop; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; diff --git a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopClientHandler.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopClientHandler.java similarity index 97% rename from src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopClientHandler.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopClientHandler.java index b5dff17..2638003 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopClientHandler.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopClientHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.snoop; +package io.netty.buffer.api.tests.examples.http.snoop; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; diff --git a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopClientInitializer.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopClientInitializer.java similarity index 97% rename from src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopClientInitializer.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopClientInitializer.java index ee575f7..9ef7892 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopClientInitializer.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopClientInitializer.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.snoop; +package io.netty.buffer.api.tests.examples.http.snoop; import io.netty.buffer.ByteBufAllocator; import io.netty.channel.ChannelInitializer; diff --git a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopServer.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopServer.java similarity index 98% rename from src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopServer.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopServer.java index dcc864b..cd45eb7 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopServer.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopServer.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.snoop; +package io.netty.buffer.api.tests.examples.http.snoop; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.api.adaptor.ByteBufAllocatorAdaptor; diff --git a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopServerHandler.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopServerHandler.java similarity index 99% rename from src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopServerHandler.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopServerHandler.java index c29986d..6b2b3b2 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopServerHandler.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopServerHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.snoop; +package io.netty.buffer.api.tests.examples.http.snoop; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopServerInitializer.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopServerInitializer.java similarity index 97% rename from src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopServerInitializer.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopServerInitializer.java index ea1224a..16336cd 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/snoop/HttpSnoopServerInitializer.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/snoop/HttpSnoopServerInitializer.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.snoop; +package io.netty.buffer.api.tests.examples.http.snoop; import io.netty.buffer.ByteBufAllocator; import io.netty.channel.ChannelInitializer; diff --git a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadClient.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadClient.java similarity index 99% rename from src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadClient.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadClient.java index ed30827..6c76344 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadClient.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadClient.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.upload; +package io.netty.buffer.api.tests.examples.http.upload; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.api.adaptor.ByteBufAllocatorAdaptor; diff --git a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadClientHandler.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadClientHandler.java similarity index 98% rename from src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadClientHandler.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadClientHandler.java index c959324..1524cea 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadClientHandler.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadClientHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.upload; +package io.netty.buffer.api.tests.examples.http.upload; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; diff --git a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadClientInitializer.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadClientInitializer.java similarity index 97% rename from src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadClientInitializer.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadClientInitializer.java index a054db4..2f2a912 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadClientInitializer.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadClientInitializer.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.upload; +package io.netty.buffer.api.tests.examples.http.upload; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; diff --git a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadServer.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadServer.java similarity index 98% rename from src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadServer.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadServer.java index ebe3d13..d5b8007 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadServer.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadServer.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.upload; +package io.netty.buffer.api.tests.examples.http.upload; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.api.adaptor.ByteBufAllocatorAdaptor; diff --git a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadServerHandler.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadServerHandler.java similarity index 99% rename from src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadServerHandler.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadServerHandler.java index 0f6b62b..b7e285e 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadServerHandler.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadServerHandler.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.upload; +package io.netty.buffer.api.tests.examples.http.upload; import io.netty.buffer.ByteBuf; import io.netty.channel.Channel; diff --git a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadServerInitializer.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadServerInitializer.java similarity index 96% rename from src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadServerInitializer.java rename to buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadServerInitializer.java index 6da70a1..0f72aef 100644 --- a/src/test/java/io/netty/buffer/api/examples/http/upload/HttpUploadServerInitializer.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/examples/http/upload/HttpUploadServerInitializer.java @@ -13,7 +13,7 @@ * License for the specific language governing permissions and limitations * under the License. */ -package io.netty.buffer.api.examples.http.upload; +package io.netty.buffer.api.tests.examples.http.upload; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; diff --git a/pom.xml b/pom.xml index 5240097..5d343b4 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ + 11 + + 11 5.7.0 3.0.0-M5 false @@ -79,10 +82,31 @@ -Xmx2g -Dio.netty.tryReflectionSetAccessible=true --add-opens java.base/java.nio=io.netty.common - --add-modules jdk.incubator.foreign + + + buffer-api + buffer-tests + + + + + Java 17 support + + 17 + + + 17 + --add-modules jdk.incubator.foreign + + + buffer-memseg + + + + @@ -110,8 +134,8 @@ ${java.version} true - ${java.version} - ${java.version} + ${java.compatibility} + ${java.compatibility} ${java.version} true true @@ -120,10 +144,6 @@ -Xlint:-options 256m 1024m - - --add-modules - jdk.incubator.foreign - @@ -170,7 +190,7 @@ **/*Test*.java - ${argLine.common} + ${argLine.common} ${argLine.mod} false 600 @@ -351,90 +371,109 @@ - - - io.netty - netty-common - ${netty.version} - - - io.netty - netty-buffer - ${netty.version} - + + + + io.netty.incubator + netty-incubator-buffer-api + ${project.version} + + + io.netty.incubator + netty-incubator-buffer-memseg + ${project.version} + - - - org.junit.jupiter - junit-jupiter-api - ${junit.version} - test - - - org.junit.jupiter - junit-jupiter-engine - ${junit.version} - test - - - org.junit.jupiter - junit-jupiter-params - ${junit.version} - test - - - org.junit.vintage - junit-vintage-engine - ${junit.version} - test - - - junit - junit - 4.13.1 - test - - - org.assertj - assertj-core - 3.18.0 - test - - - org.mockito - mockito-core - 3.9.0 - test - - - io.netty - netty-build-common - ${netty.build.version} - test - - - io.netty - netty-handler - ${netty.version} - test - - - io.netty - netty-codec-http - ${netty.version} - test - - - org.openjdk.jmh - jmh-core - 1.26 - test - - - org.openjdk.jmh - jmh-generator-annprocess - 1.26 - test - - + + io.netty + netty-common + ${netty.version} + + + io.netty + netty-buffer + ${netty.version} + + + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + org.junit.jupiter + junit-jupiter-params + ${junit.version} + test + + + org.junit.vintage + junit-vintage-engine + ${junit.version} + test + + + junit + junit + 4.13.1 + test + + + org.assertj + assertj-core + 3.18.0 + test + + + org.mockito + mockito-core + 3.10.0 + test + + + net.bytebuddy + byte-buddy + 1.11.0 + test + + + io.netty + netty-build-common + ${netty.build.version} + test + + + io.netty + netty-handler + ${netty.version} + test + + + io.netty + netty-codec-http + ${netty.version} + test + + + org.openjdk.jmh + jmh-core + 1.26 + test + + + org.openjdk.jmh + jmh-generator-annprocess + 1.26 + test + + + \ No newline at end of file From 7e379fd6ad3828863081b5718c3a402a76d533bb Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Fri, 21 May 2021 14:34:33 +0200 Subject: [PATCH 02/11] Make sure to copy test reports out of the finished build container --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 905ad57..d168424 100644 --- a/Makefile +++ b/Makefile @@ -25,6 +25,9 @@ build: image docker start -a build-container || (docker cp build-container:/home/build target/container-output && false) docker wait build-container || (docker cp build-container:/home/build target/container-output && false) docker cp build-container:/home/build/target . + docker cp build-container:/home/build/buffer-api/target . + docker cp build-container:/home/build/buffer-memseg/target . + docker cp build-container:/home/build/buffer-tests/target . docker rm build-container rebuild: clean clean-layer-cache build From e6f867cc5f386dcbf94c9d24659ae1c7cfa0a67c Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Fri, 21 May 2021 15:03:48 +0200 Subject: [PATCH 03/11] Remove some deprecated methods --- .../java/io/netty/buffer/api/pool/PoolArena.java | 10 ---------- .../netty/buffer/api/pool/PoolArenaMetric.java | 16 ---------------- 2 files changed, 26 deletions(-) diff --git a/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArena.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArena.java index 5d5c085..dfe6b76 100644 --- a/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArena.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArena.java @@ -311,11 +311,6 @@ class PoolArena extends SizeClasses implements PoolArenaMetric, AllocatorControl return allocationsSmall.longValue() + allocsNormal + allocationsHuge.longValue(); } - @Override - public long numTinyAllocations() { - return 0; - } - @Override public long numSmallAllocations() { return allocationsSmall.longValue(); @@ -335,11 +330,6 @@ class PoolArena extends SizeClasses implements PoolArenaMetric, AllocatorControl return deallocs + deallocationsHuge.longValue(); } - @Override - public long numTinyDeallocations() { - return 0; - } - @Override public synchronized long numSmallDeallocations() { return deallocationsSmall; diff --git a/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArenaMetric.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArenaMetric.java index c5c2f26..754dd7d 100644 --- a/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArenaMetric.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArenaMetric.java @@ -52,14 +52,6 @@ public interface PoolArenaMetric extends SizeClassesMetric { */ long numAllocations(); - /** - * Return the number of tiny allocations done via the arena. - * - * @deprecated Tiny allocations have been merged into small allocations. - */ - @Deprecated - long numTinyAllocations(); - /** * Return the number of small allocations done via the arena. */ @@ -80,14 +72,6 @@ public interface PoolArenaMetric extends SizeClassesMetric { */ long numDeallocations(); - /** - * Return the number of tiny deallocations done via the arena. - * - * @deprecated Tiny deallocations have been merged into small deallocations. - */ - @Deprecated - long numTinyDeallocations(); - /** * Return the number of small deallocations done via the arena. */ From 1c3b27f9e0bdb15fd91f21f1032fe01a60620d12 Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Fri, 21 May 2021 15:37:59 +0200 Subject: [PATCH 04/11] Further reduce memory overhead of PooledBufferAllocator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … by lazily allocating PoolSubpages inside of the PoolArenas. By default, a pooled allocator creates 32 arenas, and each arena, by default, makes room for 39 PoolSubpage size classes, which all told is 1.248 objects that serve no purpose other than as headers and locks for linked lists. Each of these objects is at least 81 bytes, plus whatever the JVM adds on top. This might not sound like much, but in our testing we'll be creating many thousands of allocators, and then it really adds up. --- .../io/netty/buffer/api/pool/PoolArena.java | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArena.java b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArena.java index dfe6b76..fa4cc90 100644 --- a/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArena.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/pool/PoolArena.java @@ -20,6 +20,8 @@ import io.netty.buffer.api.Buffer; import io.netty.buffer.api.MemoryManager; import io.netty.util.internal.StringUtil; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -29,6 +31,7 @@ import static io.netty.buffer.api.pool.PoolChunk.isSubpage; import static java.lang.Math.max; class PoolArena extends SizeClasses implements PoolArenaMetric, AllocatorControl { + private static final VarHandle SUBPAGE_ARRAY = MethodHandles.arrayElementVarHandle(PoolSubpage[].class); enum SizeClass { Small, Normal @@ -76,9 +79,6 @@ class PoolArena extends SizeClasses implements PoolArenaMetric, AllocatorControl numSmallSubpagePools = nSubpages; smallSubpagePools = newSubpagePoolArray(numSmallSubpagePools); - for (int i = 0; i < smallSubpagePools.length; i ++) { - smallSubpagePools[i] = newSubpagePoolHead(); - } q100 = new PoolChunkList(this, null, 100, Integer.MAX_VALUE, chunkSize); q075 = new PoolChunkList(this, q100, 75, 100, chunkSize); @@ -135,7 +135,7 @@ class PoolArena extends SizeClasses implements PoolArenaMetric, AllocatorControl * Synchronize on the head. This is needed as {@link PoolChunk#allocateSubpage(int)} and * {@link PoolChunk#free(long)} may modify the doubly linked list as well. */ - final PoolSubpage head = smallSubpagePools[sizeIdx]; + PoolSubpage head = findSubpagePoolHead(sizeIdx); final boolean needsNormalAllocation; synchronized (head) { final PoolSubpage s = head.next; @@ -246,7 +246,15 @@ class PoolArena extends SizeClasses implements PoolArenaMetric, AllocatorControl } PoolSubpage findSubpagePoolHead(int sizeIdx) { - return smallSubpagePools[sizeIdx]; + PoolSubpage head = (PoolSubpage) SUBPAGE_ARRAY.getVolatile(smallSubpagePools, sizeIdx); + if (head == null) { + head = newSubpagePoolHead(); + if (!SUBPAGE_ARRAY.compareAndSet(smallSubpagePools, sizeIdx, null, head)) { + // We lost the race. Read the winning value. + head = (PoolSubpage) SUBPAGE_ARRAY.getVolatile(smallSubpagePools, sizeIdx); + } + } + return head; } @Override @@ -288,8 +296,9 @@ class PoolArena extends SizeClasses implements PoolArenaMetric, AllocatorControl private static List subPageMetricList(PoolSubpage[] pages) { List metrics = new ArrayList<>(); - for (PoolSubpage head : pages) { - if (head.next == head) { + for (int i = 0, len = pages.length; i < len; i++) { + PoolSubpage head = (PoolSubpage) SUBPAGE_ARRAY.getVolatile(pages, i); + if (head == null || head.next == head) { continue; } PoolSubpage s = head.next; @@ -432,8 +441,8 @@ class PoolArena extends SizeClasses implements PoolArenaMetric, AllocatorControl private static void appendPoolSubPages(StringBuilder buf, PoolSubpage[] subpages) { for (int i = 0; i < subpages.length; i ++) { - PoolSubpage head = subpages[i]; - if (head.next == head) { + PoolSubpage head = (PoolSubpage) SUBPAGE_ARRAY.getVolatile(subpages, i); + if (head == null || head.next == head) { continue; } @@ -449,8 +458,11 @@ class PoolArena extends SizeClasses implements PoolArenaMetric, AllocatorControl } public void close() { - for (PoolSubpage page : smallSubpagePools) { - page.destroy(); + for (int i = 0, len = smallSubpagePools.length; i < len; i++) { + PoolSubpage page = (PoolSubpage) SUBPAGE_ARRAY.getVolatile(smallSubpagePools, i); + if (page != null) { + page.destroy(); + } } for (PoolChunkList list : new PoolChunkList[] {qInit, q000, q025, q050, q100}) { list.destroy(); From 9dc1d533e3da4ef05092a29bdb376cc2d040db54 Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Fri, 21 May 2021 17:28:07 +0200 Subject: [PATCH 05/11] Fix remaining tests and make the build work on Java 11 --- .../io/netty/buffer/api/internal/Statics.java | 79 ++++++++++++++++++- buffer-memseg-dummy/pom.xml | 30 +++++++ .../src/main/java/module-info.java | 19 +++++ buffer-tests/pom.xml | 27 +++++++ buffer-tests/src/main/java/module-info.java | 4 +- .../tests/BufferReferenceCountingTest.java | 1 + pom.xml | 14 ++++ 7 files changed, 169 insertions(+), 5 deletions(-) create mode 100644 buffer-memseg-dummy/pom.xml create mode 100644 buffer-memseg-dummy/src/main/java/module-info.java diff --git a/buffer-api/src/main/java/io/netty/buffer/api/internal/Statics.java b/buffer-api/src/main/java/io/netty/buffer/api/internal/Statics.java index 76d2605..f6ab7a1 100644 --- a/buffer-api/src/main/java/io/netty/buffer/api/internal/Statics.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/internal/Statics.java @@ -18,7 +18,10 @@ package io.netty.buffer.api.internal; import io.netty.buffer.api.Buffer; import io.netty.buffer.api.Drop; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles.Lookup; +import java.lang.invoke.MethodType; import java.lang.invoke.VarHandle; import java.lang.ref.Cleaner; import java.nio.ByteBuffer; @@ -38,6 +41,28 @@ public interface Statics { return "NO_OP_DROP"; } }; + MethodHandle BB_SLICE_OFFSETS = getByteBufferSliceOffsetsMethodHandle(); + MethodHandle BB_PUT_OFFSETS = getByteBufferPutOffsetsMethodHandle(); + + static MethodHandle getByteBufferSliceOffsetsMethodHandle() { + try { + Lookup lookup = MethodHandles.lookup(); + MethodType type = MethodType.methodType(ByteBuffer.class, int.class, int.class); + return lookup.findVirtual(ByteBuffer.class, "slice", type); + } catch (Exception ignore) { + return null; + } + } + + static MethodHandle getByteBufferPutOffsetsMethodHandle() { + try { + Lookup lookup = MethodHandles.lookup(); + MethodType type = MethodType.methodType(ByteBuffer.class, int.class, ByteBuffer.class, int.class, int.class); + return lookup.findVirtual(ByteBuffer.class, "put", type); + } catch (Exception ignore) { + return null; + } + } static VarHandle findVarHandle(Lookup lookup, Class recv, String name, Class type) { try { @@ -77,16 +102,62 @@ public interface Statics { * support Java 11. */ static ByteBuffer bbslice(ByteBuffer buffer, int fromOffset, int length) { - return buffer.slice(fromOffset, length); -// return buffer.clear().position(fromOffset).limit(fromOffset + length).slice(); + if (BB_SLICE_OFFSETS != null) { + return bbsliceJdk13(buffer, fromOffset, length); + } + return bbsliceFallback(buffer, fromOffset, length); + } + + private static ByteBuffer bbsliceJdk13(ByteBuffer buffer, int fromOffset, int length) { + try { + return (ByteBuffer) BB_SLICE_OFFSETS.invokeExact(buffer, fromOffset, length); + } catch (RuntimeException re) { + throw re; + } catch (Throwable throwable) { + throw new LinkageError("Unexpected exception from ByteBuffer.slice(int,int).", throwable); + } + } + + private static ByteBuffer bbsliceFallback(ByteBuffer buffer, int fromOffset, int length) { + if (fromOffset < 0) { + throw new IndexOutOfBoundsException("The fromOffset must be positive: " + fromOffset + '.'); + } + int newLimit = fromOffset + length; + if (newLimit > buffer.capacity()) { + throw new IndexOutOfBoundsException( + "The limit of " + newLimit + " would be greater than capacity: " + buffer.capacity() + '.'); + } + try { + return buffer.position(fromOffset).limit(newLimit).slice(); + } finally { + buffer.clear(); + } } /** * The ByteBuffer put-buffer-with-offset-and-length method is not available in Java 11. */ static void bbput(ByteBuffer dest, int destPos, ByteBuffer src, int srcPos, int length) { - dest.put(destPos, src, srcPos, length); -// dest.position(destPos).put(bbslice(src, srcPos, length)); + if (BB_PUT_OFFSETS != null) { + bbputJdk16(dest, destPos, src, srcPos, length); + } else { + bbputFallback(dest, destPos, src, srcPos, length); + } + } + + private static void bbputJdk16(ByteBuffer dest, int destPos, ByteBuffer src, int srcPos, int length) { + try { + @SuppressWarnings("unused") // We need to cast the return type in order to invokeExact. + ByteBuffer ignore = (ByteBuffer) BB_PUT_OFFSETS.invokeExact(dest, destPos, src, srcPos, length); + } catch (RuntimeException re) { + throw re; + } catch (Throwable throwable) { + throw new LinkageError("Unexpected exception from ByteBuffer.put(int,ByteBuffer,int,int).", throwable); + } + } + + private static void bbputFallback(ByteBuffer dest, int destPos, ByteBuffer src, int srcPos, int length) { + dest.position(destPos).put(bbslice(src, srcPos, length)); } static IllegalStateException bufferIsClosed() { diff --git a/buffer-memseg-dummy/pom.xml b/buffer-memseg-dummy/pom.xml new file mode 100644 index 0000000..1c1a759 --- /dev/null +++ b/buffer-memseg-dummy/pom.xml @@ -0,0 +1,30 @@ + + + + 4.0.0 + + + io.netty.incubator + netty-incubator-buffer-parent + 0.0.1.Final-SNAPSHOT + + + netty-incubator-buffer-memseg-dummy + 0.0.1.Final-SNAPSHOT + diff --git a/buffer-memseg-dummy/src/main/java/module-info.java b/buffer-memseg-dummy/src/main/java/module-info.java new file mode 100644 index 0000000..bc63aed --- /dev/null +++ b/buffer-memseg-dummy/src/main/java/module-info.java @@ -0,0 +1,19 @@ +/* + * Copyright 2021 The Netty Project + * + * The Netty Project licenses this file to you under the Apache License, + * version 2.0 (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at: + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +module netty.incubator.buffer.memseg { + // Java 11 compatible stand-in module for the memory segment implementation. + // We need this module in order for the tests module to pull in the memseg module. +} diff --git a/buffer-tests/pom.xml b/buffer-tests/pom.xml index 2d05e9a..2ed3b2d 100644 --- a/buffer-tests/pom.xml +++ b/buffer-tests/pom.xml @@ -1,4 +1,19 @@ + @@ -92,5 +107,17 @@ + + Java 11 support for tests + + !17 + + + + io.netty.incubator + netty-incubator-buffer-memseg-dummy + + + \ No newline at end of file diff --git a/buffer-tests/src/main/java/module-info.java b/buffer-tests/src/main/java/module-info.java index 7c72be3..2560866 100644 --- a/buffer-tests/src/main/java/module-info.java +++ b/buffer-tests/src/main/java/module-info.java @@ -21,5 +21,7 @@ open module netty.incubator.buffer.tests { requires static java.logging; requires netty.incubator.buffer; - requires static netty.incubator.buffer.memseg; + // We need to require memseg in order for its implementation to be service loaded. + // Just having it on the module path is not enough. + requires netty.incubator.buffer.memseg; } diff --git a/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferReferenceCountingTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferReferenceCountingTest.java index f7f2515..147d936 100644 --- a/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferReferenceCountingTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/BufferReferenceCountingTest.java @@ -266,6 +266,7 @@ public class BufferReferenceCountingTest extends BufferTestSupport { try (BufferAllocator allocator = fixture.createAllocator(); Buffer buf = allocator.allocate(8)) { assertThrows(IllegalArgumentException.class, () -> buf.slice(0, -1)); + assertThrows(IllegalArgumentException.class, () -> buf.slice(2, -1)); // Verify that the slice is closed properly afterwards. assertTrue(buf.isOwned()); } diff --git a/pom.xml b/pom.xml index 5d343b4..4ea1568 100644 --- a/pom.xml +++ b/pom.xml @@ -105,6 +105,15 @@ buffer-memseg + + Java 11 support for tests + + !17 + + + buffer-memseg-dummy + + @@ -383,6 +392,11 @@ netty-incubator-buffer-memseg ${project.version} + + io.netty.incubator + netty-incubator-buffer-memseg-dummy + ${project.version} + io.netty From a9b8189aa107e5220642ee5f28e4637635d94fb1 Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Fri, 21 May 2021 18:37:42 +0200 Subject: [PATCH 06/11] Add a Java 11 build --- .github/workflows/ci-workflow.yml | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 3795cb9..fb4e702 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -1,4 +1,4 @@ -name: CI Build +name: Build # Controls when the action will run. on: @@ -13,14 +13,9 @@ on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: -# A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: - # This workflow contains a single job called "build" - build: - # The type of runner that the job will run on + java17: runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job steps: # http://man7.org/linux/man-pages/man1/date.1.html - name: Create Cache Key @@ -60,3 +55,14 @@ jobs: # Make room for the docker layer caching to package up layers - name: Cleanup run: rm -fr * + java11: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set up Java 11 + uses: actions/setup-java@v2 + with: + distribution: 'adopt' # See 'Supported distributions' for available options + java-version: '11' + - name: Maven build + run: mvn verify -B -C -T1C -fae From a1f943c8ae6a4267e841e3921e03b46ab82840d6 Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Fri, 21 May 2021 19:15:31 +0200 Subject: [PATCH 07/11] Cache the Maven repository for the Java 11 build --- .github/workflows/ci-workflow.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index fb4e702..3d4c10b 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -64,5 +64,11 @@ jobs: with: distribution: 'adopt' # See 'Supported distributions' for available options java-version: '11' + - uses: actions/cache@v1 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-maven- - name: Maven build run: mvn verify -B -C -T1C -fae From acf9f8b4fb8ae684b01be300bbe890b7a6693981 Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Fri, 21 May 2021 19:17:42 +0200 Subject: [PATCH 08/11] Publish test reports for the Java 11 build --- .github/workflows/ci-workflow.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 3d4c10b..9d96223 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -45,7 +45,7 @@ jobs: github_token: ${{ secrets.GITHUB_TOKEN }} report_paths: '**/target/surefire-reports/TEST-*.xml' commit: ${{ github.event.workflow_run.head_commit.id }} - check_name: Build test reports + check_name: java17 test reports - name: Upload build artefacts uses: actions/upload-artifact@v2 if: ${{ failure() }} @@ -72,3 +72,17 @@ jobs: ${{ runner.os }}-maven- - name: Maven build run: mvn verify -B -C -T1C -fae + - name: Publish Test Report + uses: scacap/action-surefire-report@v1.0.9 + if: ${{ always() }} + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + report_paths: '**/target/surefire-reports/TEST-*.xml' + commit: ${{ github.event.workflow_run.head_commit.id }} + check_name: java11 test reports + - name: Upload build artefacts + uses: actions/upload-artifact@v2 + if: ${{ failure() }} + with: + name: artifacts + path: target/ From 408350622d40ffb6fc2ad3530bb56bd7cd515988 Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Fri, 21 May 2021 21:53:57 +0200 Subject: [PATCH 09/11] Debug issue with the maven cache --- .github/workflows/ci-workflow.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 9d96223..97188f9 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -64,7 +64,7 @@ jobs: with: distribution: 'adopt' # See 'Supported distributions' for available options java-version: '11' - - uses: actions/cache@v1 + - uses: actions/cache@v2 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} @@ -80,6 +80,7 @@ jobs: report_paths: '**/target/surefire-reports/TEST-*.xml' commit: ${{ github.event.workflow_run.head_commit.id }} check_name: java11 test reports + - run: ls -la ~ - name: Upload build artefacts uses: actions/upload-artifact@v2 if: ${{ failure() }} From 0267afc0cdb47bf3f142d063535eb85288c8873a Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Fri, 21 May 2021 22:03:03 +0200 Subject: [PATCH 10/11] Remove redundant step --- .github/workflows/ci-workflow.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 97188f9..a192034 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -80,7 +80,6 @@ jobs: report_paths: '**/target/surefire-reports/TEST-*.xml' commit: ${{ github.event.workflow_run.head_commit.id }} check_name: java11 test reports - - run: ls -la ~ - name: Upload build artefacts uses: actions/upload-artifact@v2 if: ${{ failure() }} From b710546dd5ff47c506484caffa92756e80db6082 Mon Sep 17 00:00:00 2001 From: Chris Vest Date: Fri, 21 May 2021 22:07:17 +0200 Subject: [PATCH 11/11] Short readme update on Java 11 support --- README.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.adoc b/README.adoc index c8edfa4..9533796 100644 --- a/README.adoc +++ b/README.adoc @@ -6,9 +6,9 @@ See the xref:RATIONALE.adoc[RATIONALE] document for more background. == Building and Testing -Short version: just run `make`. +Short version: just run `make` if you want to build on Java 17, otherwise run `mvn install` if you want to build with Java 11, and without support for the `jdk.incubator.foreign` APIs. -The project currently relies on snapshot versions of the https://github.com/openjdk/panama-foreign[Panama Foreign] fork of OpenJDK. +The project (specifically, the `buffer-memseg` module) currently relies on snapshot versions of the https://github.com/openjdk/panama-foreign[Panama Foreign] fork of OpenJDK. This allows us to test out the most recent version of the `jdk.incubator.foreign` APIs, but also make building, and local development more involved. To simplify things, we have a Docker based build, controlled via a Makefile with the following commands: