Skip to content

Commit 1b6663c

Browse files
committed
Cleanup RubyThread and RubyFiber accesses
1 parent d9822fb commit 1b6663c

16 files changed

+46
-80
lines changed

src/main/java/org/truffleruby/cext/CExtNodes.java

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,7 @@ public abstract static class CallWithCExtLockAndFrameNode extends PrimitiveArray
171171
@Specialization
172172
protected Object callWithCExtLockAndFrame(
173173
VirtualFrame frame, Object receiver, RubyArray argsArray, Object specialVariables, Object block) {
174-
final ExtensionCallStack extensionStack = getLanguage()
175-
.getCurrentThread()
176-
.getCurrentFiber().extensionCallStack;
174+
final ExtensionCallStack extensionStack = getLanguage().getCurrentFiber().extensionCallStack;
177175
final boolean keywordsGiven = RubyArguments.getDescriptor(frame) instanceof KeywordArgumentsDescriptor;
178176
extensionStack.push(keywordsGiven, specialVariables, block);
179177
try {
@@ -195,9 +193,7 @@ protected Object callWithCExtLockAndFrame(
195193
@Cached TranslateInteropExceptionNode translateInteropExceptionNode,
196194
@Cached ConditionProfile ownedProfile,
197195
@Cached UnwrapNode unwrapNode) {
198-
final ExtensionCallStack extensionStack = getLanguage()
199-
.getCurrentThread()
200-
.getCurrentFiber().extensionCallStack;
196+
final ExtensionCallStack extensionStack = getLanguage().getCurrentFiber().extensionCallStack;
201197
final boolean keywordsGiven = RubyArguments.getDescriptor(frame) instanceof KeywordArgumentsDescriptor;
202198
extensionStack.push(keywordsGiven, specialVariables, block);
203199
try {
@@ -845,7 +841,7 @@ public abstract static class RbKeywordGivenNode extends CoreMethodArrayArguments
845841

846842
@Specialization
847843
protected boolean keywordGiven() {
848-
return getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack.areKeywordsGiven();
844+
return getLanguage().getCurrentFiber().extensionCallStack.areKeywordsGiven();
849845
}
850846
}
851847

@@ -854,7 +850,7 @@ public abstract static class BlockProcNode extends CoreMethodArrayArgumentsNode
854850

855851
@Specialization
856852
protected Object block() {
857-
return getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack.getBlock();
853+
return getLanguage().getCurrentFiber().extensionCallStack.getBlock();
858854
}
859855
}
860856

@@ -863,7 +859,7 @@ public abstract static class VarsFromStackNode extends PrimitiveArrayArgumentsNo
863859

864860
@Specialization
865861
protected Object variables() {
866-
return getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack.getSpecialVariables();
862+
return getLanguage().getCurrentFiber().extensionCallStack.getSpecialVariables();
867863
}
868864
}
869865

@@ -1379,9 +1375,7 @@ public abstract static class StoreException extends YieldingCoreMethodNode {
13791375

13801376
@Specialization
13811377
protected Object storeException(CapturedException captured) {
1382-
final ExtensionCallStack extensionStack = getLanguage()
1383-
.getCurrentThread()
1384-
.getCurrentFiber().extensionCallStack;
1378+
final ExtensionCallStack extensionStack = getLanguage().getCurrentFiber().extensionCallStack;
13851379
extensionStack.setException(captured);
13861380
return nil;
13871381
}
@@ -1392,9 +1386,7 @@ public abstract static class RetrieveException extends YieldingCoreMethodNode {
13921386

13931387
@Specialization
13941388
protected Object retrieveException() {
1395-
final ExtensionCallStack extensionStack = getLanguage()
1396-
.getCurrentThread()
1397-
.getCurrentFiber().extensionCallStack;
1389+
final ExtensionCallStack extensionStack = getLanguage().getCurrentFiber().extensionCallStack;
13981390
return extensionStack.getException();
13991391
}
14001392
}

src/main/java/org/truffleruby/cext/ValueWrapperManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public class ValueWrapperManager {
6464
private volatile HandleBlockWeakReference[] blockMap = new HandleBlockWeakReference[0];
6565

6666
public static HandleBlockHolder getBlockHolder(RubyContext context, RubyLanguage language) {
67-
return language.getCurrentThread().getCurrentFiber().handleData;
67+
return language.getCurrentFiber().handleData;
6868
}
6969

7070
/* We keep a map of long wrappers that have been generated because various C extensions assume that any given fixnum

src/main/java/org/truffleruby/core/DataObjectFinalizationService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ private void runFinalizer(DataObjectFinalizerReference ref) throws Error {
8181
if (!getContext().isFinalizing()) {
8282
Object data = ref.dataHolder.getPointer();
8383
if (!nullNode.isNull(data)) {
84-
final ExtensionCallStack stack = getLanguage().getCurrentThread()
85-
.getCurrentFiber().extensionCallStack;
84+
final ExtensionCallStack stack = getLanguage().getCurrentFiber().extensionCallStack;
8685
stack.push(false, stack.getSpecialVariables(), stack.getBlock());
8786
try {
8887
callNode.execute(ref.callable, data);

src/main/java/org/truffleruby/core/FinalizationService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ protected void processReference(RubyContext context, RubyLanguage language,
9595

9696
protected void processReferenceInternal(RubyContext context, RubyLanguage language,
9797
FinalizerReference finalizerReference) {
98-
final ExtensionCallStack stack = language.getCurrentThread().getCurrentFiber().extensionCallStack;
98+
final ExtensionCallStack stack = language.getCurrentFiber().extensionCallStack;
9999
stack.push(stack.areKeywordsGiven(), stack.getSpecialVariables(), stack.getBlock());
100100
try {
101101
while (!context.isFinalizing()) {

src/main/java/org/truffleruby/core/MarkingService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ protected void processReference(RubyContext context, RubyLanguage language, Proc
8787

8888
@TruffleBoundary
8989
public void runAllMarkers(RubyContext context, RubyLanguage language) {
90-
final ExtensionCallStack stack = language.getCurrentThread().getCurrentFiber().extensionCallStack;
90+
final ExtensionCallStack stack = language.getCurrentFiber().extensionCallStack;
9191
stack.push(stack.areKeywordsGiven(), stack.getSpecialVariables(), stack.getBlock());
9292
try {
9393
// TODO (eregon, 15 Sept 2020): there seems to be no synchronization here while walking the list of

src/main/java/org/truffleruby/core/MarkingServiceNodes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public abstract static class KeepAliveNode extends RubyBaseNode {
2727

2828
@Specialization
2929
protected void keepObjectAlive(Object object) {
30-
ExtensionCallStack stack = getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack;
30+
ExtensionCallStack stack = getLanguage().getCurrentFiber().extensionCallStack;
3131
addToList(stack.getKeptObjects(), object);
3232
}
3333

src/main/java/org/truffleruby/core/fiber/FiberManager.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ private void fiberMain(RubyContext context, RubyFiber fiber, RubyProc block, Nod
150150
}
151151

152152
public RubyFiber getReturnFiber(RubyFiber currentFiber, Node currentNode, BranchProfile errorProfile) {
153-
assert currentFiber == currentFiber.rubyThread.getCurrentFiber();
153+
assert currentFiber.isActive();
154154

155155
final RubyFiber rootFiber = currentFiber.rubyThread.getRootFiber();
156156

@@ -317,11 +317,6 @@ public void safepoint(RubyFiber fromFiber, RubyFiber fiber, SafepointAction acti
317317
public void start(RubyFiber fiber, Thread javaThread) {
318318
final ThreadManager threadManager = context.getThreadManager();
319319

320-
if (Thread.currentThread() == javaThread) {
321-
context.getThreadManager().rubyFiber.set(fiber);
322-
}
323-
context.getThreadManager().javaThreadToRubyFiber.put(javaThread, fiber);
324-
325320
fiber.thread = javaThread;
326321

327322
final RubyThread rubyThread = fiber.rubyThread;
@@ -345,11 +340,6 @@ public void cleanup(RubyFiber fiber, Thread javaThread) {
345340

346341
fiber.thread = null;
347342

348-
if (Thread.currentThread() == javaThread) {
349-
threadManager.rubyFiber.remove();
350-
}
351-
threadManager.javaThreadToRubyFiber.remove(javaThread);
352-
353343
fiber.finishedLatch.countDown();
354344
}
355345

@@ -418,7 +408,7 @@ public String getFiberDebugInfo(RubyThread rubyThread) {
418408
builder.append(" (root)");
419409
}
420410

421-
if (fiber == fiber.rubyThread.getCurrentFiber()) {
411+
if (fiber.isActive()) {
422412
builder.append(" (current)");
423413
}
424414

src/main/java/org/truffleruby/core/fiber/FiberNodes.java

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -63,32 +63,31 @@ public Object singleValue(Object[] args) {
6363
return singleValueCastNode.executeSingleValue(args);
6464
}
6565

66-
public abstract Object executeTransferControlTo(RubyThread currentThread, RubyFiber currentFiber,
67-
RubyFiber fiber, FiberOperation operation, ArgumentsDescriptor descriptor, Object[] args);
66+
public abstract Object execute(RubyFiber currentFiber, RubyFiber toFiber, FiberOperation operation,
67+
ArgumentsDescriptor descriptor, Object[] args);
6868

6969
@Specialization
7070
protected Object transfer(
71-
RubyThread currentThread,
7271
RubyFiber currentFiber,
73-
RubyFiber fiber,
72+
RubyFiber toFiber,
7473
FiberOperation operation,
7574
ArgumentsDescriptor descriptor,
7675
Object[] args,
7776
@Cached BranchProfile errorProfile) {
7877

79-
if (fiber.isTerminated()) {
78+
if (toFiber.isTerminated()) {
8079
errorProfile.enter();
8180
throw new RaiseException(getContext(), coreExceptions().deadFiberCalledError(this));
8281
}
8382

84-
if (fiber.rubyThread != currentThread) {
83+
if (toFiber.rubyThread != currentFiber.rubyThread) {
8584
errorProfile.enter();
8685
throw new RaiseException(
8786
getContext(),
8887
coreExceptions().fiberError("fiber called across threads", this));
8988
}
9089

91-
var descriptorAndArgs = getContext().fiberManager.transferControlTo(currentFiber, fiber, operation,
90+
var descriptorAndArgs = getContext().fiberManager.transferControlTo(currentFiber, toFiber, operation,
9291
descriptor, args, this);
9392
// Ignore the descriptor like CRuby here, see https://bugs.ruby-lang.org/issues/18621
9493
return singleValue(descriptorAndArgs.args);
@@ -124,7 +123,6 @@ public abstract static class InitializeNode extends PrimitiveArrayArgumentsNode
124123
@TruffleBoundary
125124
@Specialization
126125
protected Object initialize(RubyFiber fiber, boolean blocking, RubyProc block) {
127-
final RubyThread thread = getLanguage().getCurrentThread();
128126
getContext().fiberManager.initialize(fiber, blocking, block, this);
129127
return nil;
130128
}
@@ -158,17 +156,15 @@ protected Object transfer(VirtualFrame frame, RubyFiber toFiber, Object[] rawArg
158156
.fiberError("attempt to transfer to a yielding fiber", this));
159157
}
160158

161-
final RubyThread currentThread = getLanguage().getCurrentThread();
162-
final RubyFiber currentFiber = currentThread.getCurrentFiber();
159+
final RubyFiber currentFiber = getLanguage().getCurrentFiber();
163160

164161
if (sameFiberProfile.profile(currentFiber == toFiber)) {
165162
// A Fiber can transfer to itself
166163
return fiberTransferNode.singleValue(rawArgs);
167164
}
168165

169-
return fiberTransferNode
170-
.executeTransferControlTo(currentThread, currentFiber, toFiber, FiberOperation.TRANSFER,
171-
RubyArguments.getDescriptor(frame), rawArgs);
166+
return fiberTransferNode.execute(currentFiber, toFiber, FiberOperation.TRANSFER,
167+
RubyArguments.getDescriptor(frame), rawArgs);
172168
}
173169

174170
}
@@ -190,8 +186,7 @@ protected Object resume(
190186
FiberOperation operation, RubyFiber toFiber, ArgumentsDescriptor descriptor, Object[] args,
191187
@Cached BranchProfile errorProfile) {
192188

193-
final RubyThread currentThread = getLanguage().getCurrentThread();
194-
final RubyFiber currentFiber = currentThread.getCurrentFiber();
189+
final RubyFiber currentFiber = getLanguage().getCurrentFiber();
195190

196191
if (toFiber.isTerminated()) {
197192
errorProfile.enter();
@@ -221,8 +216,7 @@ protected Object resume(
221216
coreExceptions().fiberError("attempt to resume a transferring fiber", this));
222217
}
223218

224-
return fiberTransferNode
225-
.executeTransferControlTo(currentThread, currentFiber, toFiber, operation, descriptor, args);
219+
return fiberTransferNode.execute(currentFiber, toFiber, operation, descriptor, args);
226220
}
227221

228222
}
@@ -250,10 +244,8 @@ protected Object raise(RubyFiber fiber, RubyException exception,
250244
}
251245

252246
if (fiber.status == FiberStatus.SUSPENDED && !fiber.yielding) {
253-
final RubyThread currentThread = getLanguage().getCurrentThread();
254-
final RubyFiber currentFiber = currentThread.getCurrentFiber();
255-
return getTransferNode().executeTransferControlTo(
256-
currentThread,
247+
final RubyFiber currentFiber = getLanguage().getCurrentFiber();
248+
return getTransferNode().execute(
257249
currentFiber,
258250
fiber,
259251
FiberOperation.RAISE,
@@ -305,14 +297,12 @@ public abstract static class YieldNode extends CoreMethodArrayArgumentsNode {
305297
protected Object fiberYield(VirtualFrame frame, Object[] rawArgs,
306298
@Cached BranchProfile errorProfile) {
307299

308-
final RubyThread currentThread = getLanguage().getCurrentThread();
309-
final RubyFiber currentFiber = currentThread.getCurrentFiber();
300+
final RubyFiber currentFiber = getLanguage().getCurrentFiber();
310301

311302
final RubyFiber fiberYieldedTo = getContext().fiberManager
312303
.getReturnFiber(currentFiber, this, errorProfile);
313304

314-
return fiberTransferNode.executeTransferControlTo(
315-
currentThread,
305+
return fiberTransferNode.execute(
316306
currentFiber,
317307
fiberYieldedTo,
318308
FiberOperation.YIELD,
@@ -337,7 +327,7 @@ public abstract static class CurrentNode extends CoreMethodNode {
337327

338328
@Specialization
339329
protected RubyFiber current() {
340-
return getLanguage().getCurrentThread().getCurrentFiber();
330+
return getLanguage().getCurrentFiber();
341331
}
342332

343333
}
@@ -373,7 +363,7 @@ public abstract static class FiberGetCatchTagsNode extends PrimitiveArrayArgumen
373363

374364
@Specialization
375365
protected RubyArray getCatchTags() {
376-
final RubyFiber currentFiber = getLanguage().getCurrentThread().getCurrentFiber();
366+
final RubyFiber currentFiber = getLanguage().getCurrentFiber();
377367
return currentFiber.catchTags;
378368
}
379369
}
@@ -394,7 +384,7 @@ public abstract static class IsBlockingNode extends CoreMethodArrayArgumentsNode
394384

395385
@Specialization
396386
protected Object isBlocking() {
397-
RubyFiber currentFiber = getLanguage().getCurrentThread().getCurrentFiber();
387+
RubyFiber currentFiber = getLanguage().getCurrentFiber();
398388
if (currentFiber.blocking) {
399389
return 1;
400390
} else {

src/main/java/org/truffleruby/core/fiber/RubyFiber.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ public boolean isRootFiber() {
115115
return rubyThread.getRootFiber() == this;
116116
}
117117

118+
public boolean isActive() {
119+
return this == rubyThread.getCurrentFiber();
120+
}
121+
118122
public boolean isTerminated() {
119123
return status == FiberStatus.TERMINATED;
120124
}

src/main/java/org/truffleruby/core/thread/ThreadManager.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,6 @@ public class ThreadManager {
8585
private final Set<Thread> rubyManagedThreads = Collections
8686
.newSetFromMap(Collections.synchronizedMap(new WeakHashMap<>()));
8787

88-
public final Map<Thread, RubyFiber> javaThreadToRubyFiber = new ConcurrentHashMap<>();
89-
public final ThreadLocal<RubyFiber> rubyFiber = ThreadLocal
90-
.withInitial(() -> javaThreadToRubyFiber.get(Thread.currentThread()));
91-
9288
private boolean nativeInterrupt;
9389
private Timer nativeInterruptTimer;
9490
private ThreadLocal<Interrupter> nativeCallInterrupter;
@@ -618,11 +614,6 @@ public RubyThread getCurrentThreadOrNull() {
618614
return javaThreadToRubyThread.get(Thread.currentThread());
619615
}
620616

621-
@TruffleBoundary
622-
public RubyFiber getRubyFiberFromCurrentJavaThread() {
623-
return rubyFiber.get();
624-
}
625-
626617
public void registerThread(RubyThread thread) {
627618
if (!runningRubyThreads.add(thread)) {
628619
throw new UnsupportedOperationException(thread + " was already registered");
@@ -687,7 +678,7 @@ public void killAndWaitOtherThreads() {
687678
private void doKillOtherThreads() {
688679
final Thread initiatingJavaThread = Thread.currentThread();
689680
SafepointPredicate predicate = (context, thread, action) -> Thread.currentThread() != initiatingJavaThread &&
690-
getRubyFiberFromCurrentJavaThread() == thread.getCurrentFiber();
681+
language.getCurrentFiber() == thread.getCurrentFiber();
691682

692683
context.getSafepointManager().pauseAllThreadsAndExecute(
693684
DummyNode.INSTANCE,

0 commit comments

Comments
 (0)