1#ifndef Py_INTERNAL_GENOBJECT_H
2#define Py_INTERNAL_GENOBJECT_H
3#ifdef __cplusplus
4extern "C" {
5#endif
6
7#ifndef Py_BUILD_CORE
8#  error "this header requires Py_BUILD_CORE define"
9#endif
10
11extern PyObject *_PyGen_yf(PyGenObject *);
12extern PyObject *_PyCoro_GetAwaitableIter(PyObject *o);
13extern PyObject *_PyAsyncGenValueWrapperNew(PyObject *);
14
15/* runtime lifecycle */
16
17extern void _PyAsyncGen_Fini(PyInterpreterState *);
18
19
20/* other API */
21
22#ifndef WITH_FREELISTS
23// without freelists
24#  define _PyAsyncGen_MAXFREELIST 0
25#endif
26
27#ifndef _PyAsyncGen_MAXFREELIST
28#  define _PyAsyncGen_MAXFREELIST 80
29#endif
30
31struct _Py_async_gen_state {
32#if _PyAsyncGen_MAXFREELIST > 0
33    /* Freelists boost performance 6-10%; they also reduce memory
34       fragmentation, as _PyAsyncGenWrappedValue and PyAsyncGenASend
35       are short-living objects that are instantiated for every
36       __anext__() call. */
37    struct _PyAsyncGenWrappedValue* value_freelist[_PyAsyncGen_MAXFREELIST];
38    int value_numfree;
39
40    struct PyAsyncGenASend* asend_freelist[_PyAsyncGen_MAXFREELIST];
41    int asend_numfree;
42#endif
43};
44
45
46#ifdef __cplusplus
47}
48#endif
49#endif /* !Py_INTERNAL_GENOBJECT_H */
50