14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.internal.foreign;
27
28 import java.lang.foreign.MemorySegment;
29 import java.lang.foreign.SegmentAllocator;
30
31 public final class SlicingAllocator implements SegmentAllocator {
32
33 private final MemorySegment segment;
34 private final long maxAlign;
35
36 private long sp = 0L;
37
38 public SlicingAllocator(MemorySegment segment) {
39 this.segment = segment;
40 this.maxAlign = ((AbstractMemorySegmentImpl)segment).maxAlignMask();
41 }
42
43 MemorySegment trySlice(long byteSize, long byteAlignment) {
44 long min = segment.address();
45 long start = Utils.alignUp(min + sp, byteAlignment) - min;
46 MemorySegment slice = segment.asSlice(start, byteSize, byteAlignment);
47 sp = start + byteSize;
48 return slice;
49 }
50
51 @Override
52 public MemorySegment allocate(long byteSize, long byteAlignment) {
53 Utils.checkAllocationSizeAndAlign(byteSize, byteAlignment);
54 // try to slice from current segment first...
55 return trySlice(byteSize, byteAlignment);
56 }
57 }
|
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.internal.foreign;
27
28 import java.lang.foreign.MemorySegment;
29 import java.lang.foreign.SegmentAllocator;
30
31 public final class SlicingAllocator implements SegmentAllocator {
32
33 private final MemorySegment segment;
34
35 private long sp = 0L;
36
37 public SlicingAllocator(MemorySegment segment) {
38 this.segment = segment;
39 }
40
41 MemorySegment trySlice(long byteSize, long byteAlignment) {
42 long min = segment.address();
43 long start = Utils.alignUp(min + sp, byteAlignment) - min;
44 MemorySegment slice = segment.asSlice(start, byteSize, byteAlignment);
45 sp = start + byteSize;
46 return slice;
47 }
48
49 @Override
50 public MemorySegment allocate(long byteSize, long byteAlignment) {
51 Utils.checkAllocationSizeAndAlign(byteSize, byteAlignment);
52 // try to slice from current segment first...
53 return trySlice(byteSize, byteAlignment);
54 }
55 }
|