mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
gh-111968: Use per-thread freelists for generator in free-threading (gh-114189)
This commit is contained in:
parent
2d3f6b56c5
commit
7fa511ba57
9 changed files with 48 additions and 74 deletions
|
@ -19,12 +19,14 @@ extern "C" {
|
|||
# define PyList_MAXFREELIST 80
|
||||
# define PyFloat_MAXFREELIST 100
|
||||
# define PyContext_MAXFREELIST 255
|
||||
# define _PyAsyncGen_MAXFREELIST 80
|
||||
#else
|
||||
# define PyTuple_NFREELISTS 0
|
||||
# define PyTuple_MAXFREELIST 0
|
||||
# define PyList_MAXFREELIST 0
|
||||
# define PyFloat_MAXFREELIST 0
|
||||
# define PyContext_MAXFREELIST 0
|
||||
# define _PyAsyncGen_MAXFREELIST 0
|
||||
#endif
|
||||
|
||||
struct _Py_list_state {
|
||||
|
@ -77,12 +79,27 @@ struct _Py_context_state {
|
|||
#endif
|
||||
};
|
||||
|
||||
struct _Py_async_gen_state {
|
||||
#ifdef WITH_FREELISTS
|
||||
/* Freelists boost performance 6-10%; they also reduce memory
|
||||
fragmentation, as _PyAsyncGenWrappedValue and PyAsyncGenASend
|
||||
are short-living objects that are instantiated for every
|
||||
__anext__() call. */
|
||||
struct _PyAsyncGenWrappedValue* value_freelist[_PyAsyncGen_MAXFREELIST];
|
||||
int value_numfree;
|
||||
|
||||
struct PyAsyncGenASend* asend_freelist[_PyAsyncGen_MAXFREELIST];
|
||||
int asend_numfree;
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef struct _Py_freelist_state {
|
||||
struct _Py_float_state float_state;
|
||||
struct _Py_tuple_state tuple_state;
|
||||
struct _Py_list_state list_state;
|
||||
struct _Py_slice_state slice_state;
|
||||
struct _Py_context_state context_state;
|
||||
struct _Py_async_gen_state async_gen_state;
|
||||
} _PyFreeListState;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -251,7 +251,7 @@ extern void _PyFloat_ClearFreeList(_PyFreeListState *state, int is_finalization)
|
|||
extern void _PyList_ClearFreeList(_PyFreeListState *state, int is_finalization);
|
||||
extern void _PySlice_ClearCache(_PyFreeListState *state);
|
||||
extern void _PyDict_ClearFreeList(PyInterpreterState *interp);
|
||||
extern void _PyAsyncGen_ClearFreeLists(PyInterpreterState *interp);
|
||||
extern void _PyAsyncGen_ClearFreeLists(_PyFreeListState *state, int is_finalization);
|
||||
extern void _PyContext_ClearFreeList(_PyFreeListState *state, int is_finalization);
|
||||
extern void _Py_ScheduleGC(PyInterpreterState *interp);
|
||||
extern void _Py_RunGC(PyThreadState *tstate);
|
||||
|
|
|
@ -8,6 +8,8 @@ extern "C" {
|
|||
# error "this header requires Py_BUILD_CORE define"
|
||||
#endif
|
||||
|
||||
#include "pycore_freelist.h"
|
||||
|
||||
extern PyObject *_PyGen_yf(PyGenObject *);
|
||||
extern void _PyGen_Finalize(PyObject *self);
|
||||
|
||||
|
@ -26,34 +28,7 @@ extern PyTypeObject _PyAsyncGenAThrow_Type;
|
|||
|
||||
/* runtime lifecycle */
|
||||
|
||||
extern void _PyAsyncGen_Fini(PyInterpreterState *);
|
||||
|
||||
|
||||
/* other API */
|
||||
|
||||
#ifndef WITH_FREELISTS
|
||||
// without freelists
|
||||
# define _PyAsyncGen_MAXFREELIST 0
|
||||
#endif
|
||||
|
||||
#ifndef _PyAsyncGen_MAXFREELIST
|
||||
# define _PyAsyncGen_MAXFREELIST 80
|
||||
#endif
|
||||
|
||||
struct _Py_async_gen_state {
|
||||
#if _PyAsyncGen_MAXFREELIST > 0
|
||||
/* Freelists boost performance 6-10%; they also reduce memory
|
||||
fragmentation, as _PyAsyncGenWrappedValue and PyAsyncGenASend
|
||||
are short-living objects that are instantiated for every
|
||||
__anext__() call. */
|
||||
struct _PyAsyncGenWrappedValue* value_freelist[_PyAsyncGen_MAXFREELIST];
|
||||
int value_numfree;
|
||||
|
||||
struct PyAsyncGenASend* asend_freelist[_PyAsyncGen_MAXFREELIST];
|
||||
int asend_numfree;
|
||||
#endif
|
||||
};
|
||||
|
||||
extern void _PyAsyncGen_Fini(_PyFreeListState *);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -190,7 +190,6 @@ struct _is {
|
|||
|
||||
struct _Py_tuple_state tuple;
|
||||
struct _Py_dict_state dict_state;
|
||||
struct _Py_async_gen_state async_gen;
|
||||
struct _Py_exc_state exc_state;
|
||||
|
||||
struct ast_state ast;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue