Skip to content

Commit 81994e7

Browse files
[GR-55179] [GR-55187] Follow-up fixes for continuations.
PullRequest: graal/18245
2 parents 2e54fbf + 6784422 commit 81994e7

File tree

5 files changed

+26
-9
lines changed

5 files changed

+26
-9
lines changed

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/descriptors/Symbol.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,8 @@ public static void ensureInitialized() {
982982
public static final Symbol<Type> java_util_regex_IntHashSet_array = StaticSymbols.putType("[Ljava/util/regex/IntHashSet;");
983983

984984
public static final Symbol<Type> java_util_concurrent_locks_AbstractOwnableSynchronizer = StaticSymbols.putType("Ljava/util/concurrent/locks/AbstractOwnableSynchronizer;");
985+
public static final Symbol<Type> java_util_concurrent_locks_ReentrantLock_Sync = StaticSymbols.putType("Ljava/util/concurrent/locks/ReentrantLock$Sync;");
986+
public static final Symbol<Type> java_util_concurrent_locks_ReentrantReadWriteLock_Sync = StaticSymbols.putType("Ljava/util/concurrent/locks/ReentrantReadWriteLock$Sync;");
985987

986988
// java math
987989
public static final Symbol<Type> java_math_BigInteger = StaticSymbols.putType("Ljava/math/BigInteger;");

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/meta/Meta.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,8 @@ public Meta(EspressoContext context) {
10571057
java_util_concurrent_locks_abstractOwnableSynchronizer = knownKlass(Type.java_util_concurrent_locks_AbstractOwnableSynchronizer);
10581058
java_util_concurrent_locks_AbstractOwnableSynchronizer_exclusiveOwnerThread = java_util_concurrent_locks_abstractOwnableSynchronizer.requireDeclaredField(Name.exclusiveOwnerThread,
10591059
Type.java_lang_Thread);
1060+
java_util_concurrent_locks_ReentrantLock_Sync = knownKlass(Type.java_util_concurrent_locks_ReentrantLock_Sync);
1061+
java_util_concurrent_locks_ReentrantReadWriteLock_Sync = knownKlass(Type.java_util_concurrent_locks_ReentrantReadWriteLock_Sync);
10601062

10611063
java_math_BigInteger = knownKlass(Type.java_math_BigInteger);
10621064
java_math_BigInteger_init = java_math_BigInteger.requireDeclaredMethod(Name._init_, Signature._void_byte_array);
@@ -1888,6 +1890,8 @@ private DiffVersionLoadHelper diff() {
18881890

18891891
public final ObjectKlass java_util_concurrent_locks_abstractOwnableSynchronizer;
18901892
public final Field java_util_concurrent_locks_AbstractOwnableSynchronizer_exclusiveOwnerThread;
1893+
public final ObjectKlass java_util_concurrent_locks_ReentrantLock_Sync;
1894+
public final ObjectKlass java_util_concurrent_locks_ReentrantReadWriteLock_Sync;
18911895

18921896
public final ObjectKlass java_math_BigInteger;
18931897
public final Method java_math_BigInteger_init;

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/BytecodeNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ public Object resumeContinuation(VirtualFrame frame, int bci, int top) {
599599

600600
// set up local state.
601601
InstrumentationSupport instrument = instrumentation;
602-
int statementIndex = instrument == null ? 0 : instrument.hookBCIToNodeIndex.lookup(0, 0, bs.endBCI());
602+
int statementIndex = instrument == null ? 0 : instrument.getStatementIndexAfterJump(0, 0, bs.endBCI());
603603
assert bs.opcode(bci) == QUICK && nodes[bs.readCPI2(bci)] instanceof InvokeContinuableNode;
604604

605605
return executeBodyFromBCI(frame, bci, top, statementIndex, true, true);

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/nodes/NativeMethodNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,11 @@ private Object[] preprocessArgs(JniEnv env, Object[] args) {
102102

103103
@Override
104104
public Object execute(VirtualFrame frame) {
105-
var tls = getContext().getLanguage().getThreadLocalState();
106-
tls.blockContinuationSuspension(); // Can't unwind through native frames.
107105
final JniEnv env = getContext().getJNI();
108106
int nativeFrame = env.getHandles().pushFrame();
109107
NATIVE_METHOD_CALLS.inc();
108+
var tls = getContext().getLanguage().getThreadLocalState();
109+
tls.blockContinuationSuspension(); // Can't unwind through native frames.
110110
try {
111111
Object[] nativeArgs = preprocessArgs(env, frame.getArguments());
112112
Object result = executeNative.execute(boundNative, nativeArgs);

espresso/src/com.oracle.truffle.espresso/src/com/oracle/truffle/espresso/substitutions/Target_java_util_concurrent_locks_AbstractOwnableSynchronizer.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.oracle.truffle.espresso.EspressoLanguage;
2626
import com.oracle.truffle.espresso.meta.Meta;
2727
import com.oracle.truffle.espresso.runtime.staticobject.StaticObject;
28+
import com.oracle.truffle.espresso.vm.InterpreterToVM;
2829

2930
@EspressoSubstitutions
3031
public final class Target_java_util_concurrent_locks_AbstractOwnableSynchronizer {
@@ -33,12 +34,22 @@ private Target_java_util_concurrent_locks_AbstractOwnableSynchronizer() {
3334

3435
@Substitution(hasReceiver = true, isTrivial = true)
3536
public static void setExclusiveOwnerThread(StaticObject self, @JavaType(Thread.class) StaticObject thread, @Inject Meta meta) {
36-
// We don't want to have continuations that "own" anything
37-
EspressoLanguage language = meta.getLanguage();
38-
if (StaticObject.isNull(thread)) {
39-
language.getThreadLocalState().unblockContinuationSuspension();
40-
} else if (language.getCurrentVirtualThread() == thread) {
41-
language.getThreadLocalState().blockContinuationSuspension();
37+
if (InterpreterToVM.instanceOf(self, meta.java_util_concurrent_locks_ReentrantLock_Sync) ||
38+
InterpreterToVM.instanceOf(self, meta.java_util_concurrent_locks_ReentrantReadWriteLock_Sync)) {
39+
// We don't want to have continuations that "own" Locks
40+
// We only handle ReentrantLock$Sync and ReentrantReadWriteLock$Sync which have well
41+
// known semantics that follow the assertions below.
42+
// There are other subclasses of AbstractOwnableSynchronizer in the JDK or in
43+
// user-defined code, but we don't want to guess their semantics or rely on how they use
44+
// this method for our own correctness.
45+
EspressoLanguage language = meta.getLanguage();
46+
if (StaticObject.isNull(thread)) {
47+
assert StaticObject.notNull(meta.java_util_concurrent_locks_AbstractOwnableSynchronizer_exclusiveOwnerThread.getObject(self));
48+
language.getThreadLocalState().unblockContinuationSuspension();
49+
} else if (language.getCurrentVirtualThread() == thread) {
50+
assert meta.java_util_concurrent_locks_AbstractOwnableSynchronizer_exclusiveOwnerThread.getObject(self) != thread;
51+
language.getThreadLocalState().blockContinuationSuspension();
52+
}
4253
}
4354
meta.java_util_concurrent_locks_AbstractOwnableSynchronizer_exclusiveOwnerThread.setObject(self, thread);
4455
}

0 commit comments

Comments
 (0)