Skip to content

Commit 5ea5ad8

Browse files
committed
Add atexit testing utilities
1 parent abeee27 commit 5ea5ad8

File tree

4 files changed

+61
-9
lines changed

4 files changed

+61
-9
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_badargs
2+
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_bound_methods
3+
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_clear
4+
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_exit
5+
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_order
6+
*graalpython.lib-python.3.test.test_atexit.GeneralTest.test_unregister
17
*graalpython.lib-python.3.test.test_atexit.SubinterpreterTest.test_callback_on_subinterpreter_teardown
28
*graalpython.lib-python.3.test.test_atexit.SubinterpreterTest.test_callbacks_leak
39
*graalpython.lib-python.3.test.test_atexit.SubinterpreterTest.test_callbacks_leak_refcycle

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

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import com.oracle.graal.python.builtins.objects.function.PKeyword;
5252
import com.oracle.graal.python.nodes.call.CallNode;
5353
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
54+
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
5455
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
5556
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
5657
import com.oracle.graal.python.runtime.PythonContext;
@@ -110,7 +111,7 @@ public Object execute(VirtualFrame frame) {
110111
Object register(Object callable, Object[] arguments, PKeyword[] keywords) {
111112
CompilerDirectives.transferToInterpreter();
112113
AtExitCallTarget atExitCallTarget = new AtExitCallTarget(getContext().getLanguage());
113-
getContext().registerShutdownHook(callable, arguments, keywords, PythonUtils.getOrCreateCallTarget(atExitCallTarget));
114+
getContext().registerAtexitHook(callable, arguments, keywords, PythonUtils.getOrCreateCallTarget(atExitCallTarget));
114115
return callable;
115116
}
116117
}
@@ -120,7 +121,37 @@ Object register(Object callable, Object[] arguments, PKeyword[] keywords) {
120121
abstract static class UnregisterNode extends PythonUnaryBuiltinNode {
121122
@Specialization
122123
Object register(Object callable) {
123-
getContext().deregisterShutdownHook(callable);
124+
getContext().deregisterAtexitHook(callable);
125+
return PNone.NONE;
126+
}
127+
}
128+
129+
@Builtin(name = "_clear")
130+
@GenerateNodeFactory
131+
abstract static class ClearNode extends PythonBuiltinNode {
132+
@Specialization
133+
Object clear() {
134+
getContext().clearAtexitHooks();
135+
return PNone.NONE;
136+
}
137+
}
138+
139+
@Builtin(name = "_ncallbacks")
140+
@GenerateNodeFactory
141+
abstract static class NCallbacksNode extends PythonBuiltinNode {
142+
@Specialization
143+
int get() {
144+
return getContext().getAtexitHookCount();
145+
}
146+
}
147+
148+
@Builtin(name = "_run_exitfuncs")
149+
@GenerateNodeFactory
150+
abstract static class RunExitfuncsNode extends PythonBuiltinNode {
151+
@Specialization
152+
Object run() {
153+
getContext().runAtexitHooks();
154+
getContext().clearAtexitHooks();
124155
return PNone.NONE;
125156
}
126157
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -953,7 +953,7 @@ private Object doOpenFile(String pathname, Set<StandardOpenOption> options, File
953953
options.remove(StandardOpenOption.CREATE_NEW);
954954
options.remove(StandardOpenOption.DELETE_ON_CLOSE);
955955
options.add(StandardOpenOption.CREATE);
956-
getContext().registerShutdownHook(new FileDeleteShutdownHook(truffleFile));
956+
getContext().registerAtexitHook(new FileDeleteShutdownHook(truffleFile));
957957
}
958958

959959
fc = truffleFile.newByteChannel(options, attributes);

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -709,20 +709,25 @@ private static void writeWarning(String warning) {
709709
}
710710

711711
@TruffleBoundary
712-
public void registerShutdownHook(ShutdownHook shutdownHook) {
712+
public void registerAtexitHook(ShutdownHook shutdownHook) {
713713
shutdownHooks.add(shutdownHook);
714714
}
715715

716716
@TruffleBoundary
717-
public void registerShutdownHook(Object callable, Object[] arguments, PKeyword[] keywords, CallTarget ct) {
717+
public void registerAtexitHook(Object callable, Object[] arguments, PKeyword[] keywords, CallTarget ct) {
718718
atExitHooks.put(callable, new AtExitHook(arguments, keywords, ct));
719719
}
720720

721721
@TruffleBoundary
722-
public void deregisterShutdownHook(Object callable) {
722+
public void deregisterAtexitHook(Object callable) {
723723
atExitHooks.removeKey(callable);
724724
}
725725

726+
@TruffleBoundary
727+
public void clearAtexitHooks() {
728+
atExitHooks.clear();
729+
}
730+
726731
@TruffleBoundary
727732
public void finalizeContext() {
728733
finalizing = true;
@@ -731,9 +736,12 @@ public void finalizeContext() {
731736
}
732737

733738
@TruffleBoundary
734-
private void runShutdownHooks() {
735-
handler.shutdown();
736-
// run atExitHooks in reverse order they were registered
739+
public int getAtexitHookCount() {
740+
return atExitHooks.size();
741+
}
742+
743+
@TruffleBoundary
744+
public void runAtexitHooks() {
737745
MapCursor<Object, AtExitHook> cursor = atExitHooks.getEntries();
738746
AtExitHook[] hooks = new AtExitHook[atExitHooks.size()];
739747
Object[] callables = new Object[atExitHooks.size()];
@@ -745,6 +753,13 @@ private void runShutdownHooks() {
745753
for (int i = hooks.length - 1; i >= 0; i--) {
746754
hooks[i].ct.call(callables[i], hooks[i].arguments, hooks[i].keywords);
747755
}
756+
}
757+
758+
@TruffleBoundary
759+
public void runShutdownHooks() {
760+
handler.shutdown();
761+
// run atExitHooks in reverse order they were registered
762+
runAtexitHooks();
748763
for (ShutdownHook h : shutdownHooks) {
749764
h.call(this);
750765
}

0 commit comments

Comments
 (0)