diff options
| author | Peter Schneider-Kamp <nowonder@nowonder.de> | 2000-07-31 22:19:30 +0000 | 
|---|---|---|
| committer | Peter Schneider-Kamp <nowonder@nowonder.de> | 2000-07-31 22:19:30 +0000 | 
| commit | 25f68944c20a3a37da6776277057c2d19a80211f (patch) | |
| tree | c271e544f83b111f29907a7613bbaed03a8df40e /Include | |
| parent | b88b0bce2a0733a53218b23f6ddfcd7626f1f4f1 (diff) | |
| download | cpython-git-25f68944c20a3a37da6776277057c2d19a80211f.tar.gz | |
patch from Vladimir (move Py_Mem* interface to Include/pymem.h)
Diffstat (limited to 'Include')
| -rw-r--r-- | Include/Python.h | 2 | ||||
| -rw-r--r-- | Include/mymalloc.h | 5 | ||||
| -rw-r--r-- | Include/mymath.h | 10 | ||||
| -rw-r--r-- | Include/myproto.h | 12 | ||||
| -rw-r--r-- | Include/myselect.h | 12 | ||||
| -rw-r--r-- | Include/mytime.h | 12 | ||||
| -rw-r--r-- | Include/objimpl.h | 5 | ||||
| -rw-r--r-- | Include/pgenheaders.h | 2 | ||||
| -rw-r--r-- | Include/pymem.h | 179 | ||||
| -rw-r--r-- | Include/pyport.h | 159 | 
10 files changed, 221 insertions, 177 deletions
diff --git a/Include/Python.h b/Include/Python.h index f89f3e7821..b994401a52 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -54,6 +54,8 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.  #include "pyport.h" +#include "pymem.h" +  #include "object.h"  #include "objimpl.h" diff --git a/Include/mymalloc.h b/Include/mymalloc.h index 2af58e450f..8dadb66a79 100644 --- a/Include/mymalloc.h +++ b/Include/mymalloc.h @@ -1,5 +1,3 @@ -#ifndef Py_MYMALLOC_H -#define Py_MYMALLOC_H  /***********************************************************  Copyright (c) 2000, BeOpen.com.  Copyright (c) 1995-2000, Corporation for National Research Initiatives. @@ -15,6 +13,9 @@ THIS FILE IS OBSOLETE  USE "pyport.h" INSTEAD  ***************************************/ +#ifndef Py_MYMALLOC_H +#define Py_MYMALLOC_H +  /* Lowest-level memory allocation interface */  #define ANY void /* For API compatibility only. Obsolete, do not use. */ diff --git a/Include/mymath.h b/Include/mymath.h index 1bfd6ddd44..27f301d5e4 100644 --- a/Include/mymath.h +++ b/Include/mymath.h @@ -1,3 +1,13 @@ +/*********************************************************** +Copyright (c) 2000, BeOpen.com. +Copyright (c) 1995-2000, Corporation for National Research Initiatives. +Copyright (c) 1990-1995, Stichting Mathematisch Centrum. +All rights reserved. + +See the file "Misc/COPYRIGHT" for information on usage and +redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. +******************************************************************/ +  /***************************************  THIS FILE IS OBSOLETE  USE "pyport.h" INSTEAD diff --git a/Include/myproto.h b/Include/myproto.h index 94be8df08e..5d25d2c8b0 100644 --- a/Include/myproto.h +++ b/Include/myproto.h @@ -1,9 +1,3 @@ -#ifndef Py_PROTO_H -#define Py_PROTO_H -#ifdef __cplusplus -extern "C" { -#endif -  /***********************************************************  Copyright (c) 2000, BeOpen.com.  Copyright (c) 1995-2000, Corporation for National Research Initiatives. @@ -19,6 +13,12 @@ THIS FILE IS OBSOLETE  DON'T USE Py_PROTO or Py_FPROTO anymore.  ***************************************/ +#ifndef Py_PROTO_H +#define Py_PROTO_H +#ifdef __cplusplus +extern "C" { +#endif +  #ifdef HAVE_PROTOTYPES  #define Py_PROTO(x) x  #else diff --git a/Include/myselect.h b/Include/myselect.h index 53e924d107..3562af8c42 100644 --- a/Include/myselect.h +++ b/Include/myselect.h @@ -1,9 +1,3 @@ -#ifndef Py_MYSELECT_H -#define Py_MYSELECT_H -#ifdef __cplusplus -extern "C" { -#endif -  /***********************************************************  Copyright (c) 2000, BeOpen.com.  Copyright (c) 1995-2000, Corporation for National Research Initiatives. @@ -19,6 +13,12 @@ THIS FILE IS OBSOLETE  USE "pyport.h" INSTEAD  ***************************************/ +#ifndef Py_MYSELECT_H +#define Py_MYSELECT_H +#ifdef __cplusplus +extern "C" { +#endif +  /* Include file for users of select() */  /* NB caller must include <sys/types.h> */ diff --git a/Include/mytime.h b/Include/mytime.h index bfad575682..07a2480edc 100644 --- a/Include/mytime.h +++ b/Include/mytime.h @@ -1,9 +1,3 @@ -#ifndef Py_MYTIME_H -#define Py_MYTIME_H -#ifdef __cplusplus -extern "C" { -#endif -  /***********************************************************  Copyright (c) 2000, BeOpen.com.  Copyright (c) 1995-2000, Corporation for National Research Initiatives. @@ -19,6 +13,12 @@ THIS FILE IS OBSOLETE  USE "pyport.h" INSTEAD  ***************************************/ +#ifndef Py_MYTIME_H +#define Py_MYTIME_H +#ifdef __cplusplus +extern "C" { +#endif +  /* Include file instead of <time.h> and/or <sys/time.h> */  #ifdef TIME_WITH_SYS_TIME diff --git a/Include/objimpl.h b/Include/objimpl.h index 3c0c7fc895..0fd813df3e 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -10,12 +10,13 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.  #ifndef Py_OBJIMPL_H  #define Py_OBJIMPL_H + +#include "pymem.h" +  #ifdef __cplusplus  extern "C" {  #endif -#include "pyport.h" -  /*  Functions and macros for modules that implement new object types.  You must first include "object.h". diff --git a/Include/pgenheaders.h b/Include/pgenheaders.h index 15e9861933..0b2e4ce6ce 100644 --- a/Include/pgenheaders.h +++ b/Include/pgenheaders.h @@ -30,7 +30,7 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.  #include <stdlib.h>  #endif -#include "pyport.h" +#include "pymem.h"  #include "pydebug.h" diff --git a/Include/pymem.h b/Include/pymem.h new file mode 100644 index 0000000000..adcc7399ce --- /dev/null +++ b/Include/pymem.h @@ -0,0 +1,179 @@ +/*********************************************************** +Copyright (c) 2000, BeOpen.com. +Copyright (c) 1995-2000, Corporation for National Research Initiatives. +Copyright (c) 1990-1995, Stichting Mathematisch Centrum. +All rights reserved. + +See the file "Misc/COPYRIGHT" for information on usage and +redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES. +******************************************************************/ + +/* Lowest-level memory allocation interface */ + +#ifndef Py_PYMEM_H +#define Py_PYMEM_H + +#include "pyport.h" + +#ifdef __cplusplus +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. + +   See the comment block at the end of this file for two scenarios +   showing how to use this to use a different allocator. */ + +#ifndef PyCore_MALLOC_FUNC +#undef PyCore_REALLOC_FUNC +#undef PyCore_FREE_FUNC +#define PyCore_MALLOC_FUNC      malloc +#define PyCore_REALLOC_FUNC     realloc +#define PyCore_FREE_FUNC        free +#endif + +#ifndef PyCore_MALLOC_PROTO +#undef PyCore_REALLOC_PROTO +#undef PyCore_FREE_PROTO +#define PyCore_MALLOC_PROTO    (size_t) +#define PyCore_REALLOC_PROTO   (void *, size_t) +#define PyCore_FREE_PROTO      (void *) +#endif + +#ifdef NEED_TO_DECLARE_MALLOC_AND_FRIEND +extern void *PyCore_MALLOC_FUNC PyCore_MALLOC_PROTO; +extern void *PyCore_REALLOC_FUNC PyCore_REALLOC_PROTO; +extern void PyCore_FREE_FUNC PyCore_FREE_PROTO; +#endif + +#ifndef PyCore_MALLOC +#undef PyCore_REALLOC +#undef PyCore_FREE +#define PyCore_MALLOC(n)        PyCore_MALLOC_FUNC(n) +#define PyCore_REALLOC(p, n)    PyCore_REALLOC_FUNC((p), (n)) +#define PyCore_FREE(p)          PyCore_FREE_FUNC(p) +#endif + +/* BEWARE: + +   Each interface exports both functions and macros. Extension modules +   should normally use the functions for ensuring binary compatibility +   of the user's code across Python versions. Subsequently, if the +   Python runtime switches to its own malloc (different from standard +   malloc), no recompilation is required for the extensions. + +   The macro versions trade compatibility for speed. They can be used +   whenever there is a performance problem, but their use implies +   recompilation of the code for each new Python release. The Python +   core uses the macros because it *is* compiled on every upgrade. +   This might not be the case with 3rd party extensions in a custom +   setup (for example, a customer does not always have access to the +   source of 3rd party deliverables). You have been warned! */ + +/* + * Raw memory interface + * ==================== + */ + +/* Functions */ + +/* Function wrappers around PyCore_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 +   doesn't. Returned pointers must be checked for NULL explicitly. +   No action is performed on failure. */ +extern DL_IMPORT(void *) PyMem_Malloc(size_t); +extern DL_IMPORT(void *) PyMem_Realloc(void *, size_t); +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)) + +/* + * Type-oriented memory interface + * ============================== + */ + +/* Functions */ +#define PyMem_New(type, n) \ +	( (type *) PyMem_Malloc((n) * sizeof(type)) ) +#define PyMem_Resize(p, type, n) \ +	( (p) = (type *) PyMem_Realloc((n) * sizeof(type)) ) +#define PyMem_Del(p) PyMem_Free(p) + +/* Macros */ +#define PyMem_NEW(type, n) \ +	( (type *) PyMem_MALLOC(_PyMem_EXTRA + (n) * sizeof(type)) ) +#define PyMem_RESIZE(p, type, n) \ +	if ((p) == NULL) \ +		(p) = (type *)(PyMem_MALLOC( \ +				    _PyMem_EXTRA + (n) * sizeof(type))); \ +	else \ +		(p) = (type *)(PyMem_REALLOC((p), \ +				    _PyMem_EXTRA + (n) * sizeof(type))) +#define PyMem_DEL(p) PyMem_FREE(p) + +/* PyMem_XDEL is deprecated. To avoid the call when p is NULL, +   it is recommended to write the test explicitly in the code. +   Note that according to ANSI C, free(NULL) has no effect. */ + +#ifdef __cplusplus +} +#endif + +/* SCENARIOS + +   Here are two scenarios by Vladimir Marangozov (the author of the +   memory allocation redesign). + +   1) Scenario A + +   Suppose you want to use a debugging malloc library that collects info on +   where the malloc calls originate from. Assume the interface is: + +   d_malloc(size_t n, char* src_file, unsigned long src_line) c.s. + +   In this case, you would define (for example in config.h) : + +   #define PyCore_MALLOC_FUNC      d_malloc +   ... +   #define PyCore_MALLOC_PROTO	(size_t, char *, unsigned long) +   ... +   #define NEED_TO_DECLARE_MALLOC_AND_FRIEND + +   #define PyCore_MALLOC(n)	PyCore_MALLOC_FUNC((n), __FILE__, __LINE__) +   ... + +   2) Scenario B + +   Suppose you want to use malloc hooks (defined & initialized in a 3rd party +   malloc library) instead of malloc functions.  In this case, you would +   define: + +   #define PyCore_MALLOC_FUNC	(*malloc_hook) +   ... +   #define NEED_TO_DECLARE_MALLOC_AND_FRIEND + +   and ignore the previous definitions about PyCore_MALLOC_FUNC, etc. + + +*/ + + +#endif /* !Py_PYMEM_H */ diff --git a/Include/pyport.h b/Include/pyport.h index 6026a2bcf2..f6357039b8 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -9,6 +9,8 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.  #ifndef Py_PYPORT_H  #define Py_PYPORT_H +#include "config.h" /* include for defines */ +  /**************************************************************************  Symbols and macros to supply platform-independent interfaces to basic  C language & library operations whose spellings vary across platforms. @@ -220,9 +222,9 @@ extern double hypot(double, double);  #endif  -/*********************************** - * WRAPPER FOR malloc/realloc/free * - ***********************************/ +/************************************ + * MALLOC COMPATIBILITY FOR pymem.h * + ************************************/  #ifndef DL_IMPORT       /* declarations for DLL import */  #define DL_IMPORT(RTYPE) RTYPE @@ -240,157 +242,6 @@ extern double hypot(double, double);  #define _PyMem_EXTRA 0  #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. - -   See the comment block at the end of this file for two scenarios -   showing how to use this to use a different allocator. */ - -#ifndef PyCore_MALLOC_FUNC -#undef PyCore_REALLOC_FUNC -#undef PyCore_FREE_FUNC -#define PyCore_MALLOC_FUNC      malloc -#define PyCore_REALLOC_FUNC     realloc -#define PyCore_FREE_FUNC        free -#endif - -#ifndef PyCore_MALLOC_PROTO -#undef PyCore_REALLOC_PROTO -#undef PyCore_FREE_PROTO -#define PyCore_MALLOC_PROTO    (size_t) -#define PyCore_REALLOC_PROTO   (void *, size_t) -#define PyCore_FREE_PROTO      (void *) -#endif - -#ifdef NEED_TO_DECLARE_MALLOC_AND_FRIEND -extern void *PyCore_MALLOC_FUNC PyCore_MALLOC_PROTO; -extern void *PyCore_REALLOC_FUNC PyCore_REALLOC_PROTO; -extern void PyCore_FREE_FUNC PyCore_FREE_PROTO; -#endif - -#ifndef PyCore_MALLOC -#undef PyCore_REALLOC -#undef PyCore_FREE -#define PyCore_MALLOC(n)        PyCore_MALLOC_FUNC(n) -#define PyCore_REALLOC(p, n)    PyCore_REALLOC_FUNC((p), (n)) -#define PyCore_FREE(p)          PyCore_FREE_FUNC(p) -#endif - -/* BEWARE: - -   Each interface exports both functions and macros. Extension modules -   should normally use the functions for ensuring binary compatibility -   of the user's code across Python versions. Subsequently, if the -   Python runtime switches to its own malloc (different from standard -   malloc), no recompilation is required for the extensions. - -   The macro versions trade compatibility for speed. They can be used -   whenever there is a performance problem, but their use implies -   recompilation of the code for each new Python release. The Python -   core uses the macros because it *is* compiled on every upgrade. -   This might not be the case with 3rd party extensions in a custom -   setup (for example, a customer does not always have access to the -   source of 3rd party deliverables). You have been warned! */ - -/* - * Raw memory interface - * ==================== - */ - -/* Functions */ - -/* Function wrappers around PyCore_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 -   doesn't. Returned pointers must be checked for NULL explicitly. -   No action is performed on failure. */ -extern DL_IMPORT(void *) PyMem_Malloc(size_t); -extern DL_IMPORT(void *) PyMem_Realloc(void *, size_t); -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)) - -/* - * Type-oriented memory interface - * ============================== - */ - -/* Functions */ -#define PyMem_New(type, n) \ -	( (type *) PyMem_Malloc((n) * sizeof(type)) ) -#define PyMem_Resize(p, type, n) \ -	( (p) = (type *) PyMem_Realloc((n) * sizeof(type)) ) -#define PyMem_Del(p) PyMem_Free(p) - -/* Macros */ -#define PyMem_NEW(type, n) \ -	( (type *) PyMem_MALLOC(_PyMem_EXTRA + (n) * sizeof(type)) ) -#define PyMem_RESIZE(p, type, n) \ -	if ((p) == NULL) \ -		(p) = (type *)(PyMem_MALLOC( \ -				    _PyMem_EXTRA + (n) * sizeof(type))); \ -	else \ -		(p) = (type *)(PyMem_REALLOC((p), \ -				    _PyMem_EXTRA + (n) * sizeof(type))) -#define PyMem_DEL(p) PyMem_FREE(p) - -/* PyMem_XDEL is deprecated. To avoid the call when p is NULL, -   it is recommended to write the test explicitly in the code. -   Note that according to ANSI C, free(NULL) has no effect. */ - -/* SCENARIOS - -   Here are two scenarios by Vladimir Marangozov (the author of the -   memory allocation redesign). - -   1) Scenario A - -   Suppose you want to use a debugging malloc library that collects info on -   where the malloc calls originate from. Assume the interface is: - -   d_malloc(size_t n, char* src_file, unsigned long src_line) c.s. - -   In this case, you would define (for example in config.h) : - -   #define PyCore_MALLOC_FUNC      d_malloc -   ... -   #define PyCore_MALLOC_PROTO	(size_t, char *, unsigned long) -   ... -   #define NEED_TO_DECLARE_MALLOC_AND_FRIEND - -   #define PyCore_MALLOC(n)	PyCore_MALLOC_FUNC((n), __FILE__, __LINE__) -   ... - -   2) Scenario B - -   Suppose you want to use malloc hooks (defined & initialized in a 3rd party -   malloc library) instead of malloc functions.  In this case, you would -   define: - -   #define PyCore_MALLOC_FUNC	(*malloc_hook) -   ... -   #define NEED_TO_DECLARE_MALLOC_AND_FRIEND - -   and ignore the previous definitions about PyCore_MALLOC_FUNC, etc. - - -*/  /********************************************   * WRAPPER FOR <time.h> and/or <sys/time.h> *  | 
