]> granicus.if.org Git - python/commitdiff
Drop the PyCore_* memory API.
authorNeil Schemenauer <nascheme@enme.ucalgary.ca>
Mon, 18 Mar 2002 21:06:21 +0000 (21:06 +0000)
committerNeil Schemenauer <nascheme@enme.ucalgary.ca>
Mon, 18 Mar 2002 21:06:21 +0000 (21:06 +0000)
Include/objimpl.h
Include/pymem.h
Objects/object.c
Objects/obmalloc.c

index 47e0da4d7ad37e55f3121ef22005fd93998f3c42..396c23be9b50e04b8fbfb06e9c35f7ec568d8e49 100644 (file)
@@ -56,43 +56,6 @@ form of memory management you're using).
 Unless you have specific memory management requirements, it is
 recommended to use PyObject_{New, NewVar, Del}. */
 
-/*
- * Core object memory allocator
- * ============================
- */
-
-/* The purpose of the object allocator is to make the distinction
-   between "object memory" and the rest within the Python heap.
-
-   Object memory is the one allocated by PyObject_{New, NewVar}, i.e.
-   the one that holds the object's representation defined by its C
-   type structure, *excluding* any object-specific memory buffers that
-   might be referenced by the structure (for type structures that have
-   pointer fields).  By default, the object memory allocator is
-   implemented on top of the raw memory allocator.
-
-   The PyCore_* macros can be defined to make the interpreter use a
-   custom object memory allocator. They are reserved for internal
-   memory management purposes exclusively. Both the core and extension
-   modules should use the PyObject_* API. */
-
-#ifdef WITH_PYMALLOC
-void *_PyCore_ObjectMalloc(size_t nbytes);
-void *_PyCore_ObjectRealloc(void *p, size_t nbytes);
-void _PyCore_ObjectFree(void *p);
-#define PyCore_OBJECT_MALLOC    _PyCore_ObjectMalloc
-#define PyCore_OBJECT_REALLOC   _PyCore_ObjectRealloc
-#define PyCore_OBJECT_FREE      _PyCore_ObjectFree
-#endif /* !WITH_PYMALLOC */
-
-#ifndef PyCore_OBJECT_MALLOC
-#undef PyCore_OBJECT_REALLOC
-#undef PyCore_OBJECT_FREE
-#define PyCore_OBJECT_MALLOC(n)     PyCore_MALLOC(n)
-#define PyCore_OBJECT_REALLOC(p, n) PyCore_REALLOC((p), (n))
-#define PyCore_OBJECT_FREE(p)       PyCore_FREE(p)
-#endif
-
 /*
  * Raw object memory interface
  * ===========================
@@ -111,19 +74,19 @@ void _PyCore_ObjectFree(void *p);
 
 /* Functions */
 
-/* Wrappers around PyCore_OBJECT_MALLOC and friends; useful if you
-   need to be sure that you are using the same object memory allocator
-   as Python. These wrappers *do not* make sure that allocating 0
-   bytes returns a non-NULL pointer. Returned pointers must be checked
-   for NULL explicitly; no action is performed on failure. */
+/* Wrappers that useful if you need to be sure that you are using the
+   same object memory allocator as Python. These wrappers *do not* make
+   sure that allocating 0 bytes returns a non-NULL pointer. Returned
+   pointers must be checked for NULL explicitly; no action is performed
+   on failure. */
 extern DL_IMPORT(void *) PyObject_Malloc(size_t);
 extern DL_IMPORT(void *) PyObject_Realloc(void *, size_t);
 extern DL_IMPORT(void) PyObject_Free(void *);
 
 /* Macros */
-#define PyObject_MALLOC(n)           PyCore_OBJECT_MALLOC(n)
-#define PyObject_REALLOC(op, n)      PyCore_OBJECT_REALLOC((void *)(op), (n))
-#define PyObject_FREE(op)            PyCore_OBJECT_FREE((void *)(op))
+#define PyObject_MALLOC(n)           _PyMalloc_MALLOC(n)
+#define PyObject_REALLOC(op, n)      _PyMalloc_REALLOC((void *)(op), (n))
+#define PyObject_FREE(op)            _PyMalloc_FREE((void *)(op))
 
 /*
  * Generic object allocator interface
index a02a1e0700c7970793d3580eea76ed3bed008a59..95922721a168c18f18c539008769ba582239e25e 100644 (file)
 extern "C" {
 #endif
 
-/*
- * Core memory allocator
- * =====================
- */
-
-/* To make sure the interpreter is user-malloc friendly, all memory
-   APIs are implemented on top of this one.
-
-   The PyCore_* macros can be defined to make the interpreter use a
-   custom allocator. Note that they are for internal use only. Both
-   the core and extension modules should use the PyMem_* API. */
-
-#ifndef PyCore_MALLOC
-#undef PyCore_REALLOC
-#undef PyCore_FREE
-#define PyCore_MALLOC(n)      malloc(n)
-#define PyCore_REALLOC(p, n)  realloc((p), (n))
-#define PyCore_FREE(p)        free(p)
-#endif
-
 /* BEWARE:
 
    Each interface exports both functions and macros. Extension modules
@@ -51,9 +31,12 @@ extern "C" {
  * ====================
  */
 
+/* To make sure the interpreter is user-malloc friendly, all memory
+   APIs are implemented on top of this one. */
+
 /* Functions */
 
-/* Function wrappers around PyCore_MALLOC and friends; useful if you
+/* Function wrappers around PyMem_MALLOC and friends; useful if you
    need to be sure that you are using the same memory allocator as
    Python.  Note that the wrappers make sure that allocating 0 bytes
    returns a non-NULL pointer, even if the underlying malloc
@@ -66,10 +49,12 @@ extern DL_IMPORT(void) PyMem_Free(void *);
 /* Starting from Python 1.6, the wrappers Py_{Malloc,Realloc,Free} are
    no longer supported. They used to call PyErr_NoMemory() on failure. */
 
-/* Macros */
-#define PyMem_MALLOC(n)         PyCore_MALLOC(n)
-#define PyMem_REALLOC(p, n)     PyCore_REALLOC((void *)(p), (n))
-#define PyMem_FREE(p)           PyCore_FREE((void *)(p))
+/* Macros (override these if you want to a different malloc */
+#ifndef PyMem_MALLOC
+#define PyMem_MALLOC(n)         malloc(n)
+#define PyMem_REALLOC(p, n)     realloc((void *)(p), (n))
+#define PyMem_FREE(p)           free((void *)(p))
+#endif
 
 /*
  * Type-oriented memory interface
@@ -104,6 +89,22 @@ extern DL_IMPORT(void) PyMem_Free(void *);
    it is recommended to write the test explicitly in the code.
    Note that according to ANSI C, free(NULL) has no effect. */
 
+       
+/* pymalloc (private to the interpreter) */
+#ifdef WITH_PYMALLOC
+void *_PyMalloc_Malloc(size_t nbytes);
+void *_PyMalloc_Realloc(void *p, size_t nbytes);
+void _PyMalloc_Free(void *p);
+#define _PyMalloc_MALLOC _PyMalloc_Malloc
+#define _PyMalloc_REALLOC _PyMalloc_Realloc
+#define _PyMalloc_FREE _PyMalloc_Free
+#else
+#define _PyMalloc_MALLOC PyMem_MALLOC
+#define _PyMalloc_REALLOC PyMem_REALLOC
+#define _PyMalloc_FREE PyMem_FREE
+#endif
+
+
 #ifdef __cplusplus
 }
 #endif
index 26ddd136717cf27d1b55a289de4468465b787811..1602e893c9911ad6b4ba75c5b9a6d8ddb1e94acf 100644 (file)
@@ -2093,4 +2093,19 @@ _PyTrash_destroy_chain(void)
 
 #ifdef WITH_PYMALLOC
 #include "obmalloc.c"
-#endif
+#else
+void *_PyMalloc_Malloc(size_t n)
+{
+       return PyMem_MALLOC(n);
+}
+
+void *_PyMalloc_Realloc(void *p, size_t n)
+{
+       return PyMem_REALLOC(p, n);
+}
+
+void _PyMalloc_Free(void *p)
+{
+       PyMem_FREE(p);
+}
+#endif /* !WITH_PYMALLOC */
index 57b19417893cfa3a6ec7ffd8319825af2cb837ea..43149d53384ba5335088211201e94febbc83a2e2 100644 (file)
@@ -349,7 +349,7 @@ static void (*free_hook)(void *) = NULL;
  */
 
 void *
-_PyCore_ObjectMalloc(size_t nbytes)
+_PyMalloc_Malloc(size_t nbytes)
 {
        block *bp;
        poolp pool;
@@ -479,7 +479,7 @@ _PyCore_ObjectMalloc(size_t nbytes)
                 * With malloc, we can't avoid loosing one page address space
                 * per arena due to the required alignment on page boundaries.
                 */
-               bp = (block *)PyCore_MALLOC(ARENA_SIZE + SYSTEM_PAGE_SIZE);
+               bp = (block *)PyMem_MALLOC(ARENA_SIZE + SYSTEM_PAGE_SIZE);
                if (bp == NULL) {
                        UNLOCK();
                        goto redirect;
@@ -510,13 +510,13 @@ _PyCore_ObjectMalloc(size_t nbytes)
         * last chance to serve the request) or when the max memory limit
         * has been reached.
         */
-       return (void *)PyCore_MALLOC(nbytes);
+       return (void *)PyMem_MALLOC(nbytes);
 }
 
 /* free */
 
 void
-_PyCore_ObjectFree(void *p)
+_PyMalloc_Free(void *p)
 {
        poolp pool;
        poolp next, prev;
@@ -536,7 +536,7 @@ _PyCore_ObjectFree(void *p)
        offset = (off_t )p & POOL_SIZE_MASK;
        pool = (poolp )((block *)p - offset);
        if (pool->pooladdr != pool || pool->magic != (uint )POOL_MAGIC) {
-               PyCore_FREE(p);
+               PyMem_FREE(p);
                return;
        }
 
@@ -595,7 +595,7 @@ _PyCore_ObjectFree(void *p)
 /* realloc */
 
 void *
-_PyCore_ObjectRealloc(void *p, size_t nbytes)
+_PyMalloc_Realloc(void *p, size_t nbytes)
 {
        block *bp;
        poolp pool;
@@ -607,7 +607,7 @@ _PyCore_ObjectRealloc(void *p, size_t nbytes)
 #endif
 
        if (p == NULL)
-               return _PyCore_ObjectMalloc(nbytes);
+               return _PyMalloc_Malloc(nbytes);
 
        /* realloc(p, 0) on big blocks is redirected. */
        pool = (poolp )((block *)p - ((off_t )p & POOL_SIZE_MASK));
@@ -618,7 +618,7 @@ _PyCore_ObjectRealloc(void *p, size_t nbytes)
                        size = nbytes;
                        goto malloc_copy_free;
                }
-               bp = (block *)PyCore_REALLOC(p, nbytes);
+               bp = (block *)PyMem_REALLOC(p, nbytes);
        }
        else {
                /* We're in charge of this block */
@@ -627,7 +627,7 @@ _PyCore_ObjectRealloc(void *p, size_t nbytes)
                        /* Don't bother if a smaller size was requested
                           except for realloc(p, 0) == free(p), ret NULL */
                        if (nbytes == 0) {
-                               _PyCore_ObjectFree(p);
+                               _PyMalloc_Free(p);
                                bp = NULL;
                        }
                        else
@@ -637,10 +637,10 @@ _PyCore_ObjectRealloc(void *p, size_t nbytes)
 
                malloc_copy_free:
 
-                       bp = (block *)_PyCore_ObjectMalloc(nbytes);
+                       bp = (block *)_PyMalloc_Malloc(nbytes);
                        if (bp != NULL) {
                                memcpy(bp, p, size);
-                               _PyCore_ObjectFree(p);
+                               _PyMalloc_Free(p);
                        }
                }
        }
@@ -651,7 +651,7 @@ _PyCore_ObjectRealloc(void *p, size_t nbytes)
 
 /* -- unused --
 void *
-_PyCore_ObjectCalloc(size_t nbel, size_t elsz)
+_PyMalloc_Calloc(size_t nbel, size_t elsz)
 {
         void *p;
        size_t nbytes;
@@ -662,7 +662,7 @@ _PyCore_ObjectCalloc(size_t nbel, size_t elsz)
 #endif
 
        nbytes = nbel * elsz;
-       p = _PyCore_ObjectMalloc(nbytes);
+       p = _PyMalloc_Malloc(nbytes);
        if (p != NULL)
                memset(p, 0, nbytes);
        return p;
@@ -678,10 +678,10 @@ _PyCore_ObjectCalloc(size_t nbel, size_t elsz)
 #ifdef WITH_MALLOC_HOOKS
 
 void
-_PyCore_ObjectMalloc_SetHooks( void *(*malloc_func)(size_t),
-                              void *(*calloc_func)(size_t, size_t),
-                              void *(*realloc_func)(void *, size_t),
-                              void (*free_func)(void *) )
+_PyMalloc_SetHooks( void *(*malloc_func)(size_t),
+                   void *(*calloc_func)(size_t, size_t),
+                   void *(*realloc_func)(void *, size_t),
+                   void (*free_func)(void *) )
 {
        LOCK();
        malloc_hook = malloc_func;
@@ -692,10 +692,10 @@ _PyCore_ObjectMalloc_SetHooks( void *(*malloc_func)(size_t),
 }
 
 void
-_PyCore_ObjectMalloc_FetchHooks( void *(**malloc_funcp)(size_t),
-                                void *(**calloc_funcp)(size_t, size_t),
-                                void *(**realloc_funcp)(void *, size_t),
-                                void (**free_funcp)(void *) )
+_PyMalloc_FetchHooks( void *(**malloc_funcp)(size_t),
+                     void *(**calloc_funcp)(size_t, size_t),
+                     void *(**realloc_funcp)(void *, size_t),
+                     void (**free_funcp)(void *) )
 {
        LOCK();
        *malloc_funcp = malloc_hook;