mirror of https://github.com/python/cpython
gh-125196: Add a free list to PyUnicodeWriter (#125227)
This commit is contained in:
parent
7a10cdec35
commit
1639d934b9
|
@ -20,6 +20,7 @@ extern "C" {
|
||||||
# define Py_async_gen_asends_MAXFREELIST 80
|
# define Py_async_gen_asends_MAXFREELIST 80
|
||||||
# define Py_futureiters_MAXFREELIST 255
|
# define Py_futureiters_MAXFREELIST 255
|
||||||
# define Py_object_stack_chunks_MAXFREELIST 4
|
# define Py_object_stack_chunks_MAXFREELIST 4
|
||||||
|
# define Py_unicode_writers_MAXFREELIST 1
|
||||||
|
|
||||||
// A generic freelist of either PyObjects or other data structures.
|
// A generic freelist of either PyObjects or other data structures.
|
||||||
struct _Py_freelist {
|
struct _Py_freelist {
|
||||||
|
@ -44,6 +45,7 @@ struct _Py_freelists {
|
||||||
struct _Py_freelist async_gen_asends;
|
struct _Py_freelist async_gen_asends;
|
||||||
struct _Py_freelist futureiters;
|
struct _Py_freelist futureiters;
|
||||||
struct _Py_freelist object_stack_chunks;
|
struct _Py_freelist object_stack_chunks;
|
||||||
|
struct _Py_freelist unicode_writers;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -862,6 +862,7 @@ _PyObject_ClearFreeLists(struct _Py_freelists *freelists, int is_finalization)
|
||||||
// stacks during GC, so emptying the free-list is counterproductive.
|
// stacks during GC, so emptying the free-list is counterproductive.
|
||||||
clear_freelist(&freelists->object_stack_chunks, 1, PyMem_RawFree);
|
clear_freelist(&freelists->object_stack_chunks, 1, PyMem_RawFree);
|
||||||
}
|
}
|
||||||
|
clear_freelist(&freelists->unicode_writers, is_finalization, PyMem_Free);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -46,6 +46,7 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
#include "pycore_codecs.h" // _PyCodec_Lookup()
|
#include "pycore_codecs.h" // _PyCodec_Lookup()
|
||||||
#include "pycore_critical_section.h" // Py_*_CRITICAL_SECTION_SEQUENCE_FAST
|
#include "pycore_critical_section.h" // Py_*_CRITICAL_SECTION_SEQUENCE_FAST
|
||||||
#include "pycore_format.h" // F_LJUST
|
#include "pycore_format.h" // F_LJUST
|
||||||
|
#include "pycore_freelist.h" // _Py_FREELIST_FREE(), _Py_FREELIST_POP()
|
||||||
#include "pycore_initconfig.h" // _PyStatus_OK()
|
#include "pycore_initconfig.h" // _PyStatus_OK()
|
||||||
#include "pycore_interp.h" // PyInterpreterState.fs_codec
|
#include "pycore_interp.h" // PyInterpreterState.fs_codec
|
||||||
#include "pycore_long.h" // _PyLong_FormatWriter()
|
#include "pycore_long.h" // _PyLong_FormatWriter()
|
||||||
|
@ -13436,9 +13437,13 @@ PyUnicodeWriter_Create(Py_ssize_t length)
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t size = sizeof(_PyUnicodeWriter);
|
const size_t size = sizeof(_PyUnicodeWriter);
|
||||||
PyUnicodeWriter *pub_writer = (PyUnicodeWriter *)PyMem_Malloc(size);
|
PyUnicodeWriter *pub_writer;
|
||||||
|
pub_writer = _Py_FREELIST_POP_MEM(unicode_writers);
|
||||||
if (pub_writer == NULL) {
|
if (pub_writer == NULL) {
|
||||||
return (PyUnicodeWriter *)PyErr_NoMemory();
|
pub_writer = (PyUnicodeWriter *)PyMem_Malloc(size);
|
||||||
|
if (pub_writer == NULL) {
|
||||||
|
return (PyUnicodeWriter *)PyErr_NoMemory();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_PyUnicodeWriter *writer = (_PyUnicodeWriter *)pub_writer;
|
_PyUnicodeWriter *writer = (_PyUnicodeWriter *)pub_writer;
|
||||||
|
|
||||||
|
@ -13459,7 +13464,7 @@ void PyUnicodeWriter_Discard(PyUnicodeWriter *writer)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_PyUnicodeWriter_Dealloc((_PyUnicodeWriter*)writer);
|
_PyUnicodeWriter_Dealloc((_PyUnicodeWriter*)writer);
|
||||||
PyMem_Free(writer);
|
_Py_FREELIST_FREE(unicode_writers, writer, PyMem_Free);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -13881,7 +13886,7 @@ PyUnicodeWriter_Finish(PyUnicodeWriter *writer)
|
||||||
{
|
{
|
||||||
PyObject *str = _PyUnicodeWriter_Finish((_PyUnicodeWriter*)writer);
|
PyObject *str = _PyUnicodeWriter_Finish((_PyUnicodeWriter*)writer);
|
||||||
assert(((_PyUnicodeWriter*)writer)->buffer == NULL);
|
assert(((_PyUnicodeWriter*)writer)->buffer == NULL);
|
||||||
PyMem_Free(writer);
|
_Py_FREELIST_FREE(unicode_writers, writer, PyMem_Free);
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue