summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael W. Hudson <mwh@python.net>2002-06-10 13:19:42 (GMT)
committerMichael W. Hudson <mwh@python.net>2002-06-10 13:19:42 (GMT)
commit497bdd69f2cc7bfdd9155133ea8079bbff602e54 (patch)
tree11b7213133fb260784447e8b6f7c0dc3bcd7b3d3
parentb3bfa7f9dc3f0da7f651a4f93a74e878588cc861 (diff)
downloadcpython-497bdd69f2cc7bfdd9155133ea8079bbff602e54.zip
cpython-497bdd69f2cc7bfdd9155133ea8079bbff602e54.tar.gz
cpython-497bdd69f2cc7bfdd9155133ea8079bbff602e54.tar.bz2
Tweak the description of pymalloc. Mention pymemcompat.h.
-rw-r--r--Doc/whatsnew/whatsnew23.tex58
1 files changed, 34 insertions, 24 deletions
diff --git a/Doc/whatsnew/whatsnew23.tex b/Doc/whatsnew/whatsnew23.tex
index f79b882..5652797 100644
--- a/Doc/whatsnew/whatsnew23.tex
+++ b/Doc/whatsnew/whatsnew23.tex
@@ -357,9 +357,10 @@ or warnings.filterwarnings().
An experimental feature added to Python 2.1 was a specialized object
allocator called pymalloc, written by Vladimir Marangozov. Pymalloc
was intended to be faster than the system \function{malloc()} and have
-less memory overhead. The allocator uses C's \function{malloc()}
-function to get large pools of memory, and then fulfills smaller
-memory requests from these pools.
+less memory overhead for typical allocation patterns of Python
+programs. The allocator uses C's \function{malloc()} function to get
+large pools of memory, and then fulfills smaller memory requests from
+these pools.
In 2.1 and 2.2, pymalloc was an experimental feature and wasn't
enabled by default; you had to explicitly turn it on by providing the
@@ -378,32 +379,34 @@ and \function{free()}, meaning that if you accidentally called
mismatched functions, the error wouldn't be noticeable. When the
object allocator is enabled, these functions aren't aliases of
\function{malloc()} and \function{free()} any more, and calling the
-wrong function to free memory will get you a core dump. For example,
-if memory was allocated using \function{PyMem_New()}, it has to be
-freed using \function{PyMem_Del()}, not \function{free()}. A few
-modules included with Python fell afoul of this and had to be fixed;
-doubtless there are more third-party modules that will have the same
-problem.
+wrong function to free memory may get you a core dump. For example,
+if memory was allocated using \function{PyObject_Malloc()}, it has to
+be freed using \function{PyObject_Free()}, not \function{free()}. A
+few modules included with Python fell afoul of this and had to be
+fixed; doubtless there are more third-party modules that will have the
+same problem.
As part of this change, the confusing multiple interfaces for
-allocating memory have been consolidated down into two APIs.
-Memory allocated with one API must not be freed with the other API.
+allocating memory have been consolidated down into two API families.
+Memory allocated with one family must not be manipulated with
+functions from the other family.
+
+There is another family of functions specifically for allocating
+Python \emph{objects} (as opposed to memory).
\begin{itemize}
- \item To allocate and free an undistinguished chunk of memory using
- Python's allocator, use
- \cfunction{PyMem_Malloc()}, \cfunction{PyMem_Realloc()}, and
- \cfunction{PyMem_Free()}.
-
- \item In rare cases you may want to avoid using Python's allocator
- in order to allocate a chunk of memory;
- use \cfunction{PyObject_Malloc}, \cfunction{PyObject_Realloc},
- and \cfunction{PyObject_Free}.
-
- \item To allocate and free Python objects,
- use \cfunction{PyObject_New()}, \cfunction{PyObject_NewVar()}, and
- \cfunction{PyObject_Del()}.
+ \item To allocate and free an undistinguished chunk of memory use
+ the ``raw memory'' family: \cfunction{PyMem_Malloc()},
+ \cfunction{PyMem_Realloc()}, and \cfunction{PyMem_Free()}.
+
+ \item The ``object memory'' family is the interface to the pymalloc
+ facility described above and is biased towards a large number of
+ ``small'' allocations: \cfunction{PyObject_Malloc},
+ \cfunction{PyObject_Realloc}, and \cfunction{PyObject_Free}.
+ \item To allocate and free Python objects, use the ``object'' family
+ \cfunction{PyObject_New()}, \cfunction{PyObject_NewVar()}, and
+ \cfunction{PyObject_Del()}.
\end{itemize}
Thanks to lots of work by Tim Peters, pymalloc in 2.3 also provides
@@ -412,6 +415,13 @@ both extension modules and in the interpreter itself. To enable this
support, turn on the Python interpreter's debugging code by running
\program{configure} with \longprogramopt{with-pydebug}.
+To aid extension writers, a header file \file{Misc/pymemcompat.h} is
+distributed with the source to Python 2.3 that allows Python
+extensions to use the 2.3 interfaces to memory allocation and compile
+against any version of Python since 1.5.2. (The idea is that you take
+the file from Python's source distribution and bundle it with the
+source of you extension).
+
\begin{seealso}
\seeurl{http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/python/python/dist/src/Objects/obmalloc.c}