Skip to content

Commit 87f9e3e

Browse files
[GR-63366] [GR-63470] Refactor and cleanup the safepoint handling in Native Image.
PullRequest: graal/20385
2 parents ad521f0 + 1e7b5ab commit 87f9e3e

File tree

20 files changed

+889
-1084
lines changed

20 files changed

+889
-1084
lines changed

substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/AArch64SafepointCheckOp.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import com.oracle.svm.core.ReservedRegisters;
2828
import com.oracle.svm.core.nodes.SafepointCheckNode;
2929
import com.oracle.svm.core.thread.Safepoint;
30+
import com.oracle.svm.core.thread.SafepointCheckCounter;
31+
import com.oracle.svm.core.thread.SafepointSlowpath;
3032
import com.oracle.svm.core.thread.ThreadingSupportImpl;
3133

3234
import jdk.graal.compiler.asm.aarch64.AArch64Address;
@@ -54,24 +56,24 @@ public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
5456
int safepointSize = 32; // safepoint is an integer
5557
AArch64Address safepointAddress = AArch64Address.createImmediateAddress(safepointSize, AArch64Address.AddressingMode.IMMEDIATE_UNSIGNED_SCALED,
5658
ReservedRegisters.singleton().getThreadRegister(),
57-
Safepoint.getThreadLocalSafepointRequestedOffset());
59+
SafepointCheckCounter.getThreadLocalOffset());
5860
try (ScratchRegister scratchRegister = masm.getScratchRegister()) {
5961
Register scratch = scratchRegister.getRegister();
6062
masm.ldr(safepointSize, scratch, safepointAddress);
6163
if (ThreadingSupportImpl.isRecurringCallbackSupported()) {
62-
/* Before subtraction, Safepoint.safepointRequested is being compared against 1. */
64+
/* Before subtraction, the counter is compared against 1. */
6365
masm.subs(safepointSize, scratch, scratch, 1);
6466
masm.str(safepointSize, scratch, safepointAddress);
6567
} else {
66-
/* Safepoint.safepointRequested is being compared against 0. */
68+
/* Counter is compared against 0. */
6769
masm.compare(safepointSize, scratch, 0);
6870
}
6971
}
7072
}
7173

7274
/**
73-
* The slow path should be entered when Safepoint.safepointRequested is <= 0. See Safepoint.java
74-
* for more details about safepoint orchestration.
75+
* The slow path should be entered when the counter is <= 0. See classes {@link Safepoint} and
76+
* {@link SafepointSlowpath} for more details about safepoint orchestration.
7577
*/
7678
public AArch64Assembler.ConditionFlag getConditionFlag() {
7779
return AArch64Assembler.ConditionFlag.LE;

substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/AMD64SafepointCheckOp.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
import com.oracle.svm.core.ReservedRegisters;
2828
import com.oracle.svm.core.nodes.SafepointCheckNode;
29-
import com.oracle.svm.core.thread.Safepoint;
29+
import com.oracle.svm.core.thread.SafepointCheckCounter;
3030
import com.oracle.svm.core.thread.ThreadingSupportImpl;
3131

3232
import jdk.graal.compiler.asm.amd64.AMD64Address;
@@ -51,13 +51,12 @@ public AMD64SafepointCheckOp() {
5151

5252
@Override
5353
public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) {
54-
int safepointRequestedOffset = Safepoint.getThreadLocalSafepointRequestedOffset();
55-
AMD64Address safepointRequested = new AMD64Address(ReservedRegisters.singleton().getThreadRegister(), safepointRequestedOffset);
54+
int counterOffset = SafepointCheckCounter.getThreadLocalOffset();
55+
AMD64Address counter = new AMD64Address(ReservedRegisters.singleton().getThreadRegister(), counterOffset);
5656
if (ThreadingSupportImpl.isRecurringCallbackSupported()) {
57-
masm.subl(safepointRequested, 1);
57+
masm.subl(counter, 1);
5858
} else {
59-
// Ensuring safepointRequested offset fits a byte would make for a smaller instruction
60-
masm.cmpl(safepointRequested, 0);
59+
masm.cmpl(counter, 0);
6160
}
6261
}
6362

substratevm/src/com.oracle.svm.core.graal.llvm/src/com/oracle/svm/core/graal/llvm/NodeLLVMBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
import com.oracle.svm.core.meta.SharedField;
6464
import com.oracle.svm.core.meta.SubstrateObjectConstant;
6565
import com.oracle.svm.core.nodes.SafepointCheckNode;
66-
import com.oracle.svm.core.thread.Safepoint;
66+
import com.oracle.svm.core.thread.SafepointCheckCounter;
6767
import com.oracle.svm.core.thread.ThreadingSupportImpl;
6868
import com.oracle.svm.core.thread.VMThreads;
6969
import com.oracle.svm.core.util.VMError;
@@ -358,7 +358,7 @@ private LLVMValueRef emitCondition(LogicNode condition) {
358358
if (condition instanceof SafepointCheckNode) {
359359
LLVMValueRef threadData = gen.buildInlineGetRegister(ReservedRegisters.singleton().getThreadRegister().name);
360360
threadData = builder.buildIntToPtr(threadData, builder.rawPointerType());
361-
LLVMValueRef safepointCounterAddr = builder.buildGEP(threadData, builder.constantInt(Safepoint.getThreadLocalSafepointRequestedOffset()));
361+
LLVMValueRef safepointCounterAddr = builder.buildGEP(threadData, builder.constantInt(SafepointCheckCounter.getThreadLocalOffset()));
362362
LLVMValueRef safepointCount = builder.buildLoad(safepointCounterAddr, builder.intType());
363363
if (ThreadingSupportImpl.isRecurringCallbackSupported()) {
364364
safepointCount = builder.buildSub(safepointCount, builder.constantInt(1));

substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/thread/PosixVMThreads.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public ComparableWord getThreadIdentifier() {
141141
@Override
142142
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
143143
public boolean matchesThread(IsolateThread thread, ComparableWord identifier) {
144-
return VMThreads.OSThreadHandleTL.get(thread).notEqual(identifier);
144+
return VMThreads.OSThreadHandleTL.get(thread).equal(identifier);
145145
}
146146
}
147147
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/RuntimeCodeInfoHistory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public void setValues(String kind, CodeInfo codeInfo, int codeInfoState, String
142142
assert VMOperation.isInProgressAtSafepoint();
143143
assert Heap.getHeap().isInImageHeap(kind);
144144

145-
this.safepointId = Safepoint.Master.singleton().getSafepointId();
145+
this.safepointId = Safepoint.singleton().getSafepointId();
146146
this.uptimeMillis = Isolates.getUptimeMillis();
147147
this.kind = kind;
148148
this.codeInfo = codeInfo;

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/CEntryPointSnippets.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@
9595
import com.oracle.svm.core.snippets.SubstrateForeignCallTarget;
9696
import com.oracle.svm.core.stack.StackOverflowCheck;
9797
import com.oracle.svm.core.thread.PlatformThreads;
98-
import com.oracle.svm.core.thread.Safepoint;
9998
import com.oracle.svm.core.thread.ThreadListenerSupport;
99+
import com.oracle.svm.core.thread.ThreadStatusTransition;
100100
import com.oracle.svm.core.thread.ThreadingSupportImpl;
101101
import com.oracle.svm.core.thread.VMOperationControl;
102102
import com.oracle.svm.core.thread.VMThreads;
@@ -212,7 +212,7 @@ public static int createIsolateSnippet(CEntryPointCreateIsolateParameters parame
212212
if (result != CEntryPointErrors.NO_ERROR) {
213213
return result;
214214
}
215-
Safepoint.transitionNativeToJava(false);
215+
ThreadStatusTransition.fromNativeToJava(false);
216216

217217
return runtimeCallInitializeIsolate(INITIALIZE_ISOLATE, parameters);
218218
}
@@ -516,7 +516,7 @@ public static int attachThreadSnippet(Isolate isolate, boolean startedByIsolate,
516516
return error;
517517
}
518518

519-
Safepoint.transitionNativeToJava(false);
519+
ThreadStatusTransition.fromNativeToJava(false);
520520

521521
if (ensureJavaThread) {
522522
return runtimeCallEnsureJavaThread(ENSURE_JAVA_THREAD);
@@ -725,7 +725,7 @@ public static int enterByIsolateSnippet(Isolate isolate) {
725725
result = runtimeCall(ENTER_BY_ISOLATE, isolate);
726726
if (result == CEntryPointErrors.NO_ERROR) {
727727
if (VMThreads.StatusSupport.isStatusNativeOrSafepoint()) {
728-
Safepoint.transitionNativeToJava(false);
728+
ThreadStatusTransition.fromNativeToJava(false);
729729
}
730730
}
731731
return result;
@@ -765,7 +765,7 @@ public static int enterSnippet(IsolateThread thread) {
765765
*/
766766
runtimeCall(VERIFY_ISOLATE_THREAD, thread);
767767
}
768-
Safepoint.transitionNativeToJava(false);
768+
ThreadStatusTransition.fromNativeToJava(false);
769769

770770
return CEntryPointErrors.NO_ERROR;
771771

@@ -826,7 +826,7 @@ private static void logException(Throwable exception) {
826826

827827
@Snippet(allowMissingProbabilities = true)
828828
public static int returnFromJavaToCSnippet() {
829-
VMThreads.StatusSupport.setStatusNative();
829+
ThreadStatusTransition.fromJavaToNative();
830830
return CEntryPointErrors.NO_ERROR;
831831
}
832832

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/CFunctionSnippets.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
import com.oracle.svm.core.nodes.CPrologueData;
4848
import com.oracle.svm.core.stack.JavaFrameAnchor;
4949
import com.oracle.svm.core.stack.JavaFrameAnchors;
50-
import com.oracle.svm.core.thread.Safepoint;
50+
import com.oracle.svm.core.thread.ThreadStatusTransition;
5151
import com.oracle.svm.core.thread.VMThreads.StatusSupport;
5252
import com.oracle.svm.core.util.VMError;
5353

@@ -128,9 +128,9 @@ private static CPrologueData prologueSnippet(@ConstantParameter int newThreadSta
128128
@Snippet
129129
private static void epilogueSnippet(@ConstantParameter int oldThreadStatus) {
130130
if (oldThreadStatus == StatusSupport.STATUS_IN_NATIVE) {
131-
Safepoint.transitionNativeToJava(true);
131+
ThreadStatusTransition.fromNativeToJava(true);
132132
} else if (oldThreadStatus == StatusSupport.STATUS_IN_VM) {
133-
Safepoint.transitionVMToJava(true);
133+
ThreadStatusTransition.fromVMToJava(true);
134134
} else {
135135
ReplacementsUtil.staticAssert(false, "Unexpected thread status");
136136
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/snippets/SafepointSnippets.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@
3939
import com.oracle.svm.core.graal.meta.SubstrateForeignCallsProvider;
4040
import com.oracle.svm.core.meta.SharedMethod;
4141
import com.oracle.svm.core.nodes.SafepointCheckNode;
42-
import com.oracle.svm.core.thread.Safepoint;
42+
import com.oracle.svm.core.thread.SafepointCheckCounter;
43+
import com.oracle.svm.core.thread.SafepointSlowpath;
4344

4445
import jdk.graal.compiler.api.replacements.Snippet;
4546
import jdk.graal.compiler.core.common.spi.ForeignCallDescriptor;
@@ -59,16 +60,7 @@
5960
import jdk.graal.compiler.replacements.SnippetTemplate.SnippetInfo;
6061
import jdk.graal.compiler.replacements.Snippets;
6162

62-
final class SafepointSnippets extends SubstrateTemplates implements Snippets {
63-
64-
@Snippet
65-
private static void safepointSnippet() {
66-
final boolean needSlowPath = SafepointCheckNode.test();
67-
if (BranchProbabilityNode.probability(BranchProbabilityNode.VERY_SLOW_PATH_PROBABILITY, needSlowPath)) {
68-
callSlowPathSafepointCheck(Safepoint.ENTER_SLOW_PATH_SAFEPOINT_CHECK);
69-
}
70-
}
71-
63+
public final class SafepointSnippets extends SubstrateTemplates implements Snippets {
7264
private final SnippetInfo safepoint;
7365

7466
SafepointSnippets(OptionValues options, Providers providers, Map<Class<? extends Node>, NodeLoweringProvider<?>> lowerings) {
@@ -78,10 +70,18 @@ private static void safepointSnippet() {
7870
lowerings.put(SafepointNode.class, new SafepointLowering());
7971
}
8072

73+
@Snippet
74+
private static void safepointSnippet() {
75+
final boolean needSlowPath = SafepointCheckNode.test();
76+
if (BranchProbabilityNode.probability(BranchProbabilityNode.VERY_SLOW_PATH_PROBABILITY, needSlowPath)) {
77+
callSlowPathSafepointCheck(SafepointSlowpath.ENTER_SLOW_PATH_SAFEPOINT_CHECK);
78+
}
79+
}
80+
8181
private static LocationIdentity[] getKilledLocations() {
8282
int newLength = GC_LOCATIONS.length + 1;
8383
LocationIdentity[] locations = Arrays.copyOf(GC_LOCATIONS, newLength);
84-
locations[newLength - 1] = Safepoint.getThreadLocalSafepointRequestedLocationIdentity();
84+
locations[newLength - 1] = SafepointCheckCounter.getLocationIdentity();
8585
return locations;
8686
}
8787

@@ -109,7 +109,7 @@ class SafepointFeature implements InternalFeature {
109109

110110
@Override
111111
public void registerForeignCalls(SubstrateForeignCallsProvider foreignCalls) {
112-
foreignCalls.register(Safepoint.FOREIGN_CALLS);
112+
foreignCalls.register(SafepointSlowpath.FOREIGN_CALLS);
113113
}
114114

115115
@Override

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/UninterruptibleUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,11 @@ public static int clamp(int value, int min, int max) {
432432
return min(max(value, min), max);
433433
}
434434

435+
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
436+
public static long clamp(long value, long min, long max) {
437+
return min(max(value, min), max);
438+
}
439+
435440
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
436441
public static int abs(int a) {
437442
return (a < 0) ? -a : a;

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/ExecuteVMOperationEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ private static void emit0(VMOperation vmOperation, long requestingThreadId, long
6262
JfrNativeEventWriter.putBoolean(data, vmOperation.getCausesSafepoint());
6363
JfrNativeEventWriter.putBoolean(data, vmOperation.isBlocking());
6464
JfrNativeEventWriter.putThread(data, requestingThreadId);
65-
JfrNativeEventWriter.putLong(data, vmOperation.getCausesSafepoint() ? Safepoint.Master.singleton().getSafepointId().rawValue() : 0);
65+
JfrNativeEventWriter.putLong(data, vmOperation.getCausesSafepoint() ? Safepoint.singleton().getSafepointId().rawValue() : 0);
6666
JfrNativeEventWriter.endSmallEvent(data);
6767
}
6868
}

0 commit comments

Comments
 (0)