Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Lib/concurrent/interpreters/_queues.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def create(maxsize=0, *, unbounditems=UNBOUND):
"""
unbound = _serialize_unbound(unbounditems)
unboundop, = unbound
qid = _queues.create(maxsize, unboundop, -1)
qid = _queues.create(maxsize, unboundop)
self = Queue(qid)
self._set_unbound(unboundop, unbounditems)
return self
Expand Down
33 changes: 27 additions & 6 deletions Lib/test/test_interpreters/test_queues.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def test_highlevel_reloaded(self):
importlib.reload(queues)

def test_create_destroy(self):
qid = _queues.create(2, REPLACE, -1)
qid = _queues.create(2, REPLACE)
_queues.destroy(qid)
self.assertEqual(get_num_queues(), 0)
with self.assertRaises(queues.QueueNotFoundError):
Expand All @@ -56,7 +56,7 @@ def test_not_destroyed(self):
'-c',
dedent(f"""
import {_queues.__name__} as _queues
_queues.create(2, {REPLACE}, -1)
_queues.create(2, {REPLACE})
"""),
)
self.assertEqual(stdout, '')
Expand All @@ -67,32 +67,53 @@ def test_not_destroyed(self):

def test_bind_release(self):
with self.subTest('typical'):
qid = _queues.create(2, REPLACE, -1)
qid = _queues.create(2, REPLACE)
_queues.bind(qid)
_queues.release(qid)
self.assertEqual(get_num_queues(), 0)

with self.subTest('bind too much'):
qid = _queues.create(2, REPLACE, -1)
qid = _queues.create(2, REPLACE)
_queues.bind(qid)
_queues.bind(qid)
_queues.release(qid)
_queues.destroy(qid)
self.assertEqual(get_num_queues(), 0)

with self.subTest('nested'):
qid = _queues.create(2, REPLACE, -1)
qid = _queues.create(2, REPLACE)
_queues.bind(qid)
_queues.bind(qid)
_queues.release(qid)
_queues.release(qid)
self.assertEqual(get_num_queues(), 0)

with self.subTest('release without binding'):
qid = _queues.create(2, REPLACE, -1)
qid = _queues.create(2, REPLACE)
with self.assertRaises(queues.QueueError):
_queues.release(qid)

def test_parse_fallback(self):
# see https://github.com/python/cpython/pull/137686
# does not raise TypeError / OverflowError / ValueError
for arg in False, True, None, -1, 2**1000:
_queues.create(2, REPLACE, fallback=arg)
msg = r'create\(\) takes at most 2 positional arguments'
with self.assertRaisesRegex(TypeError, msg):
_queues.create(2, REPLACE, -1)

obj = None
unboundop = -1
for arg in False, True, None, -1, 2**1000:
qid = _queues.create(2, REPLACE)
_queues.put(qid, obj, unboundop, fallback=arg)
_queues.destroy(qid)
msg = r'put\(\) takes at most 3 positional arguments'
with self.assertRaisesRegex(TypeError, msg):
qid = _queues.create(2, REPLACE)
_queues.put(qid, obj, unboundop, -1)
_queues.destroy(qid)


class QueueTests(TestBase):

Expand Down
4 changes: 2 additions & 2 deletions Modules/_interpqueuesmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1486,7 +1486,7 @@ queuesmod_create(PyObject *self, PyObject *args, PyObject *kwds)
Py_ssize_t maxsize;
int unboundarg = -1;
int fallbackarg = -1;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "n|ii:create", kwlist,
if (!PyArg_ParseTupleAndKeywords(args, kwds, "n|i$p:create", kwlist,
&maxsize, &unboundarg, &fallbackarg))
{
return NULL;
Expand Down Expand Up @@ -1603,7 +1603,7 @@ queuesmod_put(PyObject *self, PyObject *args, PyObject *kwds)
PyObject *obj;
int unboundarg = -1;
int fallbackarg = -1;
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&O|ii$p:put", kwlist,
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&O|i$p:put", kwlist,
qidarg_converter, &qidarg, &obj,
&unboundarg, &fallbackarg))
{
Expand Down
Loading