/*[clinic end generated code: output=da39a3ee5e6b4b0d input=8fd17862aa989c69]*/
+#define FI_FREELIST_MAXLEN 255
+
+typedef struct futureiterobject futureiterobject;
+
/* State of the _asyncio module */
typedef struct {
PyTypeObject *FutureIterType;
/* Counter for autogenerated Task names */
uint64_t task_name_counter;
+
+ futureiterobject *fi_freelist;
+ Py_ssize_t fi_freelist_len;
} asyncio_state;
static inline asyncio_state *
/*********************** Future Iterator **************************/
-typedef struct {
+typedef struct futureiterobject {
PyObject_HEAD
FutureObj *future;
} futureiterobject;
-#define FI_FREELIST_MAXLEN 255
-static futureiterobject *fi_freelist = NULL;
-static Py_ssize_t fi_freelist_len = 0;
-
-
static void
FutureIter_dealloc(futureiterobject *it)
{
PyTypeObject *tp = Py_TYPE(it);
+ asyncio_state *state = get_asyncio_state_by_def((PyObject *)it);
PyObject_GC_UnTrack(it);
tp->tp_clear((PyObject *)it);
- if (fi_freelist_len < FI_FREELIST_MAXLEN) {
- fi_freelist_len++;
- it->future = (FutureObj*) fi_freelist;
- fi_freelist = it;
+ if (state->fi_freelist_len < FI_FREELIST_MAXLEN) {
+ state->fi_freelist_len++;
+ it->future = (FutureObj*) state->fi_freelist;
+ state->fi_freelist = it;
}
else {
PyObject_GC_Del(it);
futureiterobject *it;
asyncio_state *state = get_asyncio_state_by_def((PyObject *)fut);
- if (!Future_Check(state, fut)) {
- PyErr_BadInternalCall();
- return NULL;
- }
-
ENSURE_FUTURE_ALIVE(state, fut)
- if (fi_freelist_len) {
- fi_freelist_len--;
- it = fi_freelist;
- fi_freelist = (futureiterobject*) it->future;
+ if (state->fi_freelist_len) {
+ state->fi_freelist_len--;
+ it = state->fi_freelist;
+ state->fi_freelist = (futureiterobject*) it->future;
it->future = NULL;
_Py_NewReference((PyObject*) it);
}
static void
-module_free_freelists(void)
+module_free_freelists(asyncio_state *state)
{
PyObject *next;
PyObject *current;
- next = (PyObject*) fi_freelist;
+ next = (PyObject*) state->fi_freelist;
while (next != NULL) {
- assert(fi_freelist_len > 0);
- fi_freelist_len--;
+ assert(state->fi_freelist_len > 0);
+ state->fi_freelist_len--;
current = next;
next = (PyObject*) ((futureiterobject*) current)->future;
PyObject_GC_Del(current);
}
- assert(fi_freelist_len == 0);
- fi_freelist = NULL;
+ assert(state->fi_freelist_len == 0);
+ state->fi_freelist = NULL;
}
static int
Py_VISIT(state->context_kwname);
// Visit freelist.
- PyObject *next = (PyObject*) fi_freelist;
+ PyObject *next = (PyObject*) state->fi_freelist;
while (next != NULL) {
PyObject *current = next;
Py_VISIT(current);
Py_CLEAR(state->context_kwname);
- module_free_freelists();
+ module_free_freelists(state);
return 0;
}