Commit Graph

135 Commits

Author SHA1 Message Date
Chris Vest
0105e5231d Remove the SizeClassedMemoryPool implementation
And fix the remaining test failures for the PooledBufferAllocator.
The PooledBufferAllocator now also keeps its chunks alive, even after closing the pool, as long as there are allocated buffers that refer to the memory.
The pool now clears all of its relevant internal references when closed, allowing the GC to reclaim all of the pooled memory, assuming no allocated buffers remain.
2021-05-18 18:20:32 +02:00
Chris Vest
dec3756e6d Buffers from the pooling allocator must be able to return memory to the pool if the buffer objects are leaked. 2021-05-17 18:18:31 +02:00
Chris Vest
03743fca0d Pooling allocator cleanups and checkstyle fixes 2021-05-17 16:47:43 +02:00
Chris Vest
12b38234e5 Make sure that every allocation get their own unique Drop instance.
This allows the pooling allocator to precisely control how each allocation should be dropped.
This is important to the pooling allocator, because it needs to know what arena, chunk, page, run, etc. is being freed, exactly.
2021-05-17 15:15:19 +02:00
Chris Vest
fa75c81c6c Fix checkstyle issues 2021-05-12 16:48:24 +02:00
Chris Vest
670cca2d43 Fix more tests
Fundamental design issues remain, though.
Drops can end up being shared across instances with different memory allocations, and this means we can't currently attach the de-allocation information to the drop instance.
We also cannot use the AllocationControl instance for this because it has the same problem.
2021-05-12 16:05:09 +02:00
Chris Vest
6b62b3a6c7 The pooling buffer allocator must allocate buffers with native byte order by default 2021-05-12 10:52:51 +02:00
Chris Vest
481b2ddd3d Switch to the new pooling allocator by default for heap buffers 2021-05-12 10:52:22 +02:00
Chris Vest
1daa0685dc Add license headers 2021-05-12 10:49:09 +02:00
Chris Vest
0c49c887e6 Renames to align with the new API 2021-05-12 10:46:58 +02:00
Chris Vest
b4b0afd787 Second, more complete draft of porting over the pooling allocator from Netty 2021-05-12 10:44:33 +02:00
Chris Vest
ae2abdd2aa First incomplete draft of porting over the pooling allocator 2021-05-11 14:57:42 +02:00
Chris Vest
e6a238b14d Add features to MemoryManager
The ability to allocate a buffer on a sub-region of some recoverable memory will be useful when porting over the arena-based pooling allocator from Netty.
2021-05-11 14:57:42 +02:00
Chris Vest
7b384c3bf2 Remove hacks related to the now lifted ByteBuffer/MemorySegment restrictions 2021-05-11 11:35:38 +02:00
Chris Vest
35b1d4a4fe
Merge pull request #62 from netty/hide-refcounts
Hide Rc.countBorrows
2021-05-10 10:25:13 +02:00
Chris Vest
ccaed0ae7b
Merge pull request #61 from netty/composite-split
Add splitComponentsFloor and splitComponentsCeil
2021-05-07 17:27:15 +02:00
Chris Vest
9db454ffe5 Fix composite buffer send bug
Fix a bug in CompositeBuffer.send, where the received buffer would not have ownership.
The fix is to avoid incrementing the reference count in the composite buffer constructor call used in the transferOwnership function.
2021-05-07 12:02:55 +02:00
Chris Vest
1eece080af Fix up tests that relied on the borrow count 2021-05-07 11:31:46 +02:00
Chris Vest
ef714c90d9 Hide Rc.countBorrows
The state that people really care about is whether or not an Rc has ownership.
Exposing the reference count will probably just confuse people.
The reference count is still exposed on RcSupport because it may be (and is, in the case of ByteBufAdaptor) needed to support implementation details.
2021-05-07 11:25:42 +02:00
Chris Vest
556d0acc89 Add splitComponentsFloor and splitComponentsCeil
These methods make it possible to accurately split composite buffers at component boundaries, either by rounding the offset down or up to the nearest component boundary, respectively.

Composite buffers already support the split method, but it is hard for client code to predict precisely where component boundaries are placed inside composite buffers.
When split is used with an offset that does not land exactly on a component boundary, then the internal component that the offset lands on will also be split.
This may make it harder to precisely reason about memory life cycles and reuse.
2021-05-07 10:41:46 +02:00
Chris Vest
7b48263184 Re-enable the cleaner tests and make them run faster 2021-05-05 16:09:11 +02:00
Chris Vest
2ab8dd65eb Remove unused imports 2021-05-05 16:09:11 +02:00
Chris Vest
44c476c461 Clarify what it means to close a BufferAllocator 2021-05-05 16:09:11 +02:00
Chris Vest
599c01b762 Make the buffer read-only state irreversible
This greatly simplifies the semantics around the const buffers.
When they can no longer be made writable, there is no longer any need for "deconstification".

I decided to call the method "makeReadOnly" to distinguish it from "asReadOnly" that is seen in ByteBuf and ByteBuffer. The latter two return read-only _views_ of the buffer, while makeReadOnly changes the state of the buffer in-place.
2021-05-05 12:30:52 +02:00
Chris Vest
51cc1e7cf4 More efficient const buffer implementations
The const buffers of the various implementations are now able to share the underlying memory.
At least until they are forced not to.
Const buffers will behave ust like normal buffers, except they start out as read-only.
When they are made writable, or sliced, then they will allocate their own independent copy of the memory.
That way, const buffers can have their contents changed, and behave just like normal buffers.
The const-ness is a pure optimisation that should not have any externally observable behaviour.
2021-05-03 15:00:49 +02:00
Chris Vest
d247ddeae3 Try speeding up the build some more
The number of tests we run is increasing
2021-05-02 17:07:58 +02:00
Chris Vest
3281f72369 First draft of const buffers and how to have buffers as constants
Currently only has a strawman implementation.
2021-04-30 15:35:40 +02:00
Chris Vest
66c2bf4e2c Rename bifurcate to split 2021-04-29 15:34:04 +02:00
Chris Vest
e5d55e2a8e Use covariant return types in CompositeBuffer 2021-04-28 12:46:58 +02:00
Chris Vest
6506e29569 Make tests on composite buffers pass again 2021-04-28 12:33:40 +02:00
Chris Vest
e1cc445d11 The CompositeBuffer.compose methods must return CompositeBuffer instead of Buffer 2021-04-28 12:27:03 +02:00
Chris Vest
f2033263dd Replace CompositeBuffer.extendComposite with extendWith 2021-04-27 16:11:30 +02:00
Chris Vest
2f12455fa9 Make CompositeBuffer part of the public API
And move the composite buffer related methods to it.
2021-04-27 16:11:30 +02:00
Chris Vest
86c929dd5a Remove Deref
This abstraction was only used to allow composing over both buffers and sends of buffers, but we can also do that with method overloads.

The Deref had weird semantics and consequences that didn't make much sense.
In other words, it did not pay a return on its complexity cost.
2021-04-27 16:11:30 +02:00
Chris Vest
49deb77fd3 Allow running AlternativeMessageDecoderTest from Maven 2021-04-27 14:09:27 +02:00
Chris Vest
25b234acd2 Make the BufferBulkAccessTest.writeBytesMustTransferDataAndUpdateOffsets test run faster
Only run a sample of 10% of the possible combinations, and then run them in parallel.
2021-04-27 13:33:28 +02:00
Chris Vest
60954394a5 Use Send.isSendOf to simplify code 2021-04-27 10:03:24 +02:00
Chris Vest
926a1807b4 Clean up code and remove the BufferAdaptor
Instead use Mockito to implement the throwing behaviour on the buffers in those tests.
Sadly Mockito cannot spy or mock our Buffer implementation classes, and does not allow mocking an interface while spying on an implementation, so we have to do a more complicated dance with our mocking.
2021-04-27 10:00:27 +02:00
Chris Vest
c09276373e Fix prose errors 2021-04-27 10:00:27 +02:00
Chris Vest
8c2987a824 Add a Buffer.writeBytes bulk transfer method
This simplifies some of the ByteToMessageDecoder example code.
2021-04-27 10:00:27 +02:00
Chris Vest
d72982a5ef Fix checkstyle issue 2021-04-27 10:00:27 +02:00
Chris Vest
0748d206d2 Add an alternative message decoder implementation
This one is a rewrite, making use of the new APIs where possible.
The test uses bifurcate to cut buffers into segments.
2021-04-27 10:00:27 +02:00
Chris Vest
c081c73885 Port over the ByteToMessageDecoder as an example 2021-04-27 10:00:27 +02:00
Chris Vest
7775460984 Make bifurcate and ensureWritable more flexible
This supports more use cases.
The ensureWritable method can now amortise its allocation cost by allocating more than what is strictly necessary to satisfy the immediate call.
The bifurcate method can now split at a given offset.
2021-04-27 10:00:27 +02:00
Chris Vest
a2d49fed3e Bring slice and bifurcate methods together
They are conceptually related.
2021-04-27 10:00:27 +02:00
Chris Vest
2decac081a Rename Deref.isInstanceOf to referentIsInstanceOf
Motivation:
Derefs are not necessarily their referents.
This is the case for Send, for instance.

Modification:
The Deref.isInstanceOf method is renamed to referentIsInstanceOf.
And a Send.isSendOf method has been added, that simplifies the check for sends, since it could be the case that one also needs to check if the object in question is also a Send instance.

Result:
Cleaner code that is easier to read, when working with Sends.

This fixes https://github.com/netty/netty-incubator-buffer-api/issues/46
2021-04-26 18:33:52 +02:00
Chris Vest
b396252682 Update APIs with the latest project-panama changes 2021-04-26 17:08:40 +02:00
Chris Vest
fdc59cc43c Break up the monolithic BufferTest into multiple test classes
Then run those tests in independent surefire forks.
This should allow Maven to hold on to less test metadata, and cope better with the large number of tests.
2021-04-14 11:44:58 +02:00
Chris Vest
55348fb660 Give more memory to surefire when running the full test suite
There are so many tests now that their metadata takes up a considerable amount of memory.
2021-04-13 15:18:14 +02:00
Chris Vest
99efb7dab9 Fix compilation error after rebase 2021-04-08 21:10:17 +02:00