Skip to content

Commit

Permalink
Merge pull request #15678 from fengxue-IS/direct_transition
Browse files Browse the repository at this point in the history
Add Continuation direct transition support
  • Loading branch information
gacholio committed Aug 18, 2022
2 parents 3ca0a67 + 1fdb001 commit b1a406d
Show file tree
Hide file tree
Showing 9 changed files with 173 additions and 156 deletions.
18 changes: 13 additions & 5 deletions jcl/src/java.base/share/classes/jdk/internal/vm/Continuation.java
Expand Up @@ -37,9 +37,9 @@ public class Continuation {
private final Runnable runnable;
private Continuation parent;
private boolean started;
private volatile boolean finished;
private boolean finished;

private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
private static JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();

/**
* Continuation's Pinned reasons
Expand Down Expand Up @@ -99,6 +99,9 @@ public Continuation(ContinuationScope scope, Runnable target) {
this.scope = scope;
this.runnable = target;
createContinuationImpl();
if (JLA == null) {
JLA = SharedSecrets.getJavaLangAccess();
}
}

public ContinuationScope getScope() {
Expand Down Expand Up @@ -150,7 +153,12 @@ public static <R> R wrapWalk(Continuation cont, ContinuationScope scope, Supplie
}

private static void execute(Continuation cont) {
cont.runnable.run();
try {
cont.runnable.run();
} finally {
cont.finished = true;
yieldImpl(true);
}
}

public final void run() {
Expand Down Expand Up @@ -203,7 +211,7 @@ public static boolean yield(ContinuationScope scope) {
}
throw new IllegalStateException("Continuation is pinned: " + reason);
}
return yieldImpl();
return yieldImpl(false);
}

protected void onPinned(Pinned reason) {
Expand Down Expand Up @@ -239,6 +247,6 @@ public PreemptStatus tryPreempt(Thread t) {
/* Continuation Native APIs */
private native boolean createContinuationImpl();
private native boolean enterImpl();
private static native boolean yieldImpl();
private static native boolean yieldImpl(boolean isFinished);

}
10 changes: 10 additions & 0 deletions runtime/oti/VMHelpers.hpp
Expand Up @@ -2040,6 +2040,16 @@ class VM_VMHelpers
}
#endif /* JAVA_SPEC_VERSION > 11 */
}

static VMINLINE UDATA
walkContinuationStackFramesWrapper(J9VMThread *vmThread, j9object_t continuationObject, J9StackWalkState *walkState)
{
UDATA rc = J9_STACKWALK_RC_NONE;
#if JAVA_SPEC_VERSION >= 19
rc = walkContinuationStackFrames(vmThread, continuationObject, walkState);
#endif /* JAVA_SPEC_VERSION >= 19 */
return rc;
}
};

#endif /* VMHELPERS_HPP_ */
129 changes: 66 additions & 63 deletions runtime/oti/j9nonbuilder.h
Expand Up @@ -4910,6 +4910,68 @@ typedef struct J9InvocationJavaVM {
J9NativeLibrary * reserved2_library;
} J9InvocationJavaVM;

typedef struct J9JITGPRSpillArea {
#if defined(J9VM_ARCH_S390)
U_8 jitGPRs[16 * 8]; /* r0-r15 full 8-byte */
#elif defined(J9VM_ARCH_POWER) /* J9VM_ARCH_S390 */
UDATA jitGPRs[32]; /* r0-r31 */
UDATA jitCR;
UDATA jitLR;
#elif defined(J9VM_ARCH_ARM) /* J9VM_ARCH_POWER */
#if defined(J9VM_ENV_DATA64)
/* ARM 64 */
#error ARM 64 unsupported
#else /* J9VM_ENV_DATA64 */
/* ARM 32 */
UDATA jitGPRs[16]; /* r0-r15 */
#endif /* J9VM_ENV_DATA64 */
#elif defined(J9VM_ARCH_AARCH64) /* J9VM_ARCH_ARM */
UDATA jitGPRs[32]; /* x0-x31 */
#elif defined(J9VM_ARCH_RISCV) /* J9VM_ARCH_AARCH64 */
UDATA jitGPRs[32]; /* x0-x31 */
#elif defined(J9VM_ARCH_X86) /* J9VM_ARCH_RISCV */
#if defined(J9VM_ENV_DATA64)
union {
UDATA numbered[16];
struct {
UDATA rax;
UDATA rbx;
UDATA rcx;
UDATA rdx;
UDATA rdi;
UDATA rsi;
UDATA rbp;
UDATA rsp;
UDATA r8;
UDATA r9;
UDATA r10;
UDATA r11;
UDATA r12;
UDATA r13;
UDATA r14;
UDATA r15;
} named;
} jitGPRs;
#else /* J9VM_ENV_DATA64 */
union {
UDATA numbered[8];
struct {
UDATA rax;
UDATA rbx;
UDATA rcx;
UDATA rdx;
UDATA rdi;
UDATA rsi;
UDATA rbp;
UDATA rsp;
} named;
} jitGPRs;
#endif /* J9VM_ENV_DATA64 */
#else /* J9VM_ARCH_X86 */
#error Unknown architecture
#endif /* J9VM_ARCH_X86 */
} J9JITGPRSpillArea;

#if JAVA_SPEC_VERSION >= 19
typedef struct J9VMContinuation {
UDATA* arg0EA;
Expand All @@ -4920,7 +4982,10 @@ typedef struct J9VMContinuation {
UDATA* stackOverflowMark;
UDATA* stackOverflowMark2;
J9JavaStack* stackObject;
struct J9VMEntryLocalStorage entryLocalStorage;
struct J9JITDecompilationInfo* decompilationStack;
UDATA* j2iFrame;
struct J9JITGPRSpillArea jitGPRs;
struct J9VMEntryLocalStorage* oldEntryLocalStorage;
} J9VMContinuation;
#endif /* JAVA_SPEC_VERSION >= 19 */

Expand Down Expand Up @@ -5888,68 +5953,6 @@ typedef struct J9JITWatchedStaticFieldData {
#error Math is depending on J9_INLINE_JNI_MAX_ARG_COUNT being 32
#endif

typedef struct J9JITGPRSpillArea {
#if defined(J9VM_ARCH_S390)
U_8 jitGPRs[16 * 8]; /* r0-r15 full 8-byte */
#elif defined(J9VM_ARCH_POWER) /* J9VM_ARCH_S390 */
UDATA jitGPRs[32]; /* r0-r31 */
UDATA jitCR;
UDATA jitLR;
#elif defined(J9VM_ARCH_ARM) /* J9VM_ARCH_POWER */
#if defined(J9VM_ENV_DATA64)
/* ARM 64 */
#error ARM 64 unsupported
#else /* J9VM_ENV_DATA64 */
/* ARM 32 */
UDATA jitGPRs[16]; /* r0-r15 */
#endif /* J9VM_ENV_DATA64 */
#elif defined(J9VM_ARCH_AARCH64) /* J9VM_ARCH_ARM */
UDATA jitGPRs[32]; /* x0-x31 */
#elif defined(J9VM_ARCH_RISCV) /* J9VM_ARCH_AARCH64 */
UDATA jitGPRs[32]; /* x0-x31 */
#elif defined(J9VM_ARCH_X86) /* J9VM_ARCH_RISCV */
#if defined(J9VM_ENV_DATA64)
union {
UDATA numbered[16];
struct {
UDATA rax;
UDATA rbx;
UDATA rcx;
UDATA rdx;
UDATA rdi;
UDATA rsi;
UDATA rbp;
UDATA rsp;
UDATA r8;
UDATA r9;
UDATA r10;
UDATA r11;
UDATA r12;
UDATA r13;
UDATA r14;
UDATA r15;
} named;
} jitGPRs;
#else /* J9VM_ENV_DATA64 */
union {
UDATA numbered[8];
struct {
UDATA rax;
UDATA rbx;
UDATA rcx;
UDATA rdx;
UDATA rdi;
UDATA rsi;
UDATA rbp;
UDATA rsp;
} named;
} jitGPRs;
#endif /* J9VM_ENV_DATA64 */
#else /* J9VM_ARCH_X86 */
#error Unknown architecture
#endif /* J9VM_ARCH_X86 */
} J9JITGPRSpillArea;

typedef struct J9CInterpreterStackFrame {
#if defined(J9VM_ARCH_S390)
#if defined(J9ZOS390)
Expand Down
10 changes: 10 additions & 0 deletions runtime/oti/vm_api.h
Expand Up @@ -4343,6 +4343,16 @@ yieldContinuation(struct J9VMThread *currentThread);
*/
jint
isPinnedContinuation(J9VMThread *currentThread);

/**
* @brief Walk the stackframes associated with Continuation object
*
* @param currentThread
* @param continuationObject
* @return UDATA
*/
UDATA
walkContinuationStackFrames(J9VMThread *currentThread, j9object_t continuationObject, J9StackWalkState *walkState);
#endif /* JAVA_SPEC_VERSION >= 19 */

/* ---------------- hookableAsync.c ---------------- */
Expand Down
2 changes: 2 additions & 0 deletions runtime/oti/vmconstantpool.xml
Expand Up @@ -473,6 +473,8 @@ SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-excepti
<staticmethodref class="jdk/internal/loader/NativeLibraries" name="load" signature="(Ljdk/internal/loader/NativeLibraries$NativeLibraryImpl;Ljava/lang/String;ZZZ)Z" versions="15-18"/>
<staticmethodref class="jdk/internal/loader/NativeLibraries" name="load" signature="(Ljdk/internal/loader/NativeLibraries$NativeLibraryImpl;Ljava/lang/String;ZZ)Z" versions="19-"/>

<!-- Static method references needed to support VirtualThread/Continuation. -->
<staticmethodref class="jdk/internal/vm/Continuation" name="execute" signature="(Ljdk/internal/vm/Continuation;)V" versions="19-"/>
<!-- Security manager check -->
<staticfieldref class="java/lang/System" name="security" signature="Ljava/lang/SecurityManager;"/>

Expand Down
20 changes: 10 additions & 10 deletions runtime/vm/BytecodeInterpreter.hpp
Expand Up @@ -5177,37 +5177,37 @@ class INTERPRETER_CLASS
enterContinuationImpl(REGISTER_ARGS_LIST)
{
VM_BytecodeAction rc = EXECUTE_BYTECODE;
jboolean res = JNI_FALSE;

j9object_t continuationObject = *(j9object_t*)_sp;

buildInternalNativeStackFrame(REGISTER_ARGS);
updateVMStruct(REGISTER_ARGS);

res = enterContinuation(_currentThread, continuationObject);
if (enterContinuation(_currentThread, continuationObject)) {
_sendMethod = J9VMJDKINTERNALVMCONTINUATION_EXECUTE_METHOD(_currentThread->javaVM);
rc = GOTO_RUN_METHOD;
}

VMStructHasBeenUpdated(REGISTER_ARGS);
if (VM_VMHelpers::exceptionPending(_currentThread)) {
rc = GOTO_THROW_CURRENT_EXCEPTION;
goto done;
}

restoreInternalNativeStackFrame(REGISTER_ARGS);
returnSingleFromINL(REGISTER_ARGS, res, 1);
done:
return rc;
}

/* jdk.internal.vm.Continuation: private static native boolean yieldImpl(); */
/* jdk.internal.vm.Continuation: private static native boolean yieldImpl(boolean isFinished); */
VMINLINE VM_BytecodeAction
yieldContinuationImpl(REGISTER_ARGS_LIST)
{
VM_BytecodeAction rc = EXECUTE_BYTECODE;
UDATA isFinished = *(I_32*)_sp;

buildInternalNativeStackFrame(REGISTER_ARGS);
updateVMStruct(REGISTER_ARGS);

/* store the current Continuation state and swap to carrier thread stack */
yieldContinuation(_currentThread);
if (isFinished) {
/* CleanupContinuation */
}

VMStructHasBeenUpdated(REGISTER_ARGS);
restoreInternalNativeStackFrame(REGISTER_ARGS);
Expand Down

0 comments on commit b1a406d

Please sign in to comment.