diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-05-02 22:31:14 +0200 |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-05-02 22:31:14 +0200 |
commit | 595eab7fac1c64b8a25352d0dd40f1e7b62ee58a (patch) | |
tree | 7681af31e623aaad94b0bb1ecfc43a3cac1d9dc4 /Modules/gcmodule.c | |
parent | dc47a19e576dcb358547608c5347a6bf78ced562 (diff) | |
download | cpython-595eab7fac1c64b8a25352d0dd40f1e7b62ee58a.tar.gz |
Issue #21233: Add new C functions: PyMem_RawCalloc(), PyMem_Calloc(),
PyObject_Calloc(), _PyObject_GC_Calloc(). bytes(int) and bytearray(int) are now
using ``calloc()`` instead of ``malloc()`` for large objects which is faster
and use less memory (until the bytearray buffer is filled with data).
Diffstat (limited to 'Modules/gcmodule.c')
-rw-r--r-- | Modules/gcmodule.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 6281a7c343..cff5d097af 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1703,15 +1703,19 @@ PyObject_GC_UnTrack(void *op) _PyObject_GC_UNTRACK(op); } -PyObject * -_PyObject_GC_Malloc(size_t basicsize) +static PyObject * +_PyObject_GC_Alloc(int use_calloc, size_t basicsize) { PyObject *op; PyGC_Head *g; + size_t size; if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head)) return PyErr_NoMemory(); - g = (PyGC_Head *)PyObject_MALLOC( - sizeof(PyGC_Head) + basicsize); + size = sizeof(PyGC_Head) + basicsize; + if (use_calloc) + g = (PyGC_Head *)PyObject_Calloc(1, size); + else + g = (PyGC_Head *)PyObject_Malloc(size); if (g == NULL) return PyErr_NoMemory(); g->gc.gc_refs = 0; @@ -1731,6 +1735,18 @@ _PyObject_GC_Malloc(size_t basicsize) } PyObject * +_PyObject_GC_Malloc(size_t basicsize) +{ + return _PyObject_GC_Alloc(0, basicsize); +} + +PyObject * +_PyObject_GC_Calloc(size_t basicsize) +{ + return _PyObject_GC_Alloc(1, basicsize); +} + +PyObject * _PyObject_GC_New(PyTypeObject *tp) { PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp)); |