Skip to content

Commit 9b9f2d0

Browse files
committed
Remove as much lazy initialization and indirection as possible.
1 parent af26f56 commit 9b9f2d0

File tree

6 files changed

+38
-134
lines changed

6 files changed

+38
-134
lines changed

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

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,10 @@ public abstract static class CallWithCExtLockAndFrameNode extends PrimitiveArray
125125

126126
@Specialization
127127
protected Object callWithCExtLockAndFrame(
128-
Object receiver, RubyArray argsArray, Object specialVariables, Object block,
129-
@Cached MarkingServiceNodes.GetMarkerThreadLocalDataNode getDataNode) {
130-
final ExtensionCallStack extensionStack = getDataNode.execute().getExtensionCallStack();
128+
Object receiver, RubyArray argsArray, Object specialVariables, Object block) {
129+
final ExtensionCallStack extensionStack = getLanguage()
130+
.getCurrentThread()
131+
.getCurrentFiber().extensionCallStack;
131132
extensionStack.push(specialVariables, block);
132133
try {
133134
return callCextNode.execute(receiver, argsArray);
@@ -693,9 +694,8 @@ protected RubyString trStrCapaResize(RubyString string, int newCapacity,
693694
public abstract static class BlockProcNode extends CoreMethodArrayArgumentsNode {
694695

695696
@Specialization
696-
protected Object block(
697-
@Cached MarkingServiceNodes.GetMarkerThreadLocalDataNode getDataNode) {
698-
return getDataNode.execute().getExtensionCallStack().getBlock();
697+
protected Object block() {
698+
return getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack.getBlock();
699699
}
700700
}
701701

@@ -1568,9 +1568,8 @@ protected Object createMarker(RubyDynamicObject object, RubyProc marker) {
15681568
public abstract static class PushPreservingFrame extends CoreMethodArrayArgumentsNode {
15691569

15701570
@Specialization
1571-
protected Object pushFrame(Object variables, RubyProc block,
1572-
@Cached MarkingServiceNodes.GetMarkerThreadLocalDataNode getDataNode) {
1573-
getDataNode.execute().getExtensionCallStack().push(variables, block);
1571+
protected Object pushFrame(Object variables, RubyProc block) {
1572+
getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack.push(variables, block);
15741573
return nil;
15751574
}
15761575
}
@@ -1579,9 +1578,8 @@ protected Object pushFrame(Object variables, RubyProc block,
15791578
public abstract static class PopPreservingFrame extends CoreMethodArrayArgumentsNode {
15801579

15811580
@Specialization
1582-
protected Object popFrame(
1583-
@Cached MarkingServiceNodes.GetMarkerThreadLocalDataNode getDataNode) {
1584-
getDataNode.execute().getExtensionCallStack().pop();
1581+
protected Object popFrame() {
1582+
getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack.pop();
15851583
return nil;
15861584
}
15871585
}

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

Lines changed: 16 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -62,26 +62,23 @@ public class ValueWrapperManager {
6262
private volatile HandleBlockWeakReference[] blockMap = new HandleBlockWeakReference[0];
6363

6464
private final RubyContext context;
65-
private final RubyLanguage language;
6665

6766
public ValueWrapperManager(RubyContext context) {
6867
this.context = context;
69-
this.language = context.getLanguageSlow();
7068
}
7169

72-
public HandleThreadData makeThreadData() {
73-
HandleThreadData threadData = new HandleThreadData();
74-
HandleBlockHolder holder = threadData.holder;
70+
public HandleBlockHolder makeThreadData() {
71+
HandleBlockHolder holder = new HandleBlockHolder();
7572
context.getFinalizationService().addFinalizer(
7673
context,
77-
threadData,
74+
holder,
7875
ValueWrapperManager.class,
7976
() -> context.getMarkingService().queueForMarking(holder.handleBlock),
8077
null);
81-
return threadData;
78+
return holder;
8279
}
8380

84-
public HandleThreadData getBlockHolder() {
81+
public HandleBlockHolder getBlockHolder(RubyLanguage language) {
8582
RubyFiber fiber = language.getCurrentThread().getCurrentFiber();
8683
if (fiber.handleData == null) {
8784
fiber.handleData = makeThreadData();
@@ -297,47 +294,26 @@ public static final class HandleBlockWeakReference extends WeakReference<HandleB
297294
}
298295
}
299296

300-
protected static class HandleBlockHolder {
297+
public static class HandleBlockHolder {
301298
protected HandleBlock handleBlock = null;
302299
protected HandleBlock sharedHandleBlock = null;
303300
}
304301

305-
public static class HandleThreadData {
306-
307-
private final HandleBlockHolder holder = new HandleBlockHolder();
308-
309-
public HandleBlock currentBlock() {
310-
return holder.handleBlock;
311-
}
312-
313-
public HandleBlock currentSharedBlock() {
314-
return holder.sharedHandleBlock;
315-
}
316-
317-
public HandleBlock makeNewBlock(RubyContext context, HandleBlockAllocator allocator) {
318-
return (holder.handleBlock = new HandleBlock(context, allocator));
319-
}
320-
321-
public HandleBlock makeNewSharedBlock(RubyContext context, HandleBlockAllocator allocator) {
322-
return (holder.sharedHandleBlock = new HandleBlock(context, allocator));
323-
}
324-
}
325-
326302
@GenerateUncached
327303
public abstract static class GetHandleBlockHolderNode extends RubyBaseNode {
328304

329-
public abstract HandleThreadData execute(ValueWrapper wrapper);
305+
public abstract HandleBlockHolder execute(ValueWrapper wrapper);
330306

331307
@Specialization(guards = "cachedThread == currentJavaThread(wrapper)", limit = "getCacheLimit()")
332-
protected HandleThreadData getHolderOnKnownThread(ValueWrapper wrapper,
308+
protected HandleBlockHolder getHolderOnKnownThread(ValueWrapper wrapper,
333309
@Cached("currentJavaThread(wrapper)") Thread cachedThread,
334-
@Cached("getBlockHolder(wrapper)") HandleThreadData threadData) {
310+
@Cached("getBlockHolder(wrapper)") HandleBlockHolder threadData) {
335311
return threadData;
336312
}
337313

338314
@Specialization(replaces = "getHolderOnKnownThread")
339-
protected HandleThreadData getBlockHolder(ValueWrapper wrapper) {
340-
return getContext().getValueWrapperManager().getBlockHolder();
315+
protected HandleBlockHolder getBlockHolder(ValueWrapper wrapper) {
316+
return getContext().getValueWrapperManager().getBlockHolder(getLanguage());
341317
}
342318

343319
protected static Thread currentJavaThread(ValueWrapper wrapper) {
@@ -371,12 +347,12 @@ protected long allocateSharedHandleOnKnownThread(ValueWrapper wrapper,
371347
}
372348

373349
protected static long allocateHandle(ValueWrapper wrapper, RubyContext context, RubyLanguage language,
374-
HandleThreadData threadData, boolean shared) {
350+
HandleBlockHolder holder, boolean shared) {
375351
HandleBlock block;
376352
if (shared) {
377-
block = threadData.holder.sharedHandleBlock;
353+
block = holder.sharedHandleBlock;
378354
} else {
379-
block = threadData.holder.handleBlock;
355+
block = holder.handleBlock;
380356
}
381357

382358
if (context.getOptions().CEXTS_TO_NATIVE_STATS) {
@@ -388,12 +364,10 @@ protected static long allocateHandle(ValueWrapper wrapper, RubyContext context,
388364
context.getMarkingService().queueForMarking(block);
389365
}
390366
if (shared) {
391-
block = threadData
392-
.makeNewSharedBlock(context, language.handleBlockAllocator);
367+
block = (holder.sharedHandleBlock = new HandleBlock(context, language.handleBlockAllocator));
393368
context.getValueWrapperManager().addToSharedBlockMap(block, language);
394369
} else {
395-
block = threadData
396-
.makeNewBlock(context, language.handleBlockAllocator);
370+
block = (holder.handleBlock = new HandleBlock(context, language.handleBlockAllocator));
397371
context.getValueWrapperManager().addToBlockMap(block, language);
398372
}
399373

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ protected void processReference(RubyContext context, ProcessingReference<?> fina
9393
}
9494

9595
protected void processReferenceInternal(RubyContext context, FinalizerReference finalizerReference) {
96-
ExtensionCallStack stack = context.getMarkingService().getThreadLocalData().getExtensionCallStack();
96+
ExtensionCallStack stack = language.getCurrentThread().getCurrentFiber().extensionCallStack;
9797
stack.push(stack.getVariables(), stack.getBlock());
9898
try {
9999
while (!context.isFinalizing()) {

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

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@
1616
import org.truffleruby.RubyLanguage;
1717
import org.truffleruby.cext.ValueWrapperManager;
1818
import org.truffleruby.core.array.ArrayUtils;
19-
import org.truffleruby.core.fiber.RubyFiber;
2019
import org.truffleruby.core.queue.UnsizedQueue;
2120

2221
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
23-
import org.truffleruby.language.Nil;
2422

2523
/** Class to provide GC marking and other facilities to keep objects alive for native extensions.
2624
*
@@ -59,10 +57,10 @@ public static class MarkRunnerService extends ReferenceProcessingService<Marking
5957
private final MarkingService markingService;
6058

6159
public MarkRunnerService(
62-
RubyLanguage lanugage,
60+
RubyLanguage language,
6361
ReferenceQueue<Object> processingQueue,
6462
MarkingService markingService) {
65-
super(lanugage, processingQueue);
63+
super(language, processingQueue);
6664
this.markingService = markingService;
6765
}
6866

@@ -89,7 +87,7 @@ protected void processReference(RubyContext context, ProcessingReference<?> refe
8987

9088
@TruffleBoundary
9189
public void runAllMarkers(RubyContext context) {
92-
ExtensionCallStack stack = markingService.getThreadLocalData().getExtensionCallStack();
90+
ExtensionCallStack stack = markingService.language.getCurrentThread().getCurrentFiber().extensionCallStack;
9391
stack.push(stack.getVariables(), stack.getBlock());
9492
try {
9593
// TODO (eregon, 15 Sept 2020): there seems to be no synchronization here while walking the list of
@@ -114,18 +112,6 @@ public void runAllMarkers(RubyContext context) {
114112

115113
private final UnsizedQueue keptObjectQueue = new UnsizedQueue();
116114

117-
public static class MarkerThreadLocalData {
118-
private final ExtensionCallStack extensionCallStack;
119-
120-
public MarkerThreadLocalData(MarkingService service) {
121-
this.extensionCallStack = new ExtensionCallStack(Nil.INSTANCE, Nil.INSTANCE);
122-
}
123-
124-
public ExtensionCallStack getExtensionCallStack() {
125-
return extensionCallStack;
126-
}
127-
}
128-
129115
protected static class ExtensionCallStackEntry {
130116
protected final ExtensionCallStackEntry previous;
131117
protected final ArrayList<Object> preservedObjects = new ArrayList<>();
@@ -171,15 +157,6 @@ public Object getBlock() {
171157
}
172158
}
173159

174-
@TruffleBoundary
175-
public MarkerThreadLocalData getThreadLocalData() {
176-
RubyFiber fiber = language.getCurrentThread().getCurrentFiber();
177-
if (fiber.markingData == null) {
178-
fiber.markingData = makeThreadLocalData();
179-
}
180-
return fiber.markingData;
181-
}
182-
183160
public MarkingService(RubyLanguage language, ReferenceProcessor referenceprocessor) {
184161
this(language, referenceprocessor.processingQueue);
185162
}
@@ -189,17 +166,6 @@ public MarkingService(RubyLanguage language, ReferenceQueue<Object> processingQu
189166
runnerService = new MarkRunnerService(language, processingQueue, this);
190167
}
191168

192-
@TruffleBoundary
193-
public MarkerThreadLocalData makeThreadLocalData() {
194-
MarkerThreadLocalData data = new MarkerThreadLocalData(this);
195-
/* This finalizer will ensure all the objects remaining in our kept objects buffer will be queue at some point.
196-
* We don't need to do a queue and reset as the MarkerKeptObjects is going to be GC'ed anyway. We also don't
197-
* simply queue the keptObjects buffer because it may only have zero, or very few, objects in it and we don't
198-
* want to run mark functions more often than we have to. */
199-
// context.getFinalizationService().addFinalizer(data, null, MarkingService.class, () -> getThreadLocalData().keptObjects.keepObjects(keptObjects), null);
200-
return data;
201-
}
202-
203169
@TruffleBoundary
204170
public void queueForMarking(ValueWrapperManager.HandleBlock objects) {
205171
if (objects != null) {

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

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@
1111

1212
import java.util.ArrayList;
1313

14-
import org.truffleruby.core.MarkingService.MarkerThreadLocalData;
14+
import org.truffleruby.core.MarkingService.ExtensionCallStack;
1515
import org.truffleruby.language.RubyBaseNode;
1616

1717
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
18-
import com.oracle.truffle.api.dsl.Cached;
1918
import com.oracle.truffle.api.dsl.GenerateUncached;
2019
import com.oracle.truffle.api.dsl.Specialization;
2120

@@ -27,10 +26,9 @@ public abstract static class KeepAliveNode extends RubyBaseNode {
2726
public abstract void execute(Object object);
2827

2928
@Specialization
30-
protected void keepObjectAlive(Object object,
31-
@Cached GetMarkerThreadLocalDataNode getThreadLocalDataNode) {
32-
MarkerThreadLocalData data = getThreadLocalDataNode.execute();
33-
addToList(data.getExtensionCallStack().getKeptObjects(), object);
29+
protected void keepObjectAlive(Object object) {
30+
ExtensionCallStack stack = getLanguage().getCurrentThread().getCurrentFiber().extensionCallStack;
31+
addToList(stack.getKeptObjects(), object);
3432
}
3533

3634
@TruffleBoundary
@@ -42,38 +40,4 @@ public static KeepAliveNode create() {
4240
return MarkingServiceNodesFactory.KeepAliveNodeGen.create();
4341
}
4442
}
45-
46-
@GenerateUncached
47-
public abstract static class GetMarkerThreadLocalDataNode extends RubyBaseNode {
48-
49-
public final MarkerThreadLocalData execute() {
50-
return executeInternal(Boolean.TRUE);
51-
}
52-
53-
protected abstract MarkerThreadLocalData executeInternal(Object dynamicParameter);
54-
55-
@Specialization(guards = "thread == currentJavaThread(dynamicParameter)", limit = "getCacheLimit()")
56-
protected MarkerThreadLocalData getDataOnKnownThread(Object dynamicParameter,
57-
@Cached("currentJavaThread(dynamicParameter)") Thread thread,
58-
@Cached("getData(dynamicParameter)") MarkerThreadLocalData data) {
59-
return data;
60-
}
61-
62-
@Specialization(replaces = "getDataOnKnownThread")
63-
protected MarkerThreadLocalData getData(Object dynamicParameter) {
64-
return getContext().getMarkingService().getThreadLocalData();
65-
}
66-
67-
protected static Thread currentJavaThread(Object dynamicParameter) {
68-
return Thread.currentThread();
69-
}
70-
71-
public int getCacheLimit() {
72-
return getLanguage().options.THREAD_CACHE;
73-
}
74-
75-
public static GetMarkerThreadLocalDataNode create() {
76-
return MarkingServiceNodesFactory.GetMarkerThreadLocalDataNodeGen.create();
77-
}
78-
}
7943
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.truffleruby.core.basicobject.RubyBasicObject;
2525
import org.truffleruby.core.klass.RubyClass;
2626
import org.truffleruby.core.thread.RubyThread;
27+
import org.truffleruby.language.Nil;
2728
import org.truffleruby.language.RubyDynamicObject;
2829
import org.truffleruby.language.objects.ObjectGraphNode;
2930

@@ -45,8 +46,8 @@ public final class RubyFiber extends RubyDynamicObject implements ObjectGraphNod
4546
volatile boolean transferred = false;
4647
public volatile Throwable uncaughtException = null;
4748
String sourceLocation;
48-
public MarkingService.MarkerThreadLocalData markingData = null;
49-
public ValueWrapperManager.HandleThreadData handleData = null;
49+
public final MarkingService.ExtensionCallStack extensionCallStack;
50+
public ValueWrapperManager.HandleBlockHolder handleData = null;
5051

5152
public RubyFiber(
5253
RubyClass rubyClass,
@@ -64,6 +65,7 @@ public RubyFiber(
6465
this.catchTags = ArrayHelpers.createEmptyArray(context, language);
6566
this.rubyThread = rubyThread;
6667
this.sourceLocation = sourceLocation;
68+
extensionCallStack = new MarkingService.ExtensionCallStack(Nil.INSTANCE);
6769
}
6870

6971
public boolean isRootFiber() {

0 commit comments

Comments
 (0)