1 #ifndef Py_INTERNAL_GENOBJECT_H
2 #define Py_INTERNAL_GENOBJECT_H
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6
7 #ifndef Py_BUILD_CORE
8 # error "this header requires Py_BUILD_CORE define"
9 #endif
10
11 extern PyObject *_PyGen_yf(PyGenObject *);
12 extern PyObject *_PyCoro_GetAwaitableIter(PyObject *o);
13 extern PyObject *_PyAsyncGenValueWrapperNew(PyThreadState *state, PyObject *);
14
15 /* runtime lifecycle */
16
17 extern 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
31 struct _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 */