Skip to content

Commit c956846

Browse files
Simplifications and better naming.
1 parent abf19a3 commit c956846

File tree

9 files changed

+31
-33
lines changed

9 files changed

+31
-33
lines changed

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/ChunkedImageHeapLayouter.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,15 @@
4040
public class ChunkedImageHeapLayouter extends AbstractImageHeapLayouter<ChunkedImageHeapPartition> {
4141
private final ImageHeapInfo heapInfo;
4242
private final long startOffset;
43-
private final boolean isAuxImageHeap;
43+
private final int nullRegionSize;
4444
private final long hugeObjectThreshold;
4545
private ChunkedImageHeapAllocator allocator;
4646

47-
public ChunkedImageHeapLayouter(ImageHeapInfo heapInfo, boolean isAuxImageHeap, long startOffset) {
47+
public ChunkedImageHeapLayouter(ImageHeapInfo heapInfo, long startOffset, int nullRegionSize) {
48+
assert startOffset == 0 || startOffset >= Heap.getHeap().getImageHeapOffsetInAddressSpace() : "must be relative to the heap base";
4849
this.heapInfo = heapInfo;
4950
this.startOffset = startOffset;
50-
this.isAuxImageHeap = isAuxImageHeap;
51+
this.nullRegionSize = nullRegionSize;
5152
this.hugeObjectThreshold = HeapPolicy.getLargeArrayThreshold().rawValue();
5253
}
5354

@@ -68,10 +69,7 @@ protected long getHugeObjectThreshold() {
6869

6970
@Override
7071
protected ImageHeapLayoutInfo doLayout(ImageHeap imageHeap) {
71-
long position = startOffset;
72-
if (!isAuxImageHeap) {
73-
position += Heap.getHeap().getImageHeapNullPageSize();
74-
}
72+
long position = startOffset + nullRegionSize;
7573
allocator = new ChunkedImageHeapAllocator(imageHeap, position);
7674
for (ChunkedImageHeapPartition partition : getPartitions()) {
7775
partition.layout(allocator);
@@ -106,7 +104,7 @@ private void initializeHeapInfo(int dynamicHubCount, long offsetOfFirstWritableA
106104
long writableAligned = offsetOfFirstWritableAlignedChunk;
107105
long writableUnaligned = offsetOfFirstWritableUnalignedChunk;
108106

109-
if (!isAuxImageHeap) {
107+
if (startOffset == 0) {
110108
// Adjust all offsets by the offset of the image heap in the address space.
111109
int imageHeapOffsetInAddressSpace = Heap.getHeap().getImageHeapOffsetInAddressSpace();
112110
writableAligned += imageHeapOffsetInAddressSpace;

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ public int getImageHeapOffsetInAddressSpace() {
444444

445445
@Fold
446446
@Override
447-
public int getImageHeapNullPageSize() {
447+
public int getImageHeapNullRegionSize() {
448448
if (SubstrateOptions.SpawnIsolates.getValue() && !CommittedMemoryProvider.get().guaranteesHeapPreferredAddressSpaceAlignment()) {
449449
/*
450450
* Prepend a single null page to the image heap so that there is a memory protected gap
@@ -657,8 +657,8 @@ static Pointer getImageHeapStart() {
657657
if (imageHeapOffsetInAddressSpace > 0) {
658658
return KnownIntrinsics.heapBase().add(imageHeapOffsetInAddressSpace);
659659
} else {
660-
int nullPageSize = Heap.getHeap().getImageHeapNullPageSize();
661-
return KnownIntrinsics.heapBase().add(nullPageSize);
660+
int nullRegionSize = Heap.getHeap().getImageHeapNullRegionSize();
661+
return KnownIntrinsics.heapBase().add(nullRegionSize);
662662
}
663663
}
664664

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/LinearImageHeapLayouter.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@
3131
public class LinearImageHeapLayouter extends AbstractImageHeapLayouter<LinearImageHeapPartition> {
3232
private final ImageHeapInfo heapInfo;
3333
private final long startOffset;
34-
private final boolean isAuxImageHeap;
34+
private final int nullRegionSize;
3535

36-
public LinearImageHeapLayouter(ImageHeapInfo heapInfo, boolean isAuxImageHeap, long startOffset) {
36+
public LinearImageHeapLayouter(ImageHeapInfo heapInfo, long startOffset, int nullRegionSize) {
37+
assert startOffset == 0 || startOffset >= Heap.getHeap().getImageHeapOffsetInAddressSpace() : "must be relative to the heap base";
3738
this.heapInfo = heapInfo;
3839
this.startOffset = startOffset;
39-
this.isAuxImageHeap = isAuxImageHeap;
40+
this.nullRegionSize = nullRegionSize;
4041
}
4142

4243
@Override
@@ -52,9 +53,7 @@ protected LinearImageHeapPartition createPartition(String name, boolean contains
5253
@Override
5354
protected ImageHeapLayoutInfo doLayout(ImageHeap imageHeap) {
5455
long beginOffset = startOffset;
55-
if (!isAuxImageHeap) {
56-
beginOffset += Heap.getHeap().getImageHeapNullPageSize();
57-
}
56+
beginOffset += nullRegionSize;
5857
LinearImageHeapAllocator allocator = new LinearImageHeapAllocator(beginOffset);
5958
for (LinearImageHeapPartition partition : getPartitions()) {
6059
partition.allocateObjects(allocator);

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/graal/HeapFeature.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,11 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
106106
@Override
107107
public void afterAnalysis(AfterAnalysisAccess access) {
108108
ImageHeapLayouter heapLayouter;
109+
int imageHeapNullRegionSize = Heap.getHeap().getImageHeapNullRegionSize();
109110
if (HeapImpl.usesImageHeapChunks()) { // needs CommittedMemoryProvider: registered late
110-
heapLayouter = new ChunkedImageHeapLayouter(HeapImpl.getImageHeapInfo(), false, 0);
111+
heapLayouter = new ChunkedImageHeapLayouter(HeapImpl.getImageHeapInfo(), 0, imageHeapNullRegionSize);
111112
} else {
112-
heapLayouter = new LinearImageHeapLayouter(HeapImpl.getImageHeapInfo(), false, 0);
113+
heapLayouter = new LinearImageHeapLayouter(HeapImpl.getImageHeapInfo(), 0, imageHeapNullRegionSize);
113114
}
114115
ImageSingletons.add(ImageHeapLayouter.class, heapLayouter);
115116
}

substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/linux/LinuxImageHeapProvider.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,10 @@ public int initialize(Pointer reservedAddressSpace, UnsignedWord reservedSize, W
176176
return CEntryPointErrors.PROTECT_HEAP_FAILED;
177177
}
178178

179-
// Protect the null pages.
180-
int nullPageSize = Heap.getHeap().getImageHeapNullPageSize();
181-
if (nullPageSize > 0) {
182-
if (VirtualMemoryProvider.get().protect(imageHeapBegin, WordFactory.unsigned(nullPageSize), Access.NONE) != 0) {
179+
// Protect the null region.
180+
int nullRegionSize = Heap.getHeap().getImageHeapNullRegionSize();
181+
if (nullRegionSize > 0) {
182+
if (VirtualMemoryProvider.get().protect(imageHeapBegin, WordFactory.unsigned(nullRegionSize), Access.NONE) != 0) {
183183
return CEntryPointErrors.PROTECT_HEAP_FAILED;
184184
}
185185
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Heap.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,13 @@ public List<Class<?>> getLoadedClasses() {
164164
public abstract int getImageHeapOffsetInAddressSpace();
165165

166166
/**
167-
* Returns the number of null bytes that should prepended to the image heap during the image
167+
* Returns the number of null bytes that should be prepended to the image heap during the image
168168
* build. This value must be a multiple of the page size. When the image heap is mapped at
169169
* runtime, this extra memory gets mapped as well but is marked as inaccessible (see
170170
* {@link ImageHeapProvider} for more details).
171171
*/
172172
@Fold
173-
public abstract int getImageHeapNullPageSize();
173+
public abstract int getImageHeapNullRegionSize();
174174

175175
/**
176176
* Returns true if the given object is located in the image heap.

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/AbstractCommittedMemoryProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public boolean guaranteesHeapPreferredAddressSpaceAlignment() {
5151
@Uninterruptible(reason = "Still being initialized.")
5252
protected static int protectSingleIsolateImageHeap() {
5353
assert !SubstrateOptions.SpawnIsolates.getValue() : "Must be handled by ImageHeapProvider when SpawnIsolates is enabled";
54-
assert Heap.getHeap().getImageHeapNullPageSize() == 0 : "Null pages don't make any sense without a heap base.";
54+
assert Heap.getHeap().getImageHeapNullRegionSize() == 0 : "A null region only makes sense with a heap base.";
5555
Pointer heapBegin = IMAGE_HEAP_BEGIN.get();
5656
if (Heap.getHeap().getImageHeapOffsetInAddressSpace() != 0) {
5757
return CEntryPointErrors.MAP_HEAP_FAILED;

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/AbstractCopyingImageHeapProvider.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ public int initialize(Pointer reservedAddressSpace, UnsignedWord reservedSize, W
8787

8888
// Protect the read-only parts at the start of the image heap.
8989
UnsignedWord pageSize = VirtualMemoryProvider.get().getGranularity();
90-
int nullPageSize = Heap.getHeap().getImageHeapNullPageSize();
91-
Pointer firstPartOfReadOnlyImageHeap = imageHeap.add(nullPageSize);
92-
UnsignedWord writableBeginPageOffset = UnsignedUtils.roundDown(IMAGE_HEAP_WRITABLE_BEGIN.get().subtract(imageHeapBegin.add(nullPageSize)), pageSize);
90+
int nullRegionSize = Heap.getHeap().getImageHeapNullRegionSize();
91+
Pointer firstPartOfReadOnlyImageHeap = imageHeap.add(nullRegionSize);
92+
UnsignedWord writableBeginPageOffset = UnsignedUtils.roundDown(IMAGE_HEAP_WRITABLE_BEGIN.get().subtract(imageHeapBegin.add(nullRegionSize)), pageSize);
9393
if (writableBeginPageOffset.aboveThan(0)) {
9494
if (VirtualMemoryProvider.get().protect(firstPartOfReadOnlyImageHeap, writableBeginPageOffset, VirtualMemoryProvider.Access.READ) != 0) {
9595
freeImageHeap(allocatedMemory);
@@ -108,9 +108,9 @@ public int initialize(Pointer reservedAddressSpace, UnsignedWord reservedSize, W
108108
}
109109
}
110110

111-
// Protect the null pages.
112-
if (nullPageSize > 0) {
113-
if (VirtualMemoryProvider.get().protect(imageHeapBegin, WordFactory.unsigned(nullPageSize), Access.NONE) != 0) {
111+
// Protect the null region.
112+
if (nullRegionSize > 0) {
113+
if (VirtualMemoryProvider.get().protect(imageHeapBegin, WordFactory.unsigned(nullRegionSize), Access.NONE) != 0) {
114114
return CEntryPointErrors.PROTECT_HEAP_FAILED;
115115
}
116116
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/os/ImageHeapProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
* When a heap base is used, then the image heap is always mapped in a way that the memory at the
4242
* heap base is protected and marked as inaccessible. Depending on the specific scenario, that
4343
* memory may or may not be part of the Native Image file (see
44-
* {@link Heap#getImageHeapNullPageSize()} and {@link Heap#getImageHeapOffsetInAddressSpace()} for
44+
* {@link Heap#getImageHeapNullRegionSize()} and {@link Heap#getImageHeapOffsetInAddressSpace()} for
4545
* more details). This is done regardless of the used GC, platform, or CPU architecture:
4646
*
4747
* <pre>

0 commit comments

Comments
 (0)