diff --git a/Include/internal/pycore_atexit.h b/Include/internal/pycore_atexit.h
index 4dcda8f517c..507a5c03cbc 100644
--- a/Include/internal/pycore_atexit.h
+++ b/Include/internal/pycore_atexit.h
@@ -54,7 +54,7 @@ struct atexit_state {
int callback_len;
};
-// Export for '_xxinterpchannels' shared extension
+// Export for '_interpchannels' shared extension
PyAPI_FUNC(int) _Py_AtExit(
PyInterpreterState *interp,
atexit_datacallbackfunc func,
diff --git a/Include/internal/pycore_pybuffer.h b/Include/internal/pycore_pybuffer.h
index 3cbc290b2ea..9439d2bd770 100644
--- a/Include/internal/pycore_pybuffer.h
+++ b/Include/internal/pycore_pybuffer.h
@@ -9,7 +9,7 @@ extern "C" {
#endif
-// Exported for the _xxinterpchannels module.
+// Exported for the _interpchannels module.
PyAPI_FUNC(int) _PyBuffer_ReleaseInInterpreter(
PyInterpreterState *interp, Py_buffer *view);
PyAPI_FUNC(int) _PyBuffer_ReleaseInInterpreterAndRawFree(
diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h
index eb5b5fee590..a668d78b969 100644
--- a/Include/internal/pycore_pystate.h
+++ b/Include/internal/pycore_pystate.h
@@ -77,10 +77,10 @@ _Py_IsMainInterpreterFinalizing(PyInterpreterState *interp)
interp == &_PyRuntime._main_interpreter);
}
-// Export for _xxsubinterpreters module.
+// Export for _interpreters module.
PyAPI_FUNC(PyObject *) _PyInterpreterState_GetIDObject(PyInterpreterState *);
-// Export for _xxsubinterpreters module.
+// Export for _interpreters module.
PyAPI_FUNC(int) _PyInterpreterState_SetRunningMain(PyInterpreterState *);
PyAPI_FUNC(void) _PyInterpreterState_SetNotRunningMain(PyInterpreterState *);
PyAPI_FUNC(int) _PyInterpreterState_IsRunningMain(PyInterpreterState *);
diff --git a/Include/internal/pycore_pythread.h b/Include/internal/pycore_pythread.h
index f032cb97388..3610c6254db 100644
--- a/Include/internal/pycore_pythread.h
+++ b/Include/internal/pycore_pythread.h
@@ -99,7 +99,7 @@ extern void _PyThread_AfterFork(struct _pythread_runtime_state *state);
// unset: -1 seconds, in nanoseconds
#define PyThread_UNSET_TIMEOUT ((PyTime_t)(-1 * 1000 * 1000 * 1000))
-// Exported for the _xxinterpchannels module.
+// Exported for the _interpchannels module.
PyAPI_FUNC(int) PyThread_ParseTimeoutArg(
PyObject *arg,
int blocking,
@@ -111,7 +111,7 @@ PyAPI_FUNC(int) PyThread_ParseTimeoutArg(
* are returned, depending on whether the lock can be acquired within the
* timeout.
*/
-// Exported for the _xxinterpchannels module.
+// Exported for the _interpchannels module.
PyAPI_FUNC(PyLockStatus) PyThread_acquire_lock_timed_with_retries(
PyThread_type_lock,
PY_TIMEOUT_T microseconds);
diff --git a/Lib/test/support/import_helper.py b/Lib/test/support/import_helper.py
index 29c6f535b40..edcd2b9a35b 100644
--- a/Lib/test/support/import_helper.py
+++ b/Lib/test/support/import_helper.py
@@ -114,7 +114,7 @@ def multi_interp_extensions_check(enabled=True):
This only applies to modules that haven't been imported yet.
It overrides the PyInterpreterConfig.check_multi_interp_extensions
setting (see support.run_in_subinterp_with_config() and
- _xxsubinterpreters.create()).
+ _interpreters.create()).
Also see importlib.utils.allowing_all_extensions().
"""
diff --git a/Lib/test/support/interpreters/__init__.py b/Lib/test/support/interpreters/__init__.py
index 0a5a9259479..e067f259364 100644
--- a/Lib/test/support/interpreters/__init__.py
+++ b/Lib/test/support/interpreters/__init__.py
@@ -2,10 +2,10 @@
import threading
import weakref
-import _xxsubinterpreters as _interpreters
+import _interpreters
# aliases:
-from _xxsubinterpreters import (
+from _interpreters import (
InterpreterError, InterpreterNotFoundError, NotShareableError,
is_shareable,
)
diff --git a/Lib/test/support/interpreters/channels.py b/Lib/test/support/interpreters/channels.py
index f7f523b1fc5..fbae7e634cf 100644
--- a/Lib/test/support/interpreters/channels.py
+++ b/Lib/test/support/interpreters/channels.py
@@ -1,10 +1,10 @@
"""Cross-interpreter Channels High Level Module."""
import time
-import _xxinterpchannels as _channels
+import _interpchannels as _channels
# aliases:
-from _xxinterpchannels import (
+from _interpchannels import (
ChannelError, ChannelNotFoundError, ChannelClosedError,
ChannelEmptyError, ChannelNotEmptyError,
)
diff --git a/Lib/test/support/interpreters/queues.py b/Lib/test/support/interpreters/queues.py
index 5849a1cc15e..1b9e7481f2e 100644
--- a/Lib/test/support/interpreters/queues.py
+++ b/Lib/test/support/interpreters/queues.py
@@ -4,10 +4,10 @@ import pickle
import queue
import time
import weakref
-import _xxinterpqueues as _queues
+import _interpqueues as _queues
# aliases:
-from _xxinterpqueues import (
+from _interpqueues import (
QueueError, QueueNotFoundError,
)
diff --git a/Lib/test/test__xxinterpchannels.py b/Lib/test/test__interpchannels.py
similarity index 68%
rename from Lib/test/test__xxinterpchannels.py
rename to Lib/test/test__interpchannels.py
index 3db0cb7e6e1..b76c58917c0 100644
--- a/Lib/test/test__xxinterpchannels.py
+++ b/Lib/test/test__interpchannels.py
@@ -8,14 +8,14 @@ import unittest
from test.support import import_helper
-from test.test__xxsubinterpreters import (
+from test.test__interpreters import (
_interpreters,
_run_output,
clean_up_interpreters,
)
-channels = import_helper.import_module('_xxinterpchannels')
+_channels = import_helper.import_module('_interpchannels')
# Additional tests are found in Lib/test/test_interpreters/test_channels.py.
@@ -29,8 +29,8 @@ channels = import_helper.import_module('_xxinterpchannels')
def recv_wait(cid):
while True:
try:
- return channels.recv(cid)
- except channels.ChannelEmptyError:
+ return _channels.recv(cid)
+ except _channels.ChannelEmptyError:
time.sleep(0.1)
#@contextmanager
@@ -101,7 +101,7 @@ class Interpreter(namedtuple('Interpreter', 'name id')):
def expect_channel_closed():
try:
yield
- except channels.ChannelClosedError:
+ except _channels.ChannelClosedError:
pass
else:
assert False, 'channel not closed'
@@ -188,7 +188,7 @@ def run_action(cid, action, end, state, *, hideclosed=True):
try:
result = _run_action(cid, action, end, state)
- except channels.ChannelClosedError:
+ except _channels.ChannelClosedError:
if not hideclosed and not expectfail:
raise
result = state.close()
@@ -201,18 +201,18 @@ def run_action(cid, action, end, state, *, hideclosed=True):
def _run_action(cid, action, end, state):
if action == 'use':
if end == 'send':
- channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'spam', blocking=False)
return state.incr()
elif end == 'recv':
if not state.pending:
try:
- channels.recv(cid)
- except channels.ChannelEmptyError:
+ _channels.recv(cid)
+ except _channels.ChannelEmptyError:
return state
else:
raise Exception('expected ChannelEmptyError')
else:
- channels.recv(cid)
+ _channels.recv(cid)
return state.decr()
else:
raise ValueError(end)
@@ -220,7 +220,7 @@ def _run_action(cid, action, end, state):
kwargs = {}
if end in ('recv', 'send'):
kwargs[end] = True
- channels.close(cid, **kwargs)
+ _channels.close(cid, **kwargs)
return state.close()
elif action == 'force-close':
kwargs = {
@@ -228,17 +228,17 @@ def _run_action(cid, action, end, state):
}
if end in ('recv', 'send'):
kwargs[end] = True
- channels.close(cid, **kwargs)
+ _channels.close(cid, **kwargs)
return state.close(force=True)
else:
raise ValueError(action)
def clean_up_channels():
- for cid in channels.list_all():
+ for cid in _channels.list_all():
try:
- channels.destroy(cid)
- except channels.ChannelNotFoundError:
+ _channels.destroy(cid)
+ except _channels.ChannelNotFoundError:
pass # already destroyed
@@ -255,25 +255,25 @@ class TestBase(unittest.TestCase):
class ChannelIDTests(TestBase):
def test_default_kwargs(self):
- cid = channels._channel_id(10, force=True)
+ cid = _channels._channel_id(10, force=True)
self.assertEqual(int(cid), 10)
self.assertEqual(cid.end, 'both')
def test_with_kwargs(self):
- cid = channels._channel_id(10, send=True, force=True)
+ cid = _channels._channel_id(10, send=True, force=True)
self.assertEqual(cid.end, 'send')
- cid = channels._channel_id(10, send=True, recv=False, force=True)
+ cid = _channels._channel_id(10, send=True, recv=False, force=True)
self.assertEqual(cid.end, 'send')
- cid = channels._channel_id(10, recv=True, force=True)
+ cid = _channels._channel_id(10, recv=True, force=True)
self.assertEqual(cid.end, 'recv')
- cid = channels._channel_id(10, recv=True, send=False, force=True)
+ cid = _channels._channel_id(10, recv=True, send=False, force=True)
self.assertEqual(cid.end, 'recv')
- cid = channels._channel_id(10, send=True, recv=True, force=True)
+ cid = _channels._channel_id(10, send=True, recv=True, force=True)
self.assertEqual(cid.end, 'both')
def test_coerce_id(self):
@@ -281,47 +281,47 @@ class ChannelIDTests(TestBase):
def __index__(self):
return 10
- cid = channels._channel_id(Int(), force=True)
+ cid = _channels._channel_id(Int(), force=True)
self.assertEqual(int(cid), 10)
def test_bad_id(self):
- self.assertRaises(TypeError, channels._channel_id, object())
- self.assertRaises(TypeError, channels._channel_id, 10.0)
- self.assertRaises(TypeError, channels._channel_id, '10')
- self.assertRaises(TypeError, channels._channel_id, b'10')
- self.assertRaises(ValueError, channels._channel_id, -1)
- self.assertRaises(OverflowError, channels._channel_id, 2**64)
+ self.assertRaises(TypeError, _channels._channel_id, object())
+ self.assertRaises(TypeError, _channels._channel_id, 10.0)
+ self.assertRaises(TypeError, _channels._channel_id, '10')
+ self.assertRaises(TypeError, _channels._channel_id, b'10')
+ self.assertRaises(ValueError, _channels._channel_id, -1)
+ self.assertRaises(OverflowError, _channels._channel_id, 2**64)
def test_bad_kwargs(self):
with self.assertRaises(ValueError):
- channels._channel_id(10, send=False, recv=False)
+ _channels._channel_id(10, send=False, recv=False)
def test_does_not_exist(self):
- cid = channels.create()
- with self.assertRaises(channels.ChannelNotFoundError):
- channels._channel_id(int(cid) + 1) # unforced
+ cid = _channels.create()
+ with self.assertRaises(_channels.ChannelNotFoundError):
+ _channels._channel_id(int(cid) + 1) # unforced
def test_str(self):
- cid = channels._channel_id(10, force=True)
+ cid = _channels._channel_id(10, force=True)
self.assertEqual(str(cid), '10')
def test_repr(self):
- cid = channels._channel_id(10, force=True)
+ cid = _channels._channel_id(10, force=True)
self.assertEqual(repr(cid), 'ChannelID(10)')
- cid = channels._channel_id(10, send=True, force=True)
+ cid = _channels._channel_id(10, send=True, force=True)
self.assertEqual(repr(cid), 'ChannelID(10, send=True)')
- cid = channels._channel_id(10, recv=True, force=True)
+ cid = _channels._channel_id(10, recv=True, force=True)
self.assertEqual(repr(cid), 'ChannelID(10, recv=True)')
- cid = channels._channel_id(10, send=True, recv=True, force=True)
+ cid = _channels._channel_id(10, send=True, recv=True, force=True)
self.assertEqual(repr(cid), 'ChannelID(10)')
def test_equality(self):
- cid1 = channels.create()
- cid2 = channels._channel_id(int(cid1))
- cid3 = channels.create()
+ cid1 = _channels.create()
+ cid2 = _channels._channel_id(int(cid1))
+ cid3 = _channels.create()
self.assertTrue(cid1 == cid1)
self.assertTrue(cid1 == cid2)
@@ -341,11 +341,11 @@ class ChannelIDTests(TestBase):
self.assertTrue(cid1 != cid3)
def test_shareable(self):
- chan = channels.create()
+ chan = _channels.create()
- obj = channels.create()
- channels.send(chan, obj, blocking=False)
- got = channels.recv(chan)
+ obj = _channels.create()
+ _channels.send(chan, obj, blocking=False)
+ got = _channels.recv(chan)
self.assertEqual(got, obj)
self.assertIs(type(got), type(obj))
@@ -356,15 +356,15 @@ class ChannelIDTests(TestBase):
class ChannelTests(TestBase):
def test_create_cid(self):
- cid = channels.create()
- self.assertIsInstance(cid, channels.ChannelID)
+ cid = _channels.create()
+ self.assertIsInstance(cid, _channels.ChannelID)
def test_sequential_ids(self):
- before = channels.list_all()
- id1 = channels.create()
- id2 = channels.create()
- id3 = channels.create()
- after = channels.list_all()
+ before = _channels.list_all()
+ id1 = _channels.create()
+ id2 = _channels.create()
+ id3 = _channels.create()
+ after = _channels.list_all()
self.assertEqual(id2, int(id1) + 1)
self.assertEqual(id3, int(id2) + 1)
@@ -373,7 +373,7 @@ class ChannelTests(TestBase):
def test_ids_global(self):
id1 = _interpreters.create()
out = _run_output(id1, dedent("""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
cid = _channels.create()
print(cid)
"""))
@@ -381,7 +381,7 @@ class ChannelTests(TestBase):
id2 = _interpreters.create()
out = _run_output(id2, dedent("""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
cid = _channels.create()
print(cid)
"""))
@@ -392,31 +392,31 @@ class ChannelTests(TestBase):
def test_channel_list_interpreters_none(self):
"""Test listing interpreters for a channel with no associations."""
# Test for channel with no associated _interpreters.
- cid = channels.create()
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ cid = _channels.create()
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(send_interps, [])
self.assertEqual(recv_interps, [])
def test_channel_list_interpreters_basic(self):
"""Test basic listing channel _interpreters."""
interp0, *_ = _interpreters.get_main()
- cid = channels.create()
- channels.send(cid, "send", blocking=False)
+ cid = _channels.create()
+ _channels.send(cid, "send", blocking=False)
# Test for a channel that has one end associated to an interpreter.
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(send_interps, [interp0])
self.assertEqual(recv_interps, [])
interp1 = _interpreters.create()
_run_output(interp1, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
obj = _channels.recv({cid})
"""))
# Test for channel that has both ends associated to an interpreter.
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(send_interps, [interp0])
self.assertEqual(recv_interps, [interp1])
@@ -426,23 +426,23 @@ class ChannelTests(TestBase):
interp1 = _interpreters.create()
interp2 = _interpreters.create()
interp3 = _interpreters.create()
- cid = channels.create()
+ cid = _channels.create()
- channels.send(cid, "send", blocking=False)
+ _channels.send(cid, "send", blocking=False)
_run_output(interp1, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.send({cid}, "send", blocking=False)
"""))
_run_output(interp2, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
obj = _channels.recv({cid})
"""))
_run_output(interp3, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
obj = _channels.recv({cid})
"""))
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(set(send_interps), {interp0, interp1})
self.assertEqual(set(recv_interps), {interp2, interp3})
@@ -450,22 +450,22 @@ class ChannelTests(TestBase):
"""Test listing channel interpreters with a destroyed interpreter."""
interp0, *_ = _interpreters.get_main()
interp1 = _interpreters.create()
- cid = channels.create()
- channels.send(cid, "send", blocking=False)
+ cid = _channels.create()
+ _channels.send(cid, "send", blocking=False)
_run_output(interp1, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
obj = _channels.recv({cid})
"""))
# Should be one interpreter associated with each end.
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(send_interps, [interp0])
self.assertEqual(recv_interps, [interp1])
_interpreters.destroy(interp1)
# Destroyed interpreter should not be listed.
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(send_interps, [interp0])
self.assertEqual(recv_interps, [])
@@ -476,39 +476,39 @@ class ChannelTests(TestBase):
interp0, *_ = _interpreters.get_main()
interp1 = _interpreters.create()
interp2 = _interpreters.create()
- cid = channels.create()
- channels.send(cid, "data", blocking=False)
+ cid = _channels.create()
+ _channels.send(cid, "data", blocking=False)
_run_output(interp1, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
obj = _channels.recv({cid})
"""))
- channels.send(cid, "data", blocking=False)
+ _channels.send(cid, "data", blocking=False)
_run_output(interp2, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
obj = _channels.recv({cid})
"""))
# Check the setup.
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(len(send_interps), 1)
self.assertEqual(len(recv_interps), 2)
# Release the main interpreter from the send end.
- channels.release(cid, send=True)
+ _channels.release(cid, send=True)
# Send end should have no associated _interpreters.
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(len(send_interps), 0)
self.assertEqual(len(recv_interps), 2)
# Release one of the subinterpreters from the receive end.
_run_output(interp2, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.release({cid})
"""))
# Receive end should have the released interpreter removed.
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(len(send_interps), 0)
self.assertEqual(recv_interps, [interp1])
@@ -516,61 +516,61 @@ class ChannelTests(TestBase):
"""Test listing channel interpreters with a closed channel."""
interp0, *_ = _interpreters.get_main()
interp1 = _interpreters.create()
- cid = channels.create()
+ cid = _channels.create()
# Put something in the channel so that it's not empty.
- channels.send(cid, "send", blocking=False)
+ _channels.send(cid, "send", blocking=False)
# Check initial state.
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(len(send_interps), 1)
self.assertEqual(len(recv_interps), 0)
# Force close the channel.
- channels.close(cid, force=True)
+ _channels.close(cid, force=True)
# Both ends should raise an error.
- with self.assertRaises(channels.ChannelClosedError):
- channels.list_interpreters(cid, send=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.list_interpreters(cid, send=False)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.list_interpreters(cid, send=True)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.list_interpreters(cid, send=False)
def test_channel_list_interpreters_closed_send_end(self):
"""Test listing channel interpreters with a channel's send end closed."""
interp0, *_ = _interpreters.get_main()
interp1 = _interpreters.create()
- cid = channels.create()
+ cid = _channels.create()
# Put something in the channel so that it's not empty.
- channels.send(cid, "send", blocking=False)
+ _channels.send(cid, "send", blocking=False)
# Check initial state.
- send_interps = channels.list_interpreters(cid, send=True)
- recv_interps = channels.list_interpreters(cid, send=False)
+ send_interps = _channels.list_interpreters(cid, send=True)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(len(send_interps), 1)
self.assertEqual(len(recv_interps), 0)
# Close the send end of the channel.
- channels.close(cid, send=True)
+ _channels.close(cid, send=True)
# Send end should raise an error.
- with self.assertRaises(channels.ChannelClosedError):
- channels.list_interpreters(cid, send=True)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.list_interpreters(cid, send=True)
# Receive end should not be closed (since channel is not empty).
- recv_interps = channels.list_interpreters(cid, send=False)
+ recv_interps = _channels.list_interpreters(cid, send=False)
self.assertEqual(len(recv_interps), 0)
# Close the receive end of the channel from a subinterpreter.
_run_output(interp1, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.close({cid}, force=True)
"""))
return
# Both ends should raise an error.
- with self.assertRaises(channels.ChannelClosedError):
- channels.list_interpreters(cid, send=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.list_interpreters(cid, send=False)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.list_interpreters(cid, send=True)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.list_interpreters(cid, send=False)
def test_allowed_types(self):
- cid = channels.create()
+ cid = _channels.create()
objects = [
None,
'spam',
@@ -579,8 +579,8 @@ class ChannelTests(TestBase):
]
for obj in objects:
with self.subTest(obj):
- channels.send(cid, obj, blocking=False)
- got = channels.recv(cid)
+ _channels.send(cid, obj, blocking=False)
+ got = _channels.recv(cid)
self.assertEqual(got, obj)
self.assertIs(type(got), type(obj))
@@ -589,16 +589,16 @@ class ChannelTests(TestBase):
# XXX What about between interpreters?
def test_run_string_arg_unresolved(self):
- cid = channels.create()
+ cid = _channels.create()
interp = _interpreters.create()
_interpreters.set___main___attrs(interp, dict(cid=cid.send))
out = _run_output(interp, dedent("""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
print(cid.end)
_channels.send(cid, b'spam', blocking=False)
"""))
- obj = channels.recv(cid)
+ obj = _channels.recv(cid)
self.assertEqual(obj, b'spam')
self.assertEqual(out.strip(), 'send')
@@ -608,17 +608,17 @@ class ChannelTests(TestBase):
# Note: this test caused crashes on some buildbots (bpo-33615).
@unittest.skip('disabled until high-level channels exist')
def test_run_string_arg_resolved(self):
- cid = channels.create()
- cid = channels._channel_id(cid, _resolve=True)
+ cid = _channels.create()
+ cid = _channels._channel_id(cid, _resolve=True)
interp = _interpreters.create()
out = _run_output(interp, dedent("""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
print(chan.id.end)
_channels.send(chan.id, b'spam', blocking=False)
"""),
dict(chan=cid.send))
- obj = channels.recv(cid)
+ obj = _channels.recv(cid)
self.assertEqual(obj, b'spam')
self.assertEqual(out.strip(), 'send')
@@ -627,10 +627,10 @@ class ChannelTests(TestBase):
# send/recv
def test_send_recv_main(self):
- cid = channels.create()
+ cid = _channels.create()
orig = b'spam'
- channels.send(cid, orig, blocking=False)
- obj = channels.recv(cid)
+ _channels.send(cid, orig, blocking=False)
+ obj = _channels.recv(cid)
self.assertEqual(obj, orig)
self.assertIsNot(obj, orig)
@@ -638,7 +638,7 @@ class ChannelTests(TestBase):
def test_send_recv_same_interpreter(self):
id1 = _interpreters.create()
out = _run_output(id1, dedent("""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
cid = _channels.create()
orig = b'spam'
_channels.send(cid, orig, blocking=False)
@@ -648,33 +648,33 @@ class ChannelTests(TestBase):
"""))
def test_send_recv_different_interpreters(self):
- cid = channels.create()
+ cid = _channels.create()
id1 = _interpreters.create()
out = _run_output(id1, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.send({cid}, b'spam', blocking=False)
"""))
- obj = channels.recv(cid)
+ obj = _channels.recv(cid)
self.assertEqual(obj, b'spam')
def test_send_recv_different_threads(self):
- cid = channels.create()
+ cid = _channels.create()
def f():
obj = recv_wait(cid)
- channels.send(cid, obj)
+ _channels.send(cid, obj)
t = threading.Thread(target=f)
t.start()
- channels.send(cid, b'spam')
+ _channels.send(cid, b'spam')
obj = recv_wait(cid)
t.join()
self.assertEqual(obj, b'spam')
def test_send_recv_different_interpreters_and_threads(self):
- cid = channels.create()
+ cid = _channels.create()
id1 = _interpreters.create()
out = None
@@ -682,7 +682,7 @@ class ChannelTests(TestBase):
nonlocal out
out = _run_output(id1, dedent(f"""
import time
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
while True:
try:
obj = _channels.recv({cid})
@@ -695,38 +695,38 @@ class ChannelTests(TestBase):
t = threading.Thread(target=f)
t.start()
- channels.send(cid, b'spam')
+ _channels.send(cid, b'spam')
obj = recv_wait(cid)
t.join()
self.assertEqual(obj, b'eggs')
def test_send_not_found(self):
- with self.assertRaises(channels.ChannelNotFoundError):
- channels.send(10, b'spam')
+ with self.assertRaises(_channels.ChannelNotFoundError):
+ _channels.send(10, b'spam')
def test_recv_not_found(self):
- with self.assertRaises(channels.ChannelNotFoundError):
- channels.recv(10)
+ with self.assertRaises(_channels.ChannelNotFoundError):
+ _channels.recv(10)
def test_recv_empty(self):
- cid = channels.create()
- with self.assertRaises(channels.ChannelEmptyError):
- channels.recv(cid)
+ cid = _channels.create()
+ with self.assertRaises(_channels.ChannelEmptyError):
+ _channels.recv(cid)
def test_recv_default(self):
default = object()
- cid = channels.create()
- obj1 = channels.recv(cid, default)
- channels.send(cid, None, blocking=False)
- channels.send(cid, 1, blocking=False)
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'eggs', blocking=False)
- obj2 = channels.recv(cid, default)
- obj3 = channels.recv(cid, default)
- obj4 = channels.recv(cid)
- obj5 = channels.recv(cid, default)
- obj6 = channels.recv(cid, default)
+ cid = _channels.create()
+ obj1 = _channels.recv(cid, default)
+ _channels.send(cid, None, blocking=False)
+ _channels.send(cid, 1, blocking=False)
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'eggs', blocking=False)
+ obj2 = _channels.recv(cid, default)
+ obj3 = _channels.recv(cid, default)
+ obj4 = _channels.recv(cid)
+ obj5 = _channels.recv(cid, default)
+ obj6 = _channels.recv(cid, default)
self.assertIs(obj1, default)
self.assertIs(obj2, None)
@@ -737,32 +737,32 @@ class ChannelTests(TestBase):
def test_recv_sending_interp_destroyed(self):
with self.subTest('closed'):
- cid1 = channels.create()
+ cid1 = _channels.create()
interp = _interpreters.create()
_interpreters.run_string(interp, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.send({cid1}, b'spam', blocking=False)
"""))
_interpreters.destroy(interp)
with self.assertRaisesRegex(RuntimeError,
f'channel {cid1} is closed'):
- channels.recv(cid1)
+ _channels.recv(cid1)
del cid1
with self.subTest('still open'):
- cid2 = channels.create()
+ cid2 = _channels.create()
interp = _interpreters.create()
_interpreters.run_string(interp, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.send({cid2}, b'spam', blocking=False)
"""))
- channels.send(cid2, b'eggs', blocking=False)
+ _channels.send(cid2, b'eggs', blocking=False)
_interpreters.destroy(interp)
- channels.recv(cid2)
+ _channels.recv(cid2)
with self.assertRaisesRegex(RuntimeError,
f'channel {cid2} is empty'):
- channels.recv(cid2)
+ _channels.recv(cid2)
del cid2
#-------------------
@@ -770,9 +770,9 @@ class ChannelTests(TestBase):
def test_send_buffer(self):
buf = bytearray(b'spamspamspam')
- cid = channels.create()
- channels.send_buffer(cid, buf, blocking=False)
- obj = channels.recv(cid)
+ cid = _channels.create()
+ _channels.send_buffer(cid, buf, blocking=False)
+ obj = _channels.recv(cid)
self.assertIsNot(obj, buf)
self.assertIsInstance(obj, memoryview)
@@ -790,18 +790,18 @@ class ChannelTests(TestBase):
# We want a long enough sleep that send() actually has to wait.
if buffer:
- send = channels.send_buffer
+ send = _channels.send_buffer
else:
- send = channels.send
+ send = _channels.send
- cid = channels.create()
+ cid = _channels.create()
try:
started = time.monotonic()
send(cid, obj, blocking=False)
stopped = time.monotonic()
- channels.recv(cid)
+ _channels.recv(cid)
finally:
- channels.destroy(cid)
+ _channels.destroy(cid)
delay = stopped - started # seconds
delay *= 3
@@ -813,14 +813,14 @@ class ChannelTests(TestBase):
received = None
obj = b'spam'
wait = self.build_send_waiter(obj)
- cid = channels.create()
+ cid = _channels.create()
def f():
nonlocal received
wait()
received = recv_wait(cid)
t = threading.Thread(target=f)
t.start()
- channels.send(cid, obj, blocking=True)
+ _channels.send(cid, obj, blocking=True)
t.join()
self.assertEqual(received, obj)
@@ -829,14 +829,14 @@ class ChannelTests(TestBase):
received = None
obj = bytearray(b'spam')
wait = self.build_send_waiter(obj, buffer=True)
- cid = channels.create()
+ cid = _channels.create()
def f():
nonlocal received
wait()
received = recv_wait(cid)
t = threading.Thread(target=f)
t.start()
- channels.send_buffer(cid, obj, blocking=True)
+ _channels.send_buffer(cid, obj, blocking=True)
t.join()
self.assertEqual(received, obj)
@@ -844,13 +844,13 @@ class ChannelTests(TestBase):
def test_send_blocking_no_wait(self):
received = None
obj = b'spam'
- cid = channels.create()
+ cid = _channels.create()
def f():
nonlocal received
received = recv_wait(cid)
t = threading.Thread(target=f)
t.start()
- channels.send(cid, obj, blocking=True)
+ _channels.send(cid, obj, blocking=True)
t.join()
self.assertEqual(received, obj)
@@ -858,13 +858,13 @@ class ChannelTests(TestBase):
def test_send_buffer_blocking_no_wait(self):
received = None
obj = bytearray(b'spam')
- cid = channels.create()
+ cid = _channels.create()
def f():
nonlocal received
received = recv_wait(cid)
t = threading.Thread(target=f)
t.start()
- channels.send_buffer(cid, obj, blocking=True)
+ _channels.send_buffer(cid, obj, blocking=True)
t.join()
self.assertEqual(received, obj)
@@ -873,25 +873,25 @@ class ChannelTests(TestBase):
obj = b'spam'
with self.subTest('non-blocking with timeout'):
- cid = channels.create()
+ cid = _channels.create()
with self.assertRaises(ValueError):
- channels.send(cid, obj, blocking=False, timeout=0.1)
+ _channels.send(cid, obj, blocking=False, timeout=0.1)
with self.subTest('timeout hit'):
- cid = channels.create()
+ cid = _channels.create()
with self.assertRaises(TimeoutError):
- channels.send(cid, obj, blocking=True, timeout=0.1)
- with self.assertRaises(channels.ChannelEmptyError):
- received = channels.recv(cid)
+ _channels.send(cid, obj, blocking=True, timeout=0.1)
+ with self.assertRaises(_channels.ChannelEmptyError):
+ received = _channels.recv(cid)
print(repr(received))
with self.subTest('timeout not hit'):
- cid = channels.create()
+ cid = _channels.create()
def f():
recv_wait(cid)
t = threading.Thread(target=f)
t.start()
- channels.send(cid, obj, blocking=True, timeout=10)
+ _channels.send(cid, obj, blocking=True, timeout=10)
t.join()
def test_send_buffer_timeout(self):
@@ -910,25 +910,25 @@ class ChannelTests(TestBase):
obj = bytearray(b'spam')
with self.subTest('non-blocking with timeout'):
- cid = channels.create()
+ cid = _channels.create()
with self.assertRaises(ValueError):
- channels.send_buffer(cid, obj, blocking=False, timeout=0.1)
+ _channels.send_buffer(cid, obj, blocking=False, timeout=0.1)
with self.subTest('timeout hit'):
- cid = channels.create()
+ cid = _channels.create()
with self.assertRaises(TimeoutError):
- channels.send_buffer(cid, obj, blocking=True, timeout=0.1)
- with self.assertRaises(channels.ChannelEmptyError):
- received = channels.recv(cid)
+ _channels.send_buffer(cid, obj, blocking=True, timeout=0.1)
+ with self.assertRaises(_channels.ChannelEmptyError):
+ received = _channels.recv(cid)
print(repr(received))
with self.subTest('timeout not hit'):
- cid = channels.create()
+ cid = _channels.create()
def f():
recv_wait(cid)
t = threading.Thread(target=f)
t.start()
- channels.send_buffer(cid, obj, blocking=True, timeout=10)
+ _channels.send_buffer(cid, obj, blocking=True, timeout=10)
t.join()
def test_send_closed_while_waiting(self):
@@ -936,25 +936,25 @@ class ChannelTests(TestBase):
wait = self.build_send_waiter(obj)
with self.subTest('without timeout'):
- cid = channels.create()
+ cid = _channels.create()
def f():
wait()
- channels.close(cid, force=True)
+ _channels.close(cid, force=True)
t = threading.Thread(target=f)
t.start()
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, obj, blocking=True)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, obj, blocking=True)
t.join()
with self.subTest('with timeout'):
- cid = channels.create()
+ cid = _channels.create()
def f():
wait()
- channels.close(cid, force=True)
+ _channels.close(cid, force=True)
t = threading.Thread(target=f)
t.start()
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, obj, blocking=True, timeout=30)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, obj, blocking=True, timeout=30)
t.join()
def test_send_buffer_closed_while_waiting(self):
@@ -974,54 +974,54 @@ class ChannelTests(TestBase):
wait = self.build_send_waiter(obj, buffer=True)
with self.subTest('without timeout'):
- cid = channels.create()
+ cid = _channels.create()
def f():
wait()
- channels.close(cid, force=True)
+ _channels.close(cid, force=True)
t = threading.Thread(target=f)
t.start()
- with self.assertRaises(channels.ChannelClosedError):
- channels.send_buffer(cid, obj, blocking=True)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send_buffer(cid, obj, blocking=True)
t.join()
with self.subTest('with timeout'):
- cid = channels.create()
+ cid = _channels.create()
def f():
wait()
- channels.close(cid, force=True)
+ _channels.close(cid, force=True)
t = threading.Thread(target=f)
t.start()
- with self.assertRaises(channels.ChannelClosedError):
- channels.send_buffer(cid, obj, blocking=True, timeout=30)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send_buffer(cid, obj, blocking=True, timeout=30)
t.join()
#-------------------
# close
def test_close_single_user(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.recv(cid)
- channels.close(cid)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.recv(cid)
+ _channels.close(cid)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_close_multiple_users(self):
- cid = channels.create()
+ cid = _channels.create()
id1 = _interpreters.create()
id2 = _interpreters.create()
_interpreters.run_string(id1, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.send({cid}, b'spam', blocking=False)
"""))
_interpreters.run_string(id2, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.recv({cid})
"""))
- channels.close(cid)
+ _channels.close(cid)
excsnap = _interpreters.run_string(id1, dedent(f"""
_channels.send({cid}, b'spam')
@@ -1034,13 +1034,13 @@ class ChannelTests(TestBase):
self.assertEqual(excsnap.type.__name__, 'ChannelClosedError')
def test_close_multiple_times(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.recv(cid)
- channels.close(cid)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.recv(cid)
+ _channels.close(cid)
- with self.assertRaises(channels.ChannelClosedError):
- channels.close(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.close(cid)
def test_close_empty(self):
tests = [
@@ -1051,149 +1051,149 @@ class ChannelTests(TestBase):
]
for send, recv in tests:
with self.subTest((send, recv)):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.recv(cid)
- channels.close(cid, send=send, recv=recv)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.recv(cid)
+ _channels.close(cid, send=send, recv=recv)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_close_defaults_with_unused_items(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'ham', blocking=False)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'ham', blocking=False)
- with self.assertRaises(channels.ChannelNotEmptyError):
- channels.close(cid)
- channels.recv(cid)
- channels.send(cid, b'eggs', blocking=False)
+ with self.assertRaises(_channels.ChannelNotEmptyError):
+ _channels.close(cid)
+ _channels.recv(cid)
+ _channels.send(cid, b'eggs', blocking=False)
def test_close_recv_with_unused_items_unforced(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'ham', blocking=False)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'ham', blocking=False)
- with self.assertRaises(channels.ChannelNotEmptyError):
- channels.close(cid, recv=True)
- channels.recv(cid)
- channels.send(cid, b'eggs', blocking=False)
- channels.recv(cid)
- channels.recv(cid)
- channels.close(cid, recv=True)
+ with self.assertRaises(_channels.ChannelNotEmptyError):
+ _channels.close(cid, recv=True)
+ _channels.recv(cid)
+ _channels.send(cid, b'eggs', blocking=False)
+ _channels.recv(cid)
+ _channels.recv(cid)
+ _channels.close(cid, recv=True)
def test_close_send_with_unused_items_unforced(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'ham', blocking=False)
- channels.close(cid, send=True)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'ham', blocking=False)
+ _channels.close(cid, send=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
- channels.recv(cid)
- channels.recv(cid)
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
+ _channels.recv(cid)
+ _channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_close_both_with_unused_items_unforced(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'ham', blocking=False)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'ham', blocking=False)
- with self.assertRaises(channels.ChannelNotEmptyError):
- channels.close(cid, recv=True, send=True)
- channels.recv(cid)
- channels.send(cid, b'eggs', blocking=False)
- channels.recv(cid)
- channels.recv(cid)
- channels.close(cid, recv=True)
+ with self.assertRaises(_channels.ChannelNotEmptyError):
+ _channels.close(cid, recv=True, send=True)
+ _channels.recv(cid)
+ _channels.send(cid, b'eggs', blocking=False)
+ _channels.recv(cid)
+ _channels.recv(cid)
+ _channels.close(cid, recv=True)
def test_close_recv_with_unused_items_forced(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'ham', blocking=False)
- channels.close(cid, recv=True, force=True)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'ham', blocking=False)
+ _channels.close(cid, recv=True, force=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_close_send_with_unused_items_forced(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'ham', blocking=False)
- channels.close(cid, send=True, force=True)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'ham', blocking=False)
+ _channels.close(cid, send=True, force=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_close_both_with_unused_items_forced(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'ham', blocking=False)
- channels.close(cid, send=True, recv=True, force=True)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'ham', blocking=False)
+ _channels.close(cid, send=True, recv=True, force=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_close_never_used(self):
- cid = channels.create()
- channels.close(cid)
+ cid = _channels.create()
+ _channels.close(cid)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'spam')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'spam')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_close_by_unassociated_interp(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
interp = _interpreters.create()
_interpreters.run_string(interp, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.close({cid}, force=True)
"""))
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
- with self.assertRaises(channels.ChannelClosedError):
- channels.close(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.close(cid)
def test_close_used_multiple_times_by_single_user(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'spam', blocking=False)
- channels.recv(cid)
- channels.close(cid, force=True)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.recv(cid)
+ _channels.close(cid, force=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_channel_list_interpreters_invalid_channel(self):
- cid = channels.create()
+ cid = _channels.create()
# Test for invalid channel ID.
- with self.assertRaises(channels.ChannelNotFoundError):
- channels.list_interpreters(1000, send=True)
+ with self.assertRaises(_channels.ChannelNotFoundError):
+ _channels.list_interpreters(1000, send=True)
- channels.close(cid)
+ _channels.close(cid)
# Test for a channel that has been closed.
- with self.assertRaises(channels.ChannelClosedError):
- channels.list_interpreters(cid, send=True)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.list_interpreters(cid, send=True)
def test_channel_list_interpreters_invalid_args(self):
# Tests for invalid arguments passed to the API.
- cid = channels.create()
+ cid = _channels.create()
with self.assertRaises(TypeError):
- channels.list_interpreters(cid)
+ _channels.list_interpreters(cid)
class ChannelReleaseTests(TestBase):
@@ -1240,26 +1240,26 @@ class ChannelReleaseTests(TestBase):
"""
def test_single_user(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.recv(cid)
- channels.release(cid, send=True, recv=True)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.recv(cid)
+ _channels.release(cid, send=True, recv=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_multiple_users(self):
- cid = channels.create()
+ cid = _channels.create()
id1 = _interpreters.create()
id2 = _interpreters.create()
_interpreters.run_string(id1, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.send({cid}, b'spam', blocking=False)
"""))
out = _run_output(id2, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
obj = _channels.recv({cid})
_channels.release({cid})
print(repr(obj))
@@ -1271,94 +1271,94 @@ class ChannelReleaseTests(TestBase):
self.assertEqual(out.strip(), "b'spam'")
def test_no_kwargs(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.recv(cid)
- channels.release(cid)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.recv(cid)
+ _channels.release(cid)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_multiple_times(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.recv(cid)
- channels.release(cid, send=True, recv=True)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.recv(cid)
+ _channels.release(cid, send=True, recv=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.release(cid, send=True, recv=True)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.release(cid, send=True, recv=True)
def test_with_unused_items(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'ham', blocking=False)
- channels.release(cid, send=True, recv=True)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'ham', blocking=False)
+ _channels.release(cid, send=True, recv=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_never_used(self):
- cid = channels.create()
- channels.release(cid)
+ cid = _channels.create()
+ _channels.release(cid)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'spam')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'spam')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_by_unassociated_interp(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
interp = _interpreters.create()
_interpreters.run_string(interp, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
_channels.release({cid})
"""))
- obj = channels.recv(cid)
- channels.release(cid)
+ obj = _channels.recv(cid)
+ _channels.release(cid)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
self.assertEqual(obj, b'spam')
def test_close_if_unassociated(self):
# XXX Something's not right with this test...
- cid = channels.create()
+ cid = _channels.create()
interp = _interpreters.create()
_interpreters.run_string(interp, dedent(f"""
- import _xxinterpchannels as _channels
+ import _interpchannels as _channels
obj = _channels.send({cid}, b'spam', blocking=False)
_channels.release({cid})
"""))
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
def test_partially(self):
# XXX Is partial close too weird/confusing?
- cid = channels.create()
- channels.send(cid, None, blocking=False)
- channels.recv(cid)
- channels.send(cid, b'spam', blocking=False)
- channels.release(cid, send=True)
- obj = channels.recv(cid)
+ cid = _channels.create()
+ _channels.send(cid, None, blocking=False)
+ _channels.recv(cid)
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.release(cid, send=True)
+ obj = _channels.recv(cid)
self.assertEqual(obj, b'spam')
def test_used_multiple_times_by_single_user(self):
- cid = channels.create()
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'spam', blocking=False)
- channels.send(cid, b'spam', blocking=False)
- channels.recv(cid)
- channels.release(cid, send=True, recv=True)
+ cid = _channels.create()
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'spam', blocking=False)
+ _channels.recv(cid)
+ _channels.release(cid, send=True, recv=True)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(cid, b'eggs')
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(cid, b'eggs')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(cid)
class ChannelCloseFixture(namedtuple('ChannelCloseFixture',
@@ -1428,18 +1428,18 @@ class ChannelCloseFixture(namedtuple('ChannelCloseFixture',
def _new_channel(self, creator):
if creator.name == 'main':
- return channels.create()
+ return _channels.create()
else:
- ch = channels.create()
+ ch = _channels.create()
run_interp(creator.id, f"""
- import _xxsubinterpreters
+ import _interpreters
cid = _xxsubchannels.create()
# We purposefully send back an int to avoid tying the
# channel to the other interpreter.
_xxsubchannels.send({ch}, int(cid), blocking=False)
- del _xxsubinterpreters
+ del _interpreters
""")
- self._cid = channels.recv(ch)
+ self._cid = _channels.recv(ch)
return self._cid
def _get_interpreter(self, interp):
@@ -1464,13 +1464,13 @@ class ChannelCloseFixture(namedtuple('ChannelCloseFixture',
if interp.name == 'main':
return
run_interp(interp.id, f"""
- import _xxinterpchannels as channels
- import test.test__xxinterpchannels as helpers
+ import _interpchannels as channels
+ import test.test__interpchannels as helpers
ChannelState = helpers.ChannelState
try:
cid
except NameError:
- cid = channels._channel_id({self.cid})
+ cid = _channels._channel_id({self.cid})
""")
@@ -1657,7 +1657,7 @@ class ExhaustiveChannelTests(TestBase):
)
fix.record_action(action, result)
else:
- _cid = channels.create()
+ _cid = _channels.create()
run_interp(interp.id, f"""
result = helpers.run_action(
{fix.cid},
@@ -1666,12 +1666,12 @@ class ExhaustiveChannelTests(TestBase):
{repr(fix.state)},
hideclosed={hideclosed},
)
- channels.send({_cid}, result.pending.to_bytes(1, 'little'), blocking=False)
- channels.send({_cid}, b'X' if result.closed else b'', blocking=False)
+ _channels.send({_cid}, result.pending.to_bytes(1, 'little'), blocking=False)
+ _channels.send({_cid}, b'X' if result.closed else b'', blocking=False)
""")
result = ChannelState(
- pending=int.from_bytes(channels.recv(_cid), 'little'),
- closed=bool(channels.recv(_cid)),
+ pending=int.from_bytes(_channels.recv(_cid), 'little'),
+ closed=bool(_channels.recv(_cid)),
)
fix.record_action(action, result)
@@ -1694,42 +1694,42 @@ class ExhaustiveChannelTests(TestBase):
if not fix.expect_closed_error():
self.run_action(fix, close, hideclosed=False)
else:
- with self.assertRaises(channels.ChannelClosedError):
+ with self.assertRaises(_channels.ChannelClosedError):
self.run_action(fix, close, hideclosed=False)
def _assert_closed_in_interp(self, fix, interp=None):
if interp is None or interp.name == 'main':
- with self.assertRaises(channels.ChannelClosedError):
- channels.recv(fix.cid)
- with self.assertRaises(channels.ChannelClosedError):
- channels.send(fix.cid, b'spam')
- with self.assertRaises(channels.ChannelClosedError):
- channels.close(fix.cid)
- with self.assertRaises(channels.ChannelClosedError):
- channels.close(fix.cid, force=True)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.recv(fix.cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.send(fix.cid, b'spam')
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.close(fix.cid)
+ with self.assertRaises(_channels.ChannelClosedError):
+ _channels.close(fix.cid, force=True)
else:
run_interp(interp.id, """
with helpers.expect_channel_closed():
- channels.recv(cid)
+ _channels.recv(cid)
""")
run_interp(interp.id, """
with helpers.expect_channel_closed():
- channels.send(cid, b'spam', blocking=False)
+ _channels.send(cid, b'spam', blocking=False)
""")
run_interp(interp.id, """
with helpers.expect_channel_closed():
- channels.close(cid)
+ _channels.close(cid)
""")
run_interp(interp.id, """
with helpers.expect_channel_closed():
- channels.close(cid, force=True)
+ _channels.close(cid, force=True)
""")
def _assert_closed(self, fix):
self.assertTrue(fix.state.closed)
for _ in range(fix.state.pending):
- channels.recv(fix.cid)
+ _channels.recv(fix.cid)
self._assert_closed_in_interp(fix)
for interp in ('same', 'other'):
diff --git a/Lib/test/test__xxsubinterpreters.py b/Lib/test/test__interpreters.py
similarity index 98%
rename from Lib/test/test__xxsubinterpreters.py
rename to Lib/test/test__interpreters.py
index c8c964f642f..beeb280894e 100644
--- a/Lib/test/test__xxsubinterpreters.py
+++ b/Lib/test/test__interpreters.py
@@ -13,9 +13,9 @@ from test.support import os_helper
from test.support import script_helper
-_interpreters = import_helper.import_module('_xxsubinterpreters')
+_interpreters = import_helper.import_module('_interpreters')
_testinternalcapi = import_helper.import_module('_testinternalcapi')
-from _xxsubinterpreters import InterpreterNotFoundError
+from _interpreters import InterpreterNotFoundError
##################################
@@ -231,7 +231,7 @@ class ModuleTests(TestBase):
def test_import_in_interpreter(self):
_run_output(
_interpreters.create(),
- 'import _xxsubinterpreters as _interpreters',
+ 'import _interpreters',
)
@@ -273,7 +273,7 @@ class GetCurrentTests(TestBase):
main, *_ = _interpreters.get_main()
interp = _interpreters.create()
out = _run_output(interp, dedent("""
- import _xxsubinterpreters as _interpreters
+ import _interpreters
cur, *_ = _interpreters.get_current()
print(cur)
assert isinstance(cur, int)
@@ -296,7 +296,7 @@ class GetMainTests(TestBase):
[expected] = [id for id, *_ in _interpreters.list_all()]
interp = _interpreters.create()
out = _run_output(interp, dedent("""
- import _xxsubinterpreters as _interpreters
+ import _interpreters
main, *_ = _interpreters.get_main()
print(main)
assert isinstance(main, int)
@@ -323,7 +323,7 @@ class IsRunningTests(TestBase):
def test_from_subinterpreter(self):
interp = _interpreters.create()
out = _run_output(interp, dedent(f"""
- import _xxsubinterpreters as _interpreters
+ import _interpreters
if _interpreters.is_running({interp}):
print(True)
else:
@@ -385,7 +385,7 @@ class CreateTests(TestBase):
main, = [id for id, *_ in _interpreters.list_all()]
id1 = _interpreters.create()
out = _run_output(id1, dedent("""
- import _xxsubinterpreters as _interpreters
+ import _interpreters
id = _interpreters.create()
print(id)
assert isinstance(id, int)
@@ -402,7 +402,7 @@ class CreateTests(TestBase):
def f():
nonlocal id2
out = _run_output(id1, dedent("""
- import _xxsubinterpreters as _interpreters
+ import _interpreters
id = _interpreters.create()
print(id)
"""))
@@ -505,7 +505,7 @@ class DestroyTests(TestBase):
main, = [id for id, *_ in _interpreters.list_all()]
id = _interpreters.create()
script = dedent(f"""
- import _xxsubinterpreters as _interpreters
+ import _interpreters
try:
_interpreters.destroy({id})
except _interpreters.InterpreterError:
@@ -521,7 +521,7 @@ class DestroyTests(TestBase):
id1 = _interpreters.create()
id2 = _interpreters.create()
script = dedent(f"""
- import _xxsubinterpreters as _interpreters
+ import _interpreters
_interpreters.destroy({id2})
""")
_interpreters.run_string(id1, script)
@@ -862,7 +862,7 @@ class RunStringTests(TestBase):
script = dedent("""
from textwrap import dedent
import threading
- import _xxsubinterpreters as _interpreters
+ import _interpreters
id = _interpreters.create()
def f():
_interpreters.run_string(id, dedent('''
diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py
index 9c24ec8fd05..0701eafb7c3 100644
--- a/Lib/test/test_capi/test_misc.py
+++ b/Lib/test/test_capi/test_misc.py
@@ -42,7 +42,7 @@ try:
except ImportError:
_testsinglephase = None
try:
- import _xxsubinterpreters as _interpreters
+ import _interpreters
except ModuleNotFoundError:
_interpreters = None
diff --git a/Lib/test/test_import/__init__.py b/Lib/test/test_import/__init__.py
index 947a7b19056..40c3023a827 100644
--- a/Lib/test/test_import/__init__.py
+++ b/Lib/test/test_import/__init__.py
@@ -50,7 +50,7 @@ try:
except ImportError:
_testmultiphase = None
try:
- import _xxsubinterpreters as _interpreters
+ import _interpreters
except ModuleNotFoundError:
_interpreters = None
try:
diff --git a/Lib/test/test_importlib/test_util.py b/Lib/test/test_importlib/test_util.py
index f0583c5fd01..668042782bd 100644
--- a/Lib/test/test_importlib/test_util.py
+++ b/Lib/test/test_importlib/test_util.py
@@ -27,7 +27,7 @@ try:
except ImportError:
_testmultiphase = None
try:
- import _xxsubinterpreters as _interpreters
+ import _interpreters
except ModuleNotFoundError:
_interpreters = None
diff --git a/Lib/test/test_interpreters/test_api.py b/Lib/test/test_interpreters/test_api.py
index 2bd8bee4063..0039fa46496 100644
--- a/Lib/test/test_interpreters/test_api.py
+++ b/Lib/test/test_interpreters/test_api.py
@@ -9,7 +9,7 @@ import unittest
from test import support
from test.support import import_helper
# Raise SkipTest if subinterpreters not supported.
-_interpreters = import_helper.import_module('_xxsubinterpreters')
+_interpreters = import_helper.import_module('_interpreters')
from test.support import Py_GIL_DISABLED
from test.support import interpreters
from test.support.interpreters import (
@@ -385,7 +385,7 @@ class TestInterpreterIsRunning(TestBase):
def test_from_subinterpreter(self):
interp = interpreters.create()
out = _run_output(interp, dedent(f"""
- import _xxsubinterpreters as _interpreters
+ import _interpreters
if _interpreters.is_running({interp.id}):
print(True)
else:
@@ -876,7 +876,7 @@ class TestInterpreterExec(TestBase):
with self.assertRaisesRegex(InterpreterError, 'unrecognized'):
interp.exec('raise Exception("it worked!")')
- # test_xxsubinterpreters covers the remaining
+ # test__interpreters covers the remaining
# Interpreter.exec() behavior.
@@ -1290,7 +1290,7 @@ class LowLevelTests(TestBase):
self.assertEqual(whence, _interpreters.WHENCE_RUNTIME)
script = f"""
- import {_interpreters.__name__} as _interpreters
+ import _interpreters
interpid, whence = _interpreters.get_current()
print((interpid, whence))
"""
@@ -1333,7 +1333,7 @@ class LowLevelTests(TestBase):
with self.subTest('via interp from _interpreters'):
text = self.run_and_capture(interpid2, f"""
- import {_interpreters.__name__} as _interpreters
+ import _interpreters
print(
_interpreters.list_all())
""")
@@ -1352,7 +1352,7 @@ class LowLevelTests(TestBase):
(interpid5, _interpreters.WHENCE_STDLIB),
]
text = self.run_temp_from_capi(f"""
- import {_interpreters.__name__} as _interpreters
+ import _interpreters
_interpreters.create()
print(
_interpreters.list_all())
@@ -1507,7 +1507,7 @@ class LowLevelTests(TestBase):
with self.subTest('from C-API, running'):
text = self.run_temp_from_capi(dedent(f"""
- import {_interpreters.__name__} as _interpreters
+ import _interpreters
interpid, *_ = _interpreters.get_current()
print(_interpreters.whence(interpid))
"""),
@@ -1518,7 +1518,7 @@ class LowLevelTests(TestBase):
with self.subTest('from legacy C-API, running'):
...
text = self.run_temp_from_capi(dedent(f"""
- import {_interpreters.__name__} as _interpreters
+ import _interpreters
interpid, *_ = _interpreters.get_current()
print(_interpreters.whence(interpid))
"""),
diff --git a/Lib/test/test_interpreters/test_channels.py b/Lib/test/test_interpreters/test_channels.py
index 7e0b82884c3..68cc45d1a5e 100644
--- a/Lib/test/test_interpreters/test_channels.py
+++ b/Lib/test/test_interpreters/test_channels.py
@@ -7,7 +7,7 @@ import time
from test.support import import_helper
# Raise SkipTest if subinterpreters not supported.
-_channels = import_helper.import_module('_xxinterpchannels')
+_channels = import_helper.import_module('_interpchannels')
from test.support import interpreters
from test.support.interpreters import channels
from .utils import _run_output, TestBase
@@ -22,7 +22,7 @@ class LowLevelTests(TestBase):
# encountered by the high-level module, thus they
# mostly shouldn't matter as much.
- # Additional tests are found in Lib/test/test__xxinterpchannels.py.
+ # Additional tests are found in Lib/test/test__interpchannels.py.
# XXX Those should be either moved to LowLevelTests or eliminated
# in favor of high-level tests in this file.
diff --git a/Lib/test/test_interpreters/test_lifecycle.py b/Lib/test/test_interpreters/test_lifecycle.py
index becf003e2e5..ac24f6568ac 100644
--- a/Lib/test/test_interpreters/test_lifecycle.py
+++ b/Lib/test/test_interpreters/test_lifecycle.py
@@ -10,7 +10,7 @@ from test import support
from test.support import import_helper
from test.support import os_helper
# Raise SkipTest if subinterpreters not supported.
-import_helper.import_module('_xxsubinterpreters')
+import_helper.import_module('_interpreters')
from .utils import TestBase
diff --git a/Lib/test/test_interpreters/test_queues.py b/Lib/test/test_interpreters/test_queues.py
index 8ab9ebb3547..a3d44c402e0 100644
--- a/Lib/test/test_interpreters/test_queues.py
+++ b/Lib/test/test_interpreters/test_queues.py
@@ -7,7 +7,7 @@ import time
from test.support import import_helper, Py_DEBUG
# Raise SkipTest if subinterpreters not supported.
-_queues = import_helper.import_module('_xxinterpqueues')
+_queues = import_helper.import_module('_interpqueues')
from test.support import interpreters
from test.support.interpreters import queues
from .utils import _run_output, TestBase as _TestBase
diff --git a/Lib/test/test_interpreters/test_stress.py b/Lib/test/test_interpreters/test_stress.py
index 3cc570b3bf7..e400535b2a0 100644
--- a/Lib/test/test_interpreters/test_stress.py
+++ b/Lib/test/test_interpreters/test_stress.py
@@ -5,7 +5,7 @@ from test import support
from test.support import import_helper
from test.support import threading_helper
# Raise SkipTest if subinterpreters not supported.
-import_helper.import_module('_xxsubinterpreters')
+import_helper.import_module('_interpreters')
from test.support import interpreters
from .utils import TestBase
diff --git a/Lib/test/test_interpreters/utils.py b/Lib/test/test_interpreters/utils.py
index 8e475816f04..312e6fff0ce 100644
--- a/Lib/test/test_interpreters/utils.py
+++ b/Lib/test/test_interpreters/utils.py
@@ -21,7 +21,7 @@ from test import support
# We would use test.support.import_helper.import_module(),
# but the indirect import of test.support.os_helper causes refleaks.
try:
- import _xxsubinterpreters as _interpreters
+ import _interpreters
except ImportError as exc:
raise unittest.SkipTest(str(exc))
from test.support import interpreters
diff --git a/Makefile.pre.in b/Makefile.pre.in
index c7cf44de2db..0e52e10602c 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -1686,11 +1686,11 @@ Modules/pwdmodule.o: $(srcdir)/Modules/pwdmodule.c $(srcdir)/Modules/posixmodule
Modules/signalmodule.o: $(srcdir)/Modules/signalmodule.c $(srcdir)/Modules/posixmodule.h
-Modules/_xxsubinterpretersmodule.o: $(srcdir)/Modules/_xxsubinterpretersmodule.c $(srcdir)/Modules/_interpreters_common.h
+Modules/_interpretersmodule.o: $(srcdir)/Modules/_interpretersmodule.c $(srcdir)/Modules/_interpreters_common.h
-Modules/_xxinterpqueuesmodule.o: $(srcdir)/Modules/_xxinterpqueuesmodule.c $(srcdir)/Modules/_interpreters_common.h
+Modules/_interpqueuesmodule.o: $(srcdir)/Modules/_interpqueuesmodule.c $(srcdir)/Modules/_interpreters_common.h
-Modules/_xxinterpchannelsmodule.o: $(srcdir)/Modules/_xxinterpchannelsmodule.c $(srcdir)/Modules/_interpreters_common.h
+Modules/_interpchannelsmodule.o: $(srcdir)/Modules/_interpchannelsmodule.c $(srcdir)/Modules/_interpreters_common.h
Python/crossinterp.o: $(srcdir)/Python/crossinterp.c $(srcdir)/Python/crossinterp_data_lookup.h $(srcdir)/Python/crossinterp_exceptions.h
diff --git a/Misc/NEWS.d/next/Library/2024-04-11-18-11-37.gh-issue-76785.BWNkhC.rst b/Misc/NEWS.d/next/Library/2024-04-11-18-11-37.gh-issue-76785.BWNkhC.rst
new file mode 100644
index 00000000000..f3e4c57b8f1
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-04-11-18-11-37.gh-issue-76785.BWNkhC.rst
@@ -0,0 +1,6 @@
+We've exposed the low-level :mod:`!_interpreters` module for the sake of the
+PyPI implementation of :pep:`734`. It was sometimes available as the
+:mod:`!_xxsubinterpreters` module and was formerly used only for testing. For
+the most part, it should be considered an internal module, like :mod:`!_thread`
+and :mod:`!_imp`. See
+https://discuss.python.org/t/pep-734-multiple-interpreters-in-the-stdlib/41147/26.
diff --git a/Modules/Setup b/Modules/Setup
index cd1cf24c25d..e4acf6bc7de 100644
--- a/Modules/Setup
+++ b/Modules/Setup
@@ -137,6 +137,9 @@ PYTHONPATH=$(COREPYTHONPATH)
#_datetime _datetimemodule.c
#_decimal _decimal/_decimal.c
#_heapq _heapqmodule.c
+#_interpchannels _interpchannelsmodule.c
+#_interpqueues _interpqueuesmodule.c
+#_interpreters _interpretersmodule.c
#_json _json.c
#_lsprof _lsprof.c rotatingtree.c
#_multiprocessing -I$(srcdir)/Modules/_multiprocessing _multiprocessing/multiprocessing.c _multiprocessing/semaphore.c
@@ -271,9 +274,6 @@ PYTHONPATH=$(COREPYTHONPATH)
# Testing
-#_xxsubinterpreters _xxsubinterpretersmodule.c
-#_xxinterpchannels _xxinterpchannelsmodule.c
-#_xxinterpqueues _xxinterpqueuesmodule.c
#_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c
#_testbuffer _testbuffer.c
#_testinternalcapi _testinternalcapi.c
diff --git a/Modules/Setup.stdlib.in b/Modules/Setup.stdlib.in
index 0b0c1eef0cd..61037f592f8 100644
--- a/Modules/Setup.stdlib.in
+++ b/Modules/Setup.stdlib.in
@@ -43,9 +43,10 @@
@MODULE__STRUCT_TRUE@_struct _struct.c
# build supports subinterpreters
-@MODULE__XXSUBINTERPRETERS_TRUE@_xxsubinterpreters _xxsubinterpretersmodule.c
-@MODULE__XXINTERPCHANNELS_TRUE@_xxinterpchannels _xxinterpchannelsmodule.c
-@MODULE__XXINTERPQUEUES_TRUE@_xxinterpqueues _xxinterpqueuesmodule.c
+@MODULE__INTERPRETERS_TRUE@_interpreters _interpretersmodule.c
+@MODULE__INTERPCHANNELS_TRUE@_interpchannels _interpchannelsmodule.c
+@MODULE__INTERPQUEUES_TRUE@_interpqueues _interpqueuesmodule.c
+
@MODULE__ZONEINFO_TRUE@_zoneinfo _zoneinfo.c
# needs libm
diff --git a/Modules/_xxinterpchannelsmodule.c b/Modules/_interpchannelsmodule.c
similarity index 99%
rename from Modules/_xxinterpchannelsmodule.c
rename to Modules/_interpchannelsmodule.c
index bea0a6cf93f..43c96584790 100644
--- a/Modules/_xxinterpchannelsmodule.c
+++ b/Modules/_interpchannelsmodule.c
@@ -84,7 +84,7 @@ channel's queue, which are safely managed via the _PyCrossInterpreterData_*()
API.. The module does not create any objects that are shared globally.
*/
-#define MODULE_NAME _xxinterpchannels
+#define MODULE_NAME _interpchannels
#define MODULE_NAME_STR Py_STRINGIFY(MODULE_NAME)
#define MODINIT_FUNC_NAME RESOLVE_MODINIT_FUNC_NAME(MODULE_NAME)
diff --git a/Modules/_xxinterpqueuesmodule.c b/Modules/_interpqueuesmodule.c
similarity index 99%
rename from Modules/_xxinterpqueuesmodule.c
rename to Modules/_interpqueuesmodule.c
index 96f6eeeea94..46801bd4164 100644
--- a/Modules/_xxinterpqueuesmodule.c
+++ b/Modules/_interpqueuesmodule.c
@@ -13,7 +13,7 @@
#undef REGISTERS_HEAP_TYPES
-#define MODULE_NAME _xxinterpqueues
+#define MODULE_NAME _interpqueues
#define MODULE_NAME_STR Py_STRINGIFY(MODULE_NAME)
#define MODINIT_FUNC_NAME RESOLVE_MODINIT_FUNC_NAME(MODULE_NAME)
diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_interpretersmodule.c
similarity index 99%
rename from Modules/_xxsubinterpretersmodule.c
rename to Modules/_interpretersmodule.c
index 8fcd4fc4154..8fea56977ef 100644
--- a/Modules/_xxsubinterpretersmodule.c
+++ b/Modules/_interpretersmodule.c
@@ -23,7 +23,7 @@
#include "_interpreters_common.h"
-#define MODULE_NAME _xxsubinterpreters
+#define MODULE_NAME _interpreters
#define MODULE_NAME_STR Py_STRINGIFY(MODULE_NAME)
#define MODINIT_FUNC_NAME RESOLVE_MODINIT_FUNC_NAME(MODULE_NAME)
diff --git a/PC/config.c b/PC/config.c
index 5eff2f5b231..b744f711b0d 100644
--- a/PC/config.c
+++ b/PC/config.c
@@ -35,9 +35,9 @@ extern PyObject* PyInit__codecs(void);
extern PyObject* PyInit__weakref(void);
/* XXX: These two should really be extracted to standalone extensions. */
extern PyObject* PyInit_xxsubtype(void);
-extern PyObject* PyInit__xxsubinterpreters(void);
-extern PyObject* PyInit__xxinterpchannels(void);
-extern PyObject* PyInit__xxinterpqueues(void);
+extern PyObject* PyInit__interpreters(void);
+extern PyObject* PyInit__interpchannels(void);
+extern PyObject* PyInit__interpqueues(void);
extern PyObject* PyInit__random(void);
extern PyObject* PyInit_itertools(void);
extern PyObject* PyInit__collections(void);
@@ -139,9 +139,9 @@ struct _inittab _PyImport_Inittab[] = {
{"_json", PyInit__json},
{"xxsubtype", PyInit_xxsubtype},
- {"_xxsubinterpreters", PyInit__xxsubinterpreters},
- {"_xxinterpchannels", PyInit__xxinterpchannels},
- {"_xxinterpqueues", PyInit__xxinterpqueues},
+ {"_interpreters", PyInit__interpreters},
+ {"_interpchannels", PyInit__interpchannels},
+ {"_interpqueues", PyInit__interpqueues},
#ifdef _Py_HAVE_ZLIB
{"zlib", PyInit_zlib},
#endif
diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj
index 3a019a5fe55..25d52945c1c 100644
--- a/PCbuild/pythoncore.vcxproj
+++ b/PCbuild/pythoncore.vcxproj
@@ -465,9 +465,9 @@
-
-
-
+
+
+
diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters
index e43970410bd..4b1f9aa6538 100644
--- a/PCbuild/pythoncore.vcxproj.filters
+++ b/PCbuild/pythoncore.vcxproj.filters
@@ -1547,13 +1547,13 @@
Parser
-
+
Modules
-
+
Modules
-
+
Modules
diff --git a/Python/stdlib_module_names.h b/Python/stdlib_module_names.h
index ac9d91b5e12..08a66f447e2 100644
--- a/Python/stdlib_module_names.h
+++ b/Python/stdlib_module_names.h
@@ -37,6 +37,9 @@ static const char* _Py_stdlib_module_names[] = {
"_hashlib",
"_heapq",
"_imp",
+"_interpchannels",
+"_interpqueues",
+"_interpreters",
"_io",
"_ios_support",
"_json",
diff --git a/Tools/build/generate_stdlib_module_names.py b/Tools/build/generate_stdlib_module_names.py
index 69dc74e7f25..f9fd29509f3 100644
--- a/Tools/build/generate_stdlib_module_names.py
+++ b/Tools/build/generate_stdlib_module_names.py
@@ -36,9 +36,6 @@ IGNORE = {
'_testmultiphase',
'_testsinglephase',
'_testexternalinspection',
- '_xxsubinterpreters',
- '_xxinterpchannels',
- '_xxinterpqueues',
'_xxtestfuzz',
'idlelib.idle_test',
'test',
diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv
index e0ae39036c1..87b695de23e 100644
--- a/Tools/c-analyzer/cpython/ignored.tsv
+++ b/Tools/c-analyzer/cpython/ignored.tsv
@@ -164,8 +164,8 @@ Python/pylifecycle.c _Py_FatalErrorFormat reentrant -
Python/pylifecycle.c fatal_error reentrant -
# explicitly protected, internal-only
-Modules/_xxinterpchannelsmodule.c - _globals -
-Modules/_xxinterpqueuesmodule.c - _globals -
+Modules/_interpchannelsmodule.c - _globals -
+Modules/_interpqueuesmodule.c - _globals -
# set once during module init
Modules/_decimal/_decimal.c - minalloc_is_set -
@@ -246,11 +246,11 @@ Modules/_struct.c - bigendian_table -
Modules/_struct.c - lilendian_table -
Modules/_struct.c - native_table -
Modules/_tkinter.c - state_key -
-Modules/_xxinterpchannelsmodule.c - _channelid_end_recv -
-Modules/_xxinterpchannelsmodule.c - _channelid_end_send -
+Modules/_interpchannelsmodule.c - _channelid_end_recv -
+Modules/_interpchannelsmodule.c - _channelid_end_send -
Modules/_zoneinfo.c - DAYS_BEFORE_MONTH -
Modules/_zoneinfo.c - DAYS_IN_MONTH -
-Modules/_xxsubinterpretersmodule.c - no_exception -
+Modules/_interpretersmodule.c - no_exception -
Modules/arraymodule.c - descriptors -
Modules/arraymodule.c - emptybuf -
Modules/cjkcodecs/_codecs_cn.c - _mapping_list -
diff --git a/configure b/configure
index 94ee1ca9cd0..78f86d83077 100755
--- a/configure
+++ b/configure
@@ -775,12 +775,12 @@ MODULE__MULTIPROCESSING_FALSE
MODULE__MULTIPROCESSING_TRUE
MODULE__ZONEINFO_FALSE
MODULE__ZONEINFO_TRUE
-MODULE__XXINTERPQUEUES_FALSE
-MODULE__XXINTERPQUEUES_TRUE
-MODULE__XXINTERPCHANNELS_FALSE
-MODULE__XXINTERPCHANNELS_TRUE
-MODULE__XXSUBINTERPRETERS_FALSE
-MODULE__XXSUBINTERPRETERS_TRUE
+MODULE__INTERPQUEUES_FALSE
+MODULE__INTERPQUEUES_TRUE
+MODULE__INTERPCHANNELS_FALSE
+MODULE__INTERPCHANNELS_TRUE
+MODULE__INTERPRETERS_FALSE
+MODULE__INTERPRETERS_TRUE
MODULE__TYPING_FALSE
MODULE__TYPING_TRUE
MODULE__STRUCT_FALSE
@@ -28659,9 +28659,9 @@ case $ac_sys_system in #(
py_cv_module__posixsubprocess=n/a
py_cv_module__scproxy=n/a
py_cv_module__tkinter=n/a
- py_cv_module__xxsubinterpreters=n/a
- py_cv_module__xxinterpchannels=n/a
- py_cv_module__xxinterpqueues=n/a
+ py_cv_module__interpreters=n/a
+ py_cv_module__interpchannels=n/a
+ py_cv_module__interpqueues=n/a
py_cv_module_grp=n/a
py_cv_module_pwd=n/a
py_cv_module_resource=n/a
@@ -29126,20 +29126,20 @@ then :
fi
- if test "$py_cv_module__xxsubinterpreters" != "n/a"
+ if test "$py_cv_module__interpreters" != "n/a"
then :
- py_cv_module__xxsubinterpreters=yes
+ py_cv_module__interpreters=yes
fi
- if test "$py_cv_module__xxsubinterpreters" = yes; then
- MODULE__XXSUBINTERPRETERS_TRUE=
- MODULE__XXSUBINTERPRETERS_FALSE='#'
+ if test "$py_cv_module__interpreters" = yes; then
+ MODULE__INTERPRETERS_TRUE=
+ MODULE__INTERPRETERS_FALSE='#'
else
- MODULE__XXSUBINTERPRETERS_TRUE='#'
- MODULE__XXSUBINTERPRETERS_FALSE=
+ MODULE__INTERPRETERS_TRUE='#'
+ MODULE__INTERPRETERS_FALSE=
fi
- as_fn_append MODULE_BLOCK "MODULE__XXSUBINTERPRETERS_STATE=$py_cv_module__xxsubinterpreters$as_nl"
- if test "x$py_cv_module__xxsubinterpreters" = xyes
+ as_fn_append MODULE_BLOCK "MODULE__INTERPRETERS_STATE=$py_cv_module__interpreters$as_nl"
+ if test "x$py_cv_module__interpreters" = xyes
then :
@@ -29148,20 +29148,20 @@ then :
fi
- if test "$py_cv_module__xxinterpchannels" != "n/a"
+ if test "$py_cv_module__interpchannels" != "n/a"
then :
- py_cv_module__xxinterpchannels=yes
+ py_cv_module__interpchannels=yes
fi
- if test "$py_cv_module__xxinterpchannels" = yes; then
- MODULE__XXINTERPCHANNELS_TRUE=
- MODULE__XXINTERPCHANNELS_FALSE='#'
+ if test "$py_cv_module__interpchannels" = yes; then
+ MODULE__INTERPCHANNELS_TRUE=
+ MODULE__INTERPCHANNELS_FALSE='#'
else
- MODULE__XXINTERPCHANNELS_TRUE='#'
- MODULE__XXINTERPCHANNELS_FALSE=
+ MODULE__INTERPCHANNELS_TRUE='#'
+ MODULE__INTERPCHANNELS_FALSE=
fi
- as_fn_append MODULE_BLOCK "MODULE__XXINTERPCHANNELS_STATE=$py_cv_module__xxinterpchannels$as_nl"
- if test "x$py_cv_module__xxinterpchannels" = xyes
+ as_fn_append MODULE_BLOCK "MODULE__INTERPCHANNELS_STATE=$py_cv_module__interpchannels$as_nl"
+ if test "x$py_cv_module__interpchannels" = xyes
then :
@@ -29170,20 +29170,20 @@ then :
fi
- if test "$py_cv_module__xxinterpqueues" != "n/a"
+ if test "$py_cv_module__interpqueues" != "n/a"
then :
- py_cv_module__xxinterpqueues=yes
+ py_cv_module__interpqueues=yes
fi
- if test "$py_cv_module__xxinterpqueues" = yes; then
- MODULE__XXINTERPQUEUES_TRUE=
- MODULE__XXINTERPQUEUES_FALSE='#'
+ if test "$py_cv_module__interpqueues" = yes; then
+ MODULE__INTERPQUEUES_TRUE=
+ MODULE__INTERPQUEUES_FALSE='#'
else
- MODULE__XXINTERPQUEUES_TRUE='#'
- MODULE__XXINTERPQUEUES_FALSE=
+ MODULE__INTERPQUEUES_TRUE='#'
+ MODULE__INTERPQUEUES_FALSE=
fi
- as_fn_append MODULE_BLOCK "MODULE__XXINTERPQUEUES_STATE=$py_cv_module__xxinterpqueues$as_nl"
- if test "x$py_cv_module__xxinterpqueues" = xyes
+ as_fn_append MODULE_BLOCK "MODULE__INTERPQUEUES_STATE=$py_cv_module__interpqueues$as_nl"
+ if test "x$py_cv_module__interpqueues" = xyes
then :
@@ -31532,16 +31532,16 @@ if test -z "${MODULE__TYPING_TRUE}" && test -z "${MODULE__TYPING_FALSE}"; then
as_fn_error $? "conditional \"MODULE__TYPING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
-if test -z "${MODULE__XXSUBINTERPRETERS_TRUE}" && test -z "${MODULE__XXSUBINTERPRETERS_FALSE}"; then
- as_fn_error $? "conditional \"MODULE__XXSUBINTERPRETERS\" was never defined.
+if test -z "${MODULE__INTERPRETERS_TRUE}" && test -z "${MODULE__INTERPRETERS_FALSE}"; then
+ as_fn_error $? "conditional \"MODULE__INTERPRETERS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
-if test -z "${MODULE__XXINTERPCHANNELS_TRUE}" && test -z "${MODULE__XXINTERPCHANNELS_FALSE}"; then
- as_fn_error $? "conditional \"MODULE__XXINTERPCHANNELS\" was never defined.
+if test -z "${MODULE__INTERPCHANNELS_TRUE}" && test -z "${MODULE__INTERPCHANNELS_FALSE}"; then
+ as_fn_error $? "conditional \"MODULE__INTERPCHANNELS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
-if test -z "${MODULE__XXINTERPQUEUES_TRUE}" && test -z "${MODULE__XXINTERPQUEUES_FALSE}"; then
- as_fn_error $? "conditional \"MODULE__XXINTERPQUEUES\" was never defined.
+if test -z "${MODULE__INTERPQUEUES_TRUE}" && test -z "${MODULE__INTERPQUEUES_FALSE}"; then
+ as_fn_error $? "conditional \"MODULE__INTERPQUEUES\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__ZONEINFO_TRUE}" && test -z "${MODULE__ZONEINFO_FALSE}"; then
diff --git a/configure.ac b/configure.ac
index 7877ef45c2e..719b8d3a957 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7433,9 +7433,9 @@ AS_CASE([$ac_sys_system],
[_posixsubprocess],
[_scproxy],
[_tkinter],
- [_xxsubinterpreters],
- [_xxinterpchannels],
- [_xxinterpqueues],
+ [_interpreters],
+ [_interpchannels],
+ [_interpqueues],
[grp],
[pwd],
[resource],
@@ -7558,9 +7558,9 @@ PY_STDLIB_MOD_SIMPLE([_random])
PY_STDLIB_MOD_SIMPLE([select])
PY_STDLIB_MOD_SIMPLE([_struct])
PY_STDLIB_MOD_SIMPLE([_typing])
-PY_STDLIB_MOD_SIMPLE([_xxsubinterpreters])
-PY_STDLIB_MOD_SIMPLE([_xxinterpchannels])
-PY_STDLIB_MOD_SIMPLE([_xxinterpqueues])
+PY_STDLIB_MOD_SIMPLE([_interpreters])
+PY_STDLIB_MOD_SIMPLE([_interpchannels])
+PY_STDLIB_MOD_SIMPLE([_interpqueues])
PY_STDLIB_MOD_SIMPLE([_zoneinfo])
dnl multiprocessing modules