Skip to content

Commit 5966894

Browse files
author
Erlend E. Aasland
committed
Migrate from global to module state
1 parent 532e7ab commit 5966894

File tree

2 files changed

+58
-54
lines changed

2 files changed

+58
-54
lines changed

Modules/_queuemodule.c

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@ typedef struct {
77
PyObject *EmptyError;
88
} simplequeue_state;
99

10-
static simplequeue_state global_state;
11-
1210
static simplequeue_state *
13-
simplequeue_get_state()
11+
simplequeue_get_state(PyObject *module)
1412
{
15-
return &global_state;
13+
simplequeue_state *state = PyModule_GetState(module);
14+
assert(state);
15+
return state;
1616
}
17+
static struct PyModuleDef queuemodule;
18+
#define simplequeue_get_state_by_type(tp) \
19+
(simplequeue_get_state(_PyType_GetModuleByDef(type, &queuemodule)))
1720

1821
typedef struct {
1922
PyObject_HEAD
@@ -26,9 +29,9 @@ typedef struct {
2629

2730
/*[clinic input]
2831
module _queue
29-
class _queue.SimpleQueue "simplequeueobject *" "simplequeue_get_state()->SimpleQueueType"
32+
class _queue.SimpleQueue "simplequeueobject *" "simplequeue_get_state_by_type(type)->SimpleQueueType"
3033
[clinic start generated code]*/
31-
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ffce1ca094e64f3a]*/
34+
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=0a4023fe4d198c8d]*/
3235

3336
static void
3437
simplequeue_dealloc(simplequeueobject *self)
@@ -166,6 +169,9 @@ simplequeue_pop_item(simplequeueobject *self)
166169

167170
/*[clinic input]
168171
_queue.SimpleQueue.get
172+
173+
cls: defining_class
174+
/
169175
block: bool = True
170176
timeout: object = None
171177
@@ -182,9 +188,9 @@ in that case).
182188
[clinic start generated code]*/
183189

184190
static PyObject *
185-
_queue_SimpleQueue_get_impl(simplequeueobject *self, int block,
186-
PyObject *timeout)
187-
/*[clinic end generated code: output=ec82a7157dcccd1a input=4bf691f9f01fa297]*/
191+
_queue_SimpleQueue_get_impl(simplequeueobject *self, PyTypeObject *cls,
192+
int block, PyObject *timeout)
193+
/*[clinic end generated code: output=1969aefa7db63666 input=5fc4d56b9a54757e]*/
188194
{
189195
_PyTime_t endtime = 0;
190196
_PyTime_t timeout_val;
@@ -236,8 +242,10 @@ _queue_SimpleQueue_get_impl(simplequeueobject *self, int block,
236242
return NULL;
237243
}
238244
if (r == PY_LOCK_FAILURE) {
245+
PyObject *module = PyType_GetModule(cls);
246+
simplequeue_state *state = simplequeue_get_state(module);
239247
/* Timed out */
240-
PyErr_SetNone(simplequeue_get_state()->EmptyError);
248+
PyErr_SetNone(state->EmptyError);
241249
return NULL;
242250
}
243251
self->locked = 1;
@@ -262,17 +270,21 @@ _queue_SimpleQueue_get_impl(simplequeueobject *self, int block,
262270
/*[clinic input]
263271
_queue.SimpleQueue.get_nowait
264272
273+
cls: defining_class
274+
/
275+
265276
Remove and return an item from the queue without blocking.
266277
267278
Only get an item if one is immediately available. Otherwise
268279
raise the Empty exception.
269280
[clinic start generated code]*/
270281

271282
static PyObject *
272-
_queue_SimpleQueue_get_nowait_impl(simplequeueobject *self)
273-
/*[clinic end generated code: output=a89731a75dbe4937 input=6fe5102db540a1b9]*/
283+
_queue_SimpleQueue_get_nowait_impl(simplequeueobject *self,
284+
PyTypeObject *cls)
285+
/*[clinic end generated code: output=620c58e2750f8b8a input=842f732bf04216d3]*/
274286
{
275-
return _queue_SimpleQueue_get_impl(self, 0, Py_None);
287+
return _queue_SimpleQueue_get_impl(self, cls, 0, Py_None);
276288
}
277289

278290
/*[clinic input]
@@ -347,29 +359,25 @@ PyDoc_STRVAR(queue_module_doc,
347359
This module is an implementation detail, please do not use it directly.");
348360

349361
static struct PyModuleDef queuemodule = {
350-
PyModuleDef_HEAD_INIT,
351-
"_queue",
352-
queue_module_doc,
353-
-1,
354-
NULL,
355-
NULL,
356-
NULL,
357-
NULL,
358-
NULL
362+
.m_base = PyModuleDef_HEAD_INIT,
363+
.m_name = "_queue",
364+
.m_doc = queue_module_doc,
365+
.m_size = sizeof(simplequeue_state),
359366
};
360367

361368

362369
PyMODINIT_FUNC
363370
PyInit__queue(void)
364371
{
365372
PyObject *m;
366-
simplequeue_state *state = simplequeue_get_state();
373+
simplequeue_state *state;
367374

368375
/* Create the module */
369376
m = PyModule_Create(&queuemodule);
370377
if (m == NULL)
371378
return NULL;
372379

380+
state = simplequeue_get_state(m);
373381
state->EmptyError = PyErr_NewExceptionWithDoc(
374382
"_queue.Empty",
375383
"Exception raised by Queue.get(block=0)/get_nowait().",

Modules/clinic/_queuemodule.c.h

Lines changed: 27 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)