@@ -18,6 +18,10 @@ module _asyncio
18
18
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=8fd17862aa989c69]*/
19
19
20
20
21
+ #define FI_FREELIST_MAXLEN 255
22
+
23
+ typedef struct futureiterobject futureiterobject ;
24
+
21
25
/* State of the _asyncio module */
22
26
typedef struct {
23
27
PyTypeObject * FutureIterType ;
@@ -67,6 +71,9 @@ typedef struct {
67
71
68
72
/* Counter for autogenerated Task names */
69
73
uint64_t task_name_counter ;
74
+
75
+ futureiterobject * fi_freelist ;
76
+ Py_ssize_t fi_freelist_len ;
70
77
} asyncio_state ;
71
78
72
79
static inline asyncio_state *
@@ -1574,28 +1581,24 @@ FutureObj_dealloc(PyObject *self)
1574
1581
1575
1582
/*********************** Future Iterator **************************/
1576
1583
1577
- typedef struct {
1584
+ typedef struct futureiterobject {
1578
1585
PyObject_HEAD
1579
1586
FutureObj * future ;
1580
1587
} futureiterobject ;
1581
1588
1582
1589
1583
- #define FI_FREELIST_MAXLEN 255
1584
- static futureiterobject * fi_freelist = NULL ;
1585
- static Py_ssize_t fi_freelist_len = 0 ;
1586
-
1587
-
1588
1590
static void
1589
1591
FutureIter_dealloc (futureiterobject * it )
1590
1592
{
1591
1593
PyTypeObject * tp = Py_TYPE (it );
1594
+ asyncio_state * state = get_asyncio_state_by_def ((PyObject * )it );
1592
1595
PyObject_GC_UnTrack (it );
1593
1596
tp -> tp_clear ((PyObject * )it );
1594
1597
1595
- if (fi_freelist_len < FI_FREELIST_MAXLEN ) {
1596
- fi_freelist_len ++ ;
1597
- it -> future = (FutureObj * ) fi_freelist ;
1598
- fi_freelist = it ;
1598
+ if (state -> fi_freelist_len < FI_FREELIST_MAXLEN ) {
1599
+ state -> fi_freelist_len ++ ;
1600
+ it -> future = (FutureObj * ) state -> fi_freelist ;
1601
+ state -> fi_freelist = it ;
1599
1602
}
1600
1603
else {
1601
1604
PyObject_GC_Del (it );
@@ -1799,17 +1802,12 @@ future_new_iter(PyObject *fut)
1799
1802
futureiterobject * it ;
1800
1803
1801
1804
asyncio_state * state = get_asyncio_state_by_def ((PyObject * )fut );
1802
- if (!Future_Check (state , fut )) {
1803
- PyErr_BadInternalCall ();
1804
- return NULL ;
1805
- }
1806
-
1807
1805
ENSURE_FUTURE_ALIVE (state , fut )
1808
1806
1809
- if (fi_freelist_len ) {
1810
- fi_freelist_len -- ;
1811
- it = fi_freelist ;
1812
- fi_freelist = (futureiterobject * ) it -> future ;
1807
+ if (state -> fi_freelist_len ) {
1808
+ state -> fi_freelist_len -- ;
1809
+ it = state -> fi_freelist ;
1810
+ state -> fi_freelist = (futureiterobject * ) it -> future ;
1813
1811
it -> future = NULL ;
1814
1812
_Py_NewReference ((PyObject * ) it );
1815
1813
}
@@ -3556,22 +3554,22 @@ _asyncio_current_task_impl(PyObject *module, PyObject *loop)
3556
3554
3557
3555
3558
3556
static void
3559
- module_free_freelists (void )
3557
+ module_free_freelists (asyncio_state * state )
3560
3558
{
3561
3559
PyObject * next ;
3562
3560
PyObject * current ;
3563
3561
3564
- next = (PyObject * ) fi_freelist ;
3562
+ next = (PyObject * ) state -> fi_freelist ;
3565
3563
while (next != NULL ) {
3566
- assert (fi_freelist_len > 0 );
3567
- fi_freelist_len -- ;
3564
+ assert (state -> fi_freelist_len > 0 );
3565
+ state -> fi_freelist_len -- ;
3568
3566
3569
3567
current = next ;
3570
3568
next = (PyObject * ) ((futureiterobject * ) current )-> future ;
3571
3569
PyObject_GC_Del (current );
3572
3570
}
3573
- assert (fi_freelist_len == 0 );
3574
- fi_freelist = NULL ;
3571
+ assert (state -> fi_freelist_len == 0 );
3572
+ state -> fi_freelist = NULL ;
3575
3573
}
3576
3574
3577
3575
static int
@@ -3603,7 +3601,7 @@ module_traverse(PyObject *mod, visitproc visit, void *arg)
3603
3601
Py_VISIT (state -> context_kwname );
3604
3602
3605
3603
// Visit freelist.
3606
- PyObject * next = (PyObject * ) fi_freelist ;
3604
+ PyObject * next = (PyObject * ) state -> fi_freelist ;
3607
3605
while (next != NULL ) {
3608
3606
PyObject * current = next ;
3609
3607
Py_VISIT (current );
@@ -3640,7 +3638,7 @@ module_clear(PyObject *mod)
3640
3638
3641
3639
Py_CLEAR (state -> context_kwname );
3642
3640
3643
- module_free_freelists ();
3641
+ module_free_freelists (state );
3644
3642
3645
3643
return 0 ;
3646
3644
}
0 commit comments