- All Known Subinterfaces:
Arena
- Functional Interface:
- This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
allocate(long, long)
method. A segment allocator defines several methods
which can be useful to create segments from several kinds of Java values such as primitives and arrays.
SegmentAllocator
is a functional interface. Clients can easily obtain a new
segment allocator by using either a lambda expression or a method reference:
SegmentAllocator autoAllocator = (byteSize, byteAlignment) -> Arena.ofAuto().allocate(byteSize, byteAlignment);
This interface defines factories for commonly used allocators:
slicingAllocator(MemorySegment)
obtains an efficient slicing allocator, where memory is allocated by repeatedly slicing the provided memory segment;prefixAllocator(MemorySegment)
obtains an allocator which wraps a segment and recycles its content upon each new allocation request.
Passing a segment allocator to an API can be especially useful in circumstances where a client wants to communicate where
the results of a certain operation (performed by the API) should be stored, as a memory segment. For instance,
downcall method handles can accept an additional
SegmentAllocator
parameter if the underlying foreign function is known to return a struct by-value. Effectively,
the allocator parameter tells the linker where to store the return value of the foreign function.
- Since:
- 22
- API Note:
- Unless otherwise specified, the
allocate(long, long)
method is not thread-safe. Furthermore, memory segments allocated by a segment allocator can be associated with different lifetimes, and can even be backed by overlapping regions of memory. For these reasons, clients should generally only interact with a segment allocator they own.Clients should consider using an arena instead, which, provides strong thread-safety, lifetime and non-overlapping guarantees.
-
Method Summary
Modifier and TypeMethodDescriptiondefault MemorySegment
allocate
(long byteSize) Returns a new memory segment with the givenbyteSize
.allocate
(long byteSize, long byteAlignment) Returns a new memory segment with the givenbyteSize
andbyteAlignment
.default MemorySegment
allocate
(MemoryLayout layout) Returns a new memory segment with the given layout.default MemorySegment
allocate
(MemoryLayout elementLayout, long count) Returns a new memory segment with the givenelementLayout
andcount
.default MemorySegment
allocateFrom
(AddressLayout layout, MemorySegment value) Returns a new memory segment initialized with the address of the providedvalue
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfByte layout, byte value) Returns a new memory segment initialized with the providedbyte
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfByte elementLayout, byte... elements) Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
byte
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfChar layout, char value) Returns a new memory segment initialized with the providedchar
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfChar elementLayout, char... elements) Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
char
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfDouble layout, double value) Returns a new memory segment initialized with the provideddouble
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfDouble elementLayout, double... elements) Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
double
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfFloat layout, float value) Returns a new memory segment initialized with the providedfloat
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfFloat elementLayout, float... elements) Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
float
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfInt layout, int value) Returns a new memory segment initialized with the providedint
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfInt elementLayout, int... elements) Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
int
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfLong layout, long value) Returns a new memory segment initialized with the providedlong
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfLong elementLayout, long... elements) Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
long
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfShort layout, short value) Returns a new memory segment initialized with the providedshort
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(ValueLayout.OfShort elementLayout, short... elements) Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
short
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).default MemorySegment
allocateFrom
(String str) Converts a Java string into a null-terminated C string using the UTF-8 charset, storing the result into a memory segment.default MemorySegment
allocateFrom
(String str, Charset charset) Converts a Java string into a null-terminated C string using the provided charset, and storing the result into a memory segment.static SegmentAllocator
prefixAllocator
(MemorySegment segment) Returns a segment allocator which responds to allocation requests by recycling a single segment.static SegmentAllocator
slicingAllocator
(MemorySegment segment) Returns a segment allocator which responds to allocation requests by returning consecutive slices obtained from the provided segment.
-
Method Details
-
allocateFrom
Converts a Java string into a null-terminated C string using the UTF-8 charset, storing the result into a memory segment.Calling this method is equivalent to the following code:
allocateFrom(str, StandardCharsets.UTF_8);
- Parameters:
str
- the Java string to be converted into a C string.- Returns:
- a new native segment containing the converted C string.
-
allocateFrom
Converts a Java string into a null-terminated C string using the provided charset, and storing the result into a memory segment.This method always replaces malformed-input and unmappable-character sequences with this charset's default replacement byte array. The
CharsetEncoder
class should be used when more control over the encoding process is required.If the given string contains any
'\0'
characters, they will be copied as well. This means that, depending on the method used to read the string, such asMemorySegment.getString(long)
, the string will appear truncated when read again.- Parameters:
str
- the Java string to be converted into a C string.charset
- the charset used to encode the string bytes.- Returns:
- a new native segment containing the converted C string.
- Throws:
UnsupportedOperationException
- ifcharset
is not a standard charset.- Implementation Requirements:
- The default implementation for this method copies the contents of the provided Java string
into a new memory segment obtained by calling
this.allocate(B + N)
, where:B
is the size, in bytes, of the string encoded using the provided charset (e.g.str.getBytes(charset).length
);N
is the size (in bytes) of the terminator char according to the provided charset. For instance, this is 1 forStandardCharsets.US_ASCII
and 2 forStandardCharsets.UTF_16
.
-
allocateFrom
Returns a new memory segment initialized with the providedbyte
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
layout
- the layout of the block of memory to be allocated.value
- the value to be set in the newly allocated memory segment.- Returns:
- a new memory segment initialized with the provided
byte
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg;
-
allocateFrom
Returns a new memory segment initialized with the providedchar
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
layout
- the layout of the block of memory to be allocated.value
- the value to be set in the newly allocated memory segment.- Returns:
- a new memory segment initialized with the provided
char
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg;
-
allocateFrom
Returns a new memory segment initialized with the providedshort
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
layout
- the layout of the block of memory to be allocated.value
- the value to be set in the newly allocated memory segment.- Returns:
- a new memory segment initialized with the provided
short
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg;
-
allocateFrom
Returns a new memory segment initialized with the providedint
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
layout
- the layout of the block of memory to be allocated.value
- the value to be set in the newly allocated memory segment.- Returns:
- a new memory segment initialized with the provided
int
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg;
-
allocateFrom
Returns a new memory segment initialized with the providedfloat
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
layout
- the layout of the block of memory to be allocated.value
- the value to be set in the newly allocated memory segment.- Returns:
- a new memory segment initialized with the provided
float
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg;
-
allocateFrom
Returns a new memory segment initialized with the providedlong
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
layout
- the layout of the block of memory to be allocated.value
- the value to be set in the newly allocated memory segment.- Returns:
- a new memory segment initialized with the provided
long
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg;
-
allocateFrom
Returns a new memory segment initialized with the provideddouble
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
layout
- the layout of the block of memory to be allocated.value
- the value to be set in the newly allocated memory segment.- Returns:
- a new memory segment initialized with the provided
double
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg;
-
allocateFrom
Returns a new memory segment initialized with the address of the providedvalue
as specified by the providedlayout
(i.e. byte ordering, alignment and size).The address value might be narrowed according to the platform address size (see
ValueLayout.ADDRESS
).- Parameters:
layout
- the layout of the block of memory to be allocated.value
- the value to be set in the newly allocated memory segment.- Returns:
- a new memory segment initialized with the address of the provided
value
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
Objects.requireNonNull(value); MemorySegment seg = allocate(Objects.requireNonNull(layout)); seg.set(layout, 0, value); return seg;
-
allocateFrom
Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
byte
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
elementLayout
- the element layout of the array to be allocated.elements
- the short elements to be copied to the newly allocated memory block.- Returns:
- a new memory segment with a byteSize() of
E*layout.byteSize()
initialized with the providedE
byte
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
int size = Objects.requireNonNull(elements).length; MemorySegment seg = allocateArray(Objects.requireNonNull(elementLayout), size); MemorySegment.copy(elements, 0, seg, elementLayout, 0, size); return seg;
-
allocateFrom
Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
short
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
elementLayout
- the element layout of the array to be allocated.elements
- the short elements to be copied to the newly allocated memory block.- Returns:
- a new memory segment with a byteSize() of
E*layout.byteSize()
initialized with the providedE
short
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
int size = Objects.requireNonNull(elements).length; MemorySegment seg = allocateArray(Objects.requireNonNull(elementLayout), size); MemorySegment.copy(elements, 0, seg, elementLayout, 0, size); return seg;
-
allocateFrom
Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
char
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
elementLayout
- the element layout of the array to be allocated.elements
- the short elements to be copied to the newly allocated memory block.- Returns:
- a new memory segment with a byteSize() of
E*layout.byteSize()
initialized with the providedE
char
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
int size = Objects.requireNonNull(elements).length; MemorySegment seg = allocateArray(Objects.requireNonNull(elementLayout), size); MemorySegment.copy(elements, 0, seg, elementLayout, 0, size); return seg;
-
allocateFrom
Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
int
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
elementLayout
- the element layout of the array to be allocated.elements
- the short elements to be copied to the newly allocated memory block.- Returns:
- a new memory segment with a byteSize() of
E*layout.byteSize()
initialized with the providedE
int
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
int size = Objects.requireNonNull(elements).length; MemorySegment seg = allocateArray(Objects.requireNonNull(elementLayout), size); MemorySegment.copy(elements, 0, seg, elementLayout, 0, size); return seg;
-
allocateFrom
Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
float
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
elementLayout
- the element layout of the array to be allocated.elements
- the short elements to be copied to the newly allocated memory block.- Returns:
- a new memory segment with a byteSize() of
E*layout.byteSize()
initialized with the providedE
float
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
int size = Objects.requireNonNull(elements).length; MemorySegment seg = allocateArray(Objects.requireNonNull(elementLayout), size); MemorySegment.copy(elements, 0, seg, elementLayout, 0, size); return seg;
-
allocateFrom
Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
long
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
elementLayout
- the element layout of the array to be allocated.elements
- the short elements to be copied to the newly allocated memory block.- Returns:
- a new memory segment with a byteSize() of
E*layout.byteSize()
initialized with the providedE
long
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
int size = Objects.requireNonNull(elements).length; MemorySegment seg = allocateArray(Objects.requireNonNull(elementLayout), size); MemorySegment.copy(elements, 0, seg, elementLayout, 0, size); return seg;
-
allocateFrom
Returns a new memory segment with a byteSize() ofE*layout.byteSize()
initialized with the providedE
double
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size).- Parameters:
elementLayout
- the element layout of the array to be allocated.elements
- the short elements to be copied to the newly allocated memory block.- Returns:
- a new memory segment with a byteSize() of
E*layout.byteSize()
initialized with the providedE
double
elements
as specified by the providedlayout
(i.e. byte ordering, alignment and size) - Implementation Requirements:
- The default implementation is equivalent to:
int size = Objects.requireNonNull(elements).length; MemorySegment seg = allocateArray(Objects.requireNonNull(elementLayout), size); MemorySegment.copy(elements, 0, seg, elementLayout, 0, size); return seg;
-
allocate
Returns a new memory segment with the given layout.- Parameters:
layout
- the layout of the block of memory to be allocated.- Returns:
- a new memory segment with the given layout
- Implementation Requirements:
- The default implementation for this method calls
this.allocate(layout.byteSize(), layout.byteAlignment())
.
-
allocate
Returns a new memory segment with the givenelementLayout
andcount
.- Parameters:
elementLayout
- the array element layout.count
- the array element count.- Returns:
- a new memory segment with the given
elementLayout
andcount
- Throws:
IllegalArgumentException
- ifelementLayout.byteSize() * count
overflows.IllegalArgumentException
- ifcount < 0
.- Implementation Requirements:
- The default implementation for this method calls
this.allocate(MemoryLayout.sequenceLayout(count, elementLayout))
.
-
allocate
Returns a new memory segment with the givenbyteSize
.- Parameters:
byteSize
- the size (in bytes) of the block of memory to be allocated.- Returns:
- a new memory segment with the given
byteSize
- Throws:
IllegalArgumentException
- ifbyteSize < 0
- Implementation Requirements:
- The default implementation for this method calls
this.allocate(byteSize, 1)
.
-
allocate
Returns a new memory segment with the givenbyteSize
andbyteAlignment
.- Parameters:
byteSize
- the size (in bytes) of the block of memory to be allocated.byteAlignment
- the alignment (in bytes) of the block of memory to be allocated.- Returns:
- a new memory segment with the given
byteSize
andbyteAlignment
- Throws:
IllegalArgumentException
- ifbyteSize < 0
,byteAlignment <= 0
, or ifbyteAlignment
is not a power of 2.
-
slicingAllocator
Returns a segment allocator which responds to allocation requests by returning consecutive slices obtained from the provided segment. Each new allocation request will return a new slice starting at the current offset (modulo additional padding to satisfy alignment constraint), with given size.The returned allocator throws
IndexOutOfBoundsException
when a slice of the provided segment with the requested size and alignment cannot be found.- Parameters:
segment
- the segment which the returned allocator should slice from.- Returns:
- a new slicing allocator
- Implementation Note:
- A slicing allocator is not thread-safe.
-
prefixAllocator
Returns a segment allocator which responds to allocation requests by recycling a single segment. Each new allocation request will return a new slice starting at the segment offset0
, hence the name prefix allocator. Equivalent to (but likely more efficient than) the following code:MemorySegment segment = ... SegmentAllocator prefixAllocator = (size, align) -> segment.asSlice(0, size, align);
IndexOutOfBoundsException
when a slice of the provided segment with the requested size and alignment cannot be found.- Parameters:
segment
- the memory segment to be recycled by the returned allocator.- Returns:
- an allocator which recycles an existing segment upon each new allocation request.
- API Note:
- A prefix allocator can be useful to limit allocation requests in case a client knows that they have fully processed the contents of the allocated segment before the subsequent allocation request takes place.
- Implementation Note:
- While a prefix allocator is thread-safe, concurrent access on the same recycling allocator might cause a thread to overwrite contents written to the underlying segment by a different thread.
-