[Python-checkins] peps: PEP 445

victor.stinner python-checkins at python.org
Tue Jun 18 02:46:23 CEST 2013


http://hg.python.org/peps/rev/0971c633e30b
changeset:   4939:0971c633e30b
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Tue Jun 18 02:46:10 2013 +0200
summary:
  PEP 445

files:
  pep-0445.txt |  70 +++++++++++++++++++++++++--------------
  1 files changed, 45 insertions(+), 25 deletions(-)


diff --git a/pep-0445.txt b/pep-0445.txt
--- a/pep-0445.txt
+++ b/pep-0445.txt
@@ -12,7 +12,7 @@
 Abstract
 ========
 
-Add new APIs to customize memory allocators
+Add new APIs to customize memory allocators.
 
 
 Rationale
@@ -20,15 +20,19 @@
 
 Use cases:
 
-* Application embedding Python wanting to use a custom memory allocator
-  to allocate all Python memory somewhere else or with a different algorithm
+* Application embedding Python may want to isolate Python memory from the
+  memory of the application, or may want to different memory allocator
+  optimized for its Python usage
 * Python running on embedded devices with low memory and slow CPU.
   A custom memory allocator may be required to use efficiently the memory
   and/or to be able to use all memory of the device.
-* Debug tool to track memory leaks
-* Debug tool to detect buffer underflow, buffer overflow and misuse
-  of Python allocator APIs
-* Debug tool to inject bugs, simulate out of memory for example
+* Debug tool to:
+
+  - track memory leaks
+  - get the Python filename and line number where an object was allocated
+  - detect buffer underflow, buffer overflow and detect misuse of Python
+    allocator APIs (builtin Python debug hooks)
+  - force allocation to fail to test handling of ``MemoryError`` exception
 
 API:
 
@@ -62,8 +66,8 @@
   - ``void _PyObject_GetArenaAllocators(void **ctx_p, void* (**malloc_p) (void *ctx, size_t size), void (**free_p) (void *ctx, void *ptr, size_t size))``
   - ``void _PyObject_SetArenaAllocators(void *ctx, void* (*malloc) (void *ctx, size_t size), void (*free) (void *ctx, void *ptr, size_t size))``
 
-* Add a new function to setup debug hooks after memory allocators were
-  replaced:
+* Add a new function to setup Python builtin debug hooks when memory
+  allocators are replaced:
 
   - ``void PyMem_SetupDebugHooks(void)``
 
@@ -71,19 +75,19 @@
 Use these new APIs
 ------------------
 
-* ``PyMem_Malloc()`` and ``PyMem_Realloc()`` now always call ``malloc()`` and
+* ``PyMem_Malloc()`` and ``PyMem_Realloc()`` always call ``malloc()`` and
   ``realloc()``, instead of calling ``PyObject_Malloc()`` and
   ``PyObject_Realloc()`` in debug mode
 
-* ``PyObject_Malloc()`` now falls back on ``PyMem_Malloc()`` instead of
-  ``malloc()`` if size is bigger than ``SMALL_REQUEST_THRESHOLD``, and
-  ``PyObject_Realloc()`` falls back on ``PyMem_Realloc()`` instead of
-  ``realloc()``
+* ``PyObject_Malloc()`` falls back on ``PyMem_Malloc()`` instead of
+  ``malloc()`` if size is greater or equal than ``SMALL_REQUEST_THRESHOLD``
+  (512 bytes), and ``PyObject_Realloc()`` falls back on ``PyMem_Realloc()``
+  instead of ``realloc()``
 
 * Replace direct calls to ``malloc()`` with ``PyMem_Malloc()``, or
   ``PyMem_RawMalloc()`` if the GIL is not held
 
-* Configure external libraries like zlib or OpenSSL to use
+* Configure external libraries like zlib or OpenSSL to allocate memory using
   ``PyMem_RawMalloc()``
 
 
@@ -93,7 +97,8 @@
 Use case 1: Replace Memory Allocators, keep pymalloc
 ----------------------------------------------------
 
-Setup your custom memory allocators, keeping pymalloc::
+Setup your custom memory allocators, keeping pymalloc. Dummy example wasting 2
+bytes per allocation, and 10 bytes per arena::
 
     #include <stdlib.h>
 
@@ -156,7 +161,9 @@
 
 If your allocator is optimized for allocation of small objects (less than 512
 bytes) with a short liftime, you can replace override pymalloc (replace
-``PyObject_Malloc()``).  Example::
+``PyObject_Malloc()``).
+
+Dummy Example wasting 2 bytes per allocation::
 
     #include <stdlib.h>
 
@@ -203,7 +210,7 @@
 Use case 3: Setup Allocator Hooks
 ---------------------------------
 
-Setup hooks on memory allocators::
+Example to setup hooks on memory allocators::
 
     struct {
         PyMemAllocators pymem;
@@ -314,13 +321,20 @@
 * ``PYALLOC_PYOBJECT``
 
 
-Setup Builtin Debug Hooks
--------------------------
+Add a new PYDEBUGMALLOC environment variable
+--------------------------------------------
 
-To be able to use Python debug functions (like ``_PyMem_DebugMalloc()``) even
-when a custom memory allocator is set, an environment variable
-``PYDEBUGMALLOC`` can be added to set these debug function hooks, instead of
-the new function ``PyMem_SetupDebugHooks()``.
+To be able to use Python builtin debug hooks even when a custom memory
+allocator is set, an environment variable ``PYDEBUGMALLOC`` can be added to
+setup these debug function hooks, instead of adding the new function
+``PyMem_SetupDebugHooks()``. If the environment variable is present,
+``PyMem_SetRawAllocators()``, ``PyMem_SetAllocators()`` and
+``PyObject_SetAllocators()`` will reinstall automatically the hook on top of
+the new allocator.
+
+An new environment variable would make the Python initialization even more
+complex. The `PEP 432 <http://www.python.org/dev/peps/pep-0432/>`_ tries to
+simply the CPython startup sequence.
 
 
 Use macros to get customizable allocators
@@ -336,6 +350,12 @@
 Use C macros using ``__FILE__`` and ``__LINE__`` to get the C filename
 and line number of a memory allocation.
 
+Passing a filename and a line number to each allocator makes the API more
+complex: pass 3 new arguments instead of just a context argument, to each
+allocator function. GC allocator functions should also be patched,
+``_PyObject_GC_Malloc()`` is used in many C functions for example. Such changes
+add too much complexity, for a little gain.
+
 
 No context argument
 -------------------
@@ -446,7 +466,7 @@
   <http://bugs.python.org/issue13483>`_
 * `Issue #16742: PyOS_Readline drops GIL and calls PyOS_StdioReadline, which
   isn't thread safe <http://bugs.python.org/issue16742>`_
-* `Issue #18203: Replace calls to malloc() with PyMem_Malloc()
+* `Issue #18203: Replace calls to malloc() with PyMem_Malloc() or PyMem_RawMalloc()
   <http://bugs.python.org/issue18203>`_
 * `Issue #18227: Use Python memory allocators in external libraries like zlib
   or OpenSSL <http://bugs.python.org/issue18227>`_

-- 
Repository URL: http://hg.python.org/peps


More information about the Python-checkins mailing list