Skip to content

Commit 9e6b1b4

Browse files
committed
[GR-23232] Support a little more of the gc module API
1 parent 40201f4 commit 9e6b1b4

File tree

3 files changed

+57
-15
lines changed

3 files changed

+57
-15
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GcModuleBuiltins.java

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.lang.management.ManagementFactory;
3030
import java.util.List;
3131

32+
import com.oracle.graal.python.PythonLanguage;
3233
import com.oracle.graal.python.builtins.Builtin;
3334
import com.oracle.graal.python.builtins.CoreFunctions;
3435
import com.oracle.graal.python.builtins.PythonBuiltins;
@@ -38,8 +39,12 @@
3839
import com.oracle.graal.python.builtins.objects.list.PList;
3940
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
4041
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
42+
import com.oracle.graal.python.runtime.PythonContext;
43+
import com.oracle.graal.python.runtime.PythonCore;
44+
import com.oracle.graal.python.util.PythonUtils;
4145
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4246
import com.oracle.truffle.api.dsl.Cached;
47+
import com.oracle.truffle.api.dsl.CachedContext;
4348
import com.oracle.truffle.api.dsl.Fallback;
4449
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
4550
import com.oracle.truffle.api.dsl.Specialization;
@@ -54,48 +59,70 @@ protected List<com.oracle.truffle.api.dsl.NodeFactory<? extends PythonBuiltinNod
5459
return GcModuleBuiltinsFactory.getFactories();
5560
}
5661

62+
@Override
63+
public void initialize(PythonCore core) {
64+
builtinConstants.put("DEBUG_LEAK", 0);
65+
super.initialize(core);
66+
}
67+
5768
@Builtin(name = "collect", minNumOfPositionalArgs = 0, maxNumOfPositionalArgs = 1)
5869
@GenerateNodeFactory
5970
abstract static class GcCollectNode extends PythonBuiltinNode {
6071
@Specialization
6172
int collect(VirtualFrame frame, @SuppressWarnings("unused") Object level,
6273
@Cached BranchProfile asyncProfile) {
63-
doGc();
74+
PythonUtils.forceFullGC();
6475
// collect some weak references now
6576
getContext().triggerAsyncActions(frame, asyncProfile);
6677
return 0;
6778
}
68-
69-
@TruffleBoundary
70-
private static void doGc() {
71-
System.gc();
72-
}
7379
}
7480

7581
@Builtin(name = "isenabled", minNumOfPositionalArgs = 0)
7682
@GenerateNodeFactory
7783
abstract static class GcIsEnabledNode extends PythonBuiltinNode {
7884
@Specialization
79-
boolean isenabled() {
80-
return true;
85+
boolean isenabled(@CachedContext(PythonLanguage.class) PythonContext ctx) {
86+
return ctx.isGcEnabled();
8187
}
8288
}
8389

84-
abstract static class StubNode extends PythonBuiltinNode {
90+
@Builtin(name = "disable", minNumOfPositionalArgs = 0)
91+
@GenerateNodeFactory
92+
abstract static class DisableNode extends PythonBuiltinNode {
8593
@Specialization
86-
PNone disable() {
94+
PNone disable(@CachedContext(PythonLanguage.class) PythonContext ctx) {
95+
ctx.setGcEnabled(false);
8796
return PNone.NONE;
8897
}
8998
}
9099

91-
@Builtin(name = "disable", minNumOfPositionalArgs = 0)
100+
@Builtin(name = "enable", minNumOfPositionalArgs = 0)
101+
@GenerateNodeFactory
102+
abstract static class EnableNode extends PythonBuiltinNode {
103+
@Specialization
104+
PNone enable(@CachedContext(PythonLanguage.class) PythonContext ctx) {
105+
ctx.setGcEnabled(true);
106+
return PNone.NONE;
107+
}
108+
}
109+
110+
@Builtin(name = "get_debug", minNumOfPositionalArgs = 0)
92111
@GenerateNodeFactory
93-
abstract static class DisableNode extends StubNode {
112+
abstract static class GetDebugNode extends PythonBuiltinNode {
113+
@Specialization
114+
int getDebug() {
115+
return 0;
116+
}
94117
}
95118

96-
@Builtin(name = "enable", minNumOfPositionalArgs = 0)
119+
@Builtin(name = "set_debug", minNumOfPositionalArgs = 1)
97120
@GenerateNodeFactory
98-
abstract static class EnableNode extends StubNode {
121+
abstract static class SetDebugNode extends PythonBuiltinNode {
122+
@Specialization
123+
PNone setDebug(@SuppressWarnings("unused") Object ignored) {
124+
return PNone.NONE;
125+
}
99126
}
100127

101128
@Builtin(name = "get_count", minNumOfPositionalArgs = 0)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/WeakRefModuleBuiltins.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
6767
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
6868
import com.oracle.graal.python.runtime.AsyncHandler;
69+
import com.oracle.graal.python.runtime.PythonContext;
6970
import com.oracle.graal.python.runtime.PythonCore;
7071
import com.oracle.graal.python.runtime.exception.PythonErrorType;
7172
import com.oracle.truffle.api.CompilerDirectives;
@@ -111,8 +112,11 @@ public void postInitialize(PythonCore core) {
111112
PythonModule weakrefModule = core.lookupBuiltinModule("_weakref");
112113
weakrefModule.setAttribute(weakRefQueueKey, weakRefQueue);
113114
core.lookupType(PythonBuiltinClassType.PReferenceType).setAttribute(weakRefQueueKey, weakRefQueue);
114-
115+
final PythonContext ctx = core.getContext();
115116
core.getContext().registerAsyncAction(() -> {
117+
if (!ctx.isGcEnabled()) {
118+
return null;
119+
}
116120
Reference<? extends Object> reference = null;
117121
try {
118122
reference = weakRefQueue.remove();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,9 @@ private static final class AtExitHook {
239239
private final PosixResources resources;
240240
private final AsyncHandler handler;
241241

242+
// decides if we run the async weakref callbacks and destructors
243+
private boolean gcEnabled = true;
244+
242245
// A thread-local to store the full path to the currently active import statement, for Jython
243246
// compat
244247
private final ThreadLocal<ArrayDeque<String>> currentImport = new ThreadLocal<>();
@@ -1048,4 +1051,12 @@ public GraalHPyContext getHPyContext() {
10481051
assert hPyContext != null : "tried to get HPy context but was not created yet";
10491052
return hPyContext;
10501053
}
1054+
1055+
public boolean isGcEnabled() {
1056+
return gcEnabled;
1057+
}
1058+
1059+
public void setGcEnabled(boolean flag) {
1060+
gcEnabled = flag;
1061+
}
10511062
}

0 commit comments

Comments
 (0)