Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
ef9b47f0
Kaydet (Commit)
ef9b47f0
authored
Tem 07, 2013
tarafından
Raymond Hettinger
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Sade Fark
merge
üst
f3a67b7e
725e668a
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
447 additions
and
90 deletions
+447
-90
memory.rst
Doc/c-api/memory.rst
+170
-1
3.4.rst
Doc/whatsnew/3.4.rst
+4
-14
objimpl.h
Include/objimpl.h
+28
-34
pymem.h
Include/pymem.h
+74
-20
NEWS
Misc/NEWS
+7
-0
_testcapimodule.c
Modules/_testcapimodule.c
+163
-0
object.c
Objects/object.c
+0
-20
obmalloc.c
Objects/obmalloc.c
+0
-0
python.vcxproj
PCbuild/python.vcxproj
+1
-1
No files found.
Doc/c-api/memory.rst
Dosyayı görüntüle @
ef9b47f0
...
...
@@ -84,6 +84,48 @@ the C library allocator as shown in the previous example, the allocated memory
for the I/O buffer escapes completely the Python memory manager.
Raw Memory Interface
====================
The following function sets are wrappers to the system allocator. These
functions are thread-safe, the :term:`GIL <global interpreter lock>` does not
need to be held.
The default raw memory block allocator uses the following functions:
:c:func:`malloc`, :c:func:`realloc` and :c:func:`free`; call ``malloc(1)`` when
requesting zero bytes.
.. versionadded:: 3.4
.. c:function:: void* PyMem_RawMalloc(size_t n)
Allocates *n* bytes and returns a pointer of type :c:type:`void\*` to the
allocated memory, or *NULL* if the request fails. Requesting zero bytes
returns a distinct non-*NULL* pointer if possible, as if
``PyMem_RawMalloc(1)`` had been called instead. The memory will not have
been initialized in any way.
.. c:function:: void* PyMem_RawRealloc(void *p, size_t n)
Resizes the memory block pointed to by *p* to *n* bytes. The contents will
be unchanged to the minimum of the old and the new sizes. If *p* is *NULL*,
the call is equivalent to ``PyMem_RawMalloc(n)``; else if *n* is equal to
zero, the memory block is resized but is not freed, and the returned pointer
is non-*NULL*. Unless *p* is *NULL*, it must have been returned by a
previous call to :c:func:`PyMem_RawMalloc` or :c:func:`PyMem_RawRealloc`. If
the request fails, :c:func:`PyMem_RawRealloc` returns *NULL* and *p* remains
a valid pointer to the previous memory area.
.. c:function:: void PyMem_RawFree(void *p)
Frees the memory block pointed to by *p*, which must have been returned by a
previous call to :c:func:`PyMem_RawMalloc` or :c:func:`PyMem_RawRealloc`.
Otherwise, or if ``PyMem_Free(p)`` has been called before, undefined
behavior occurs. If *p* is *NULL*, no operation is performed.
.. _memoryinterface:
Memory Interface
...
...
@@ -91,8 +133,16 @@ Memory Interface
The following function sets, modeled after the ANSI C standard, but specifying
behavior when requesting zero bytes, are available for allocating and releasing
memory from the Python heap:
memory from the Python heap.
The default memory block allocator uses the following functions:
:c:func:`malloc`, :c:func:`realloc` and :c:func:`free`; call ``malloc(1)`` when
requesting zero bytes.
.. warning::
The :term:`GIL <global interpreter lock>` must be held when using these
functions.
.. c:function:: void* PyMem_Malloc(size_t n)
...
...
@@ -155,6 +205,125 @@ versions and is therefore deprecated in extension modules.
:c:func:`PyMem_NEW`, :c:func:`PyMem_RESIZE`, :c:func:`PyMem_DEL`.
Customize Memory Allocators
===========================
.. versionadded:: 3.4
.. c:type:: PyMemAllocator
Structure used to describe a memory block allocator. The structure has
four fields:
+----------------------------------------------------------+---------------------------------------+
| Field | Meaning |
+==========================================================+=======================================+
| ``void *ctx`` | user context passed as first argument |
+----------------------------------------------------------+---------------------------------------+
| ``void* malloc(void *ctx, size_t size)`` | allocate a memory block |
+----------------------------------------------------------+---------------------------------------+
| ``void* realloc(void *ctx, void *ptr, size_t new_size)`` | allocate or resize a memory block |
+----------------------------------------------------------+---------------------------------------+
| ``void free(void *ctx, void *ptr)`` | free a memory block |
+----------------------------------------------------------+---------------------------------------+
.. c:type:: PyMemAllocatorDomain
Enum used to identify an allocator domain. Domains:
* :c:data:`PYMEM_DOMAIN_RAW`: functions :c:func:`PyMem_RawMalloc`,
:c:func:`PyMem_RawRealloc` and :c:func:`PyMem_RawFree`
* :c:data:`PYMEM_DOMAIN_MEM`: functions :c:func:`PyMem_Malloc`,
:c:func:`PyMem_Realloc` and :c:func:`PyMem_Free`
* :c:data:`PYMEM_DOMAIN_OBJ`: functions :c:func:`PyObject_Malloc`,
:c:func:`PyObject_Realloc` and :c:func:`PyObject_Free`
.. c:function:: void PyMem_GetAllocator(PyMemAllocatorDomain domain, PyMemAllocator *allocator)
Get the memory block allocator of the specified domain.
.. c:function:: void PyMem_SetAllocator(PyMemAllocatorDomain domain, PyMemAllocator *allocator)
Set the memory block allocator of the specified domain.
The new allocator must return a distinct non-NULL pointer when requesting
zero bytes.
For the :c:data:`PYMEM_DOMAIN_RAW` domain, the allocator must be
thread-safe: the :term:`GIL <global interpreter lock>` is not held when the
allocator is called.
If the new allocator is not a hook (does not call the previous allocator),
the :c:func:`PyMem_SetupDebugHooks` function must be called to reinstall the
debug hooks on top on the new allocator.
.. c:function:: void PyMem_SetupDebugHooks(void)
Setup hooks to detect bugs in the following Python memory allocator
functions:
- :c:func:`PyMem_RawMalloc`, :c:func:`PyMem_RawRealloc`,
:c:func:`PyMem_RawFree`
- :c:func:`PyMem_Malloc`, :c:func:`PyMem_Realloc`, :c:func:`PyMem_Free`
- :c:func:`PyObject_Malloc`, :c:func:`PyObject_Realloc`,
:c:func:`PyObject_Free`
Newly allocated memory is filled with the byte ``0xCB``, freed memory is
filled with the byte ``0xDB``. Additionnal checks:
- detect API violations, ex: :c:func:`PyObject_Free` called on a buffer
allocated by :c:func:`PyMem_Malloc`
- detect write before the start of the buffer (buffer underflow)
- detect write after the end of the buffer (buffer overflow)
The function does nothing if Python is not compiled is debug mode.
Customize PyObject Arena Allocator
==================================
Python has a *pymalloc* allocator for allocations smaller than 512 bytes. This
allocator is optimized for small objects with a short lifetime. It uses memory
mappings called "arenas" with a fixed size of 256 KB. It falls back to
:c:func:`PyMem_Malloc` and :c:func:`PyMem_Realloc` for allocations larger than
512 bytes. *pymalloc* is the default allocator used by
:c:func:`PyObject_Malloc`.
The default arena allocator uses the following functions:
* :c:func:`VirtualAlloc` and :c:func:`VirtualFree` on Windows,
* :c:func:`mmap` and :c:func:`munmap` if available,
* :c:func:`malloc` and :c:func:`free` otherwise.
.. versionadded:: 3.4
.. c:type:: PyObjectArenaAllocator
Structure used to describe an arena allocator. The structure has
three fields:
+--------------------------------------------------+---------------------------------------+
| Field | Meaning |
+==================================================+=======================================+
| ``void *ctx`` | user context passed as first argument |
+--------------------------------------------------+---------------------------------------+
| ``void* alloc(void *ctx, size_t size)`` | allocate an arena of size bytes |
+--------------------------------------------------+---------------------------------------+
| ``void free(void *ctx, size_t size, void *ptr)`` | free an arena |
+--------------------------------------------------+---------------------------------------+
.. c:function:: PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator)
Get the arena allocator.
.. c:function:: PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator)
Set the arena allocator.
.. _memoryexamples:
Examples
...
...
Doc/whatsnew/3.4.rst
Dosyayı görüntüle @
ef9b47f0
...
...
@@ -112,21 +112,11 @@ Security improvements:
Please read on for a comprehensive list of user-facing changes.
.. PEP-sized items next.
.. _pep-4XX:
.. PEP 4XX: Example PEP
.. ====================
.. (Implemented by Foo Bar.)
.. .. seealso::
:pep:`4XX` - Example PEP
PEP written by Example Author
PEP 445: Add new APIs to customize Python memory allocators
===========================================================
The :pep:`445` adds new Application Programming Interfaces (API) to customize
Python memory allocators.
...
...
Include/objimpl.h
Dosyayı görüntüle @
ef9b47f0
...
...
@@ -94,9 +94,9 @@ PyObject_{New, NewVar, Del}.
the object gets initialized via PyObject_{Init, InitVar} after obtaining
the raw memory.
*/
PyAPI_FUNC
(
void
*
)
PyObject_Malloc
(
size_t
);
PyAPI_FUNC
(
void
*
)
PyObject_Realloc
(
void
*
,
size_t
);
PyAPI_FUNC
(
void
)
PyObject_Free
(
void
*
);
PyAPI_FUNC
(
void
*
)
PyObject_Malloc
(
size_t
size
);
PyAPI_FUNC
(
void
*
)
PyObject_Realloc
(
void
*
ptr
,
size_t
new_size
);
PyAPI_FUNC
(
void
)
PyObject_Free
(
void
*
ptr
);
/* This function returns the number of allocated memory blocks, regardless of size */
PyAPI_FUNC
(
Py_ssize_t
)
_Py_GetAllocatedBlocks
(
void
);
...
...
@@ -106,41 +106,15 @@ PyAPI_FUNC(Py_ssize_t) _Py_GetAllocatedBlocks(void);
#ifndef Py_LIMITED_API
PyAPI_FUNC
(
void
)
_PyObject_DebugMallocStats
(
FILE
*
out
);
#endif
/* #ifndef Py_LIMITED_API */
#ifdef PYMALLOC_DEBUG
/* WITH_PYMALLOC && PYMALLOC_DEBUG */
PyAPI_FUNC
(
void
*
)
_PyObject_DebugMalloc
(
size_t
nbytes
);
PyAPI_FUNC
(
void
*
)
_PyObject_DebugRealloc
(
void
*
p
,
size_t
nbytes
);
PyAPI_FUNC
(
void
)
_PyObject_DebugFree
(
void
*
p
);
PyAPI_FUNC
(
void
)
_PyObject_DebugDumpAddress
(
const
void
*
p
);
PyAPI_FUNC
(
void
)
_PyObject_DebugCheckAddress
(
const
void
*
p
);
PyAPI_FUNC
(
void
*
)
_PyObject_DebugMallocApi
(
char
api
,
size_t
nbytes
);
PyAPI_FUNC
(
void
*
)
_PyObject_DebugReallocApi
(
char
api
,
void
*
p
,
size_t
nbytes
);
PyAPI_FUNC
(
void
)
_PyObject_DebugFreeApi
(
char
api
,
void
*
p
);
PyAPI_FUNC
(
void
)
_PyObject_DebugCheckAddressApi
(
char
api
,
const
void
*
p
);
PyAPI_FUNC
(
void
*
)
_PyMem_DebugMalloc
(
size_t
nbytes
);
PyAPI_FUNC
(
void
*
)
_PyMem_DebugRealloc
(
void
*
p
,
size_t
nbytes
);
PyAPI_FUNC
(
void
)
_PyMem_DebugFree
(
void
*
p
);
#define PyObject_MALLOC _PyObject_DebugMalloc
#define PyObject_Malloc _PyObject_DebugMalloc
#define PyObject_REALLOC _PyObject_DebugRealloc
#define PyObject_Realloc _PyObject_DebugRealloc
#define PyObject_FREE _PyObject_DebugFree
#define PyObject_Free _PyObject_DebugFree
#else
/* WITH_PYMALLOC && ! PYMALLOC_DEBUG */
#endif
/* Macros */
#define PyObject_MALLOC PyObject_Malloc
#define PyObject_REALLOC PyObject_Realloc
#define PyObject_FREE PyObject_Free
#endif
#else
/* ! WITH_PYMALLOC */
#define PyObject_MALLOC PyMem_MALLOC
#define PyObject_REALLOC PyMem_REALLOC
#define PyObject_FREE PyMem_FREE
#endif
/* WITH_PYMALLOC */
#define PyObject_Del PyObject_Free
#define PyObject_DEL PyObject_FREE
#define PyObject_DEL PyObject_Free
/*
* Generic object allocator interface
...
...
@@ -224,6 +198,26 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t);
constructor you would start directly with PyObject_Init/InitVar
*/
#ifndef Py_LIMITED_API
typedef
struct
{
/* user context passed as the first argument to the 2 functions */
void
*
ctx
;
/* allocate an arena of size bytes */
void
*
(
*
alloc
)
(
void
*
ctx
,
size_t
size
);
/* free an arena */
void
(
*
free
)
(
void
*
ctx
,
void
*
ptr
,
size_t
size
);
}
PyObjectArenaAllocator
;
/* Get the arena allocator. */
PyAPI_FUNC
(
void
)
PyObject_GetArenaAllocator
(
PyObjectArenaAllocator
*
allocator
);
/* Set the arena allocator. */
PyAPI_FUNC
(
void
)
PyObject_SetArenaAllocator
(
PyObjectArenaAllocator
*
allocator
);
#endif
/*
* Garbage Collection Support
* ==========================
...
...
Include/pymem.h
Dosyayı görüntüle @
ef9b47f0
...
...
@@ -11,6 +11,11 @@
extern
"C"
{
#endif
PyAPI_FUNC
(
void
*
)
PyMem_RawMalloc
(
size_t
size
);
PyAPI_FUNC
(
void
*
)
PyMem_RawRealloc
(
void
*
ptr
,
size_t
new_size
);
PyAPI_FUNC
(
void
)
PyMem_RawFree
(
void
*
ptr
);
/* BEWARE:
Each interface exports both functions and macros. Extension modules should
...
...
@@ -49,21 +54,11 @@ extern "C" {
performed on failure (no exception is set, no warning is printed, etc).
*/
PyAPI_FUNC
(
void
*
)
PyMem_Malloc
(
size_t
);
PyAPI_FUNC
(
void
*
)
PyMem_Realloc
(
void
*
,
size_t
);
PyAPI_FUNC
(
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. */
PyAPI_FUNC
(
void
*
)
PyMem_Malloc
(
size_t
size
);
PyAPI_FUNC
(
void
*
)
PyMem_Realloc
(
void
*
ptr
,
size_t
new_size
);
PyAPI_FUNC
(
void
)
PyMem_Free
(
void
*
ptr
);
/* Macros. */
#ifdef PYMALLOC_DEBUG
/* Redirect all memory operations to Python's debugging allocator. */
#define PyMem_MALLOC _PyMem_DebugMalloc
#define PyMem_REALLOC _PyMem_DebugRealloc
#define PyMem_FREE _PyMem_DebugFree
#else
/* ! PYMALLOC_DEBUG */
/* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL
for malloc(0), which would be treated as an error. Some platforms
...
...
@@ -71,13 +66,9 @@ PyAPI_FUNC(void) PyMem_Free(void *);
pymalloc. To solve these problems, allocate an extra byte. */
/* Returns NULL to indicate error if a negative size or size larger than
Py_ssize_t can represent is supplied. Helps prevents security holes. */
#define PyMem_MALLOC(n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \
: malloc((n) ? (n) : 1))
#define PyMem_REALLOC(p, n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \
: realloc((p), (n) ? (n) : 1))
#define PyMem_FREE free
#endif
/* PYMALLOC_DEBUG */
#define PyMem_MALLOC(n) PyMem_Malloc(n)
#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n)
#define PyMem_FREE(p) PyMem_Free(p)
/*
* Type-oriented memory interface
...
...
@@ -115,6 +106,69 @@ PyAPI_FUNC(void) PyMem_Free(void *);
#define PyMem_Del PyMem_Free
#define PyMem_DEL PyMem_FREE
#ifndef Py_LIMITED_API
typedef
enum
{
/* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */
PYMEM_DOMAIN_RAW
,
/* PyMem_Malloc(), PyMem_Realloc() and PyMem_Free() */
PYMEM_DOMAIN_MEM
,
/* PyObject_Malloc(), PyObject_Realloc() and PyObject_Free() */
PYMEM_DOMAIN_OBJ
}
PyMemAllocatorDomain
;
typedef
struct
{
/* user context passed as the first argument to the 3 functions */
void
*
ctx
;
/* allocate a memory block */
void
*
(
*
malloc
)
(
void
*
ctx
,
size_t
size
);
/* allocate or resize a memory block */
void
*
(
*
realloc
)
(
void
*
ctx
,
void
*
ptr
,
size_t
new_size
);
/* release a memory block */
void
(
*
free
)
(
void
*
ctx
,
void
*
ptr
);
}
PyMemAllocator
;
/* Get the memory block allocator of the specified domain. */
PyAPI_FUNC
(
void
)
PyMem_GetAllocator
(
PyMemAllocatorDomain
domain
,
PyMemAllocator
*
allocator
);
/* Set the memory block allocator of the specified domain.
The new allocator must return a distinct non-NULL pointer when requesting
zero bytes.
For the PYMEM_DOMAIN_RAW domain, the allocator must be thread-safe: the GIL
is not held when the allocator is called.
If the new allocator is not a hook (don't call the previous allocator), the
PyMem_SetupDebugHooks() function must be called to reinstall the debug hooks
on top on the new allocator. */
PyAPI_FUNC
(
void
)
PyMem_SetAllocator
(
PyMemAllocatorDomain
domain
,
PyMemAllocator
*
allocator
);
/* Setup hooks to detect bugs in the following Python memory allocator
functions:
- PyMem_RawMalloc(), PyMem_RawRealloc(), PyMem_RawFree()
- PyMem_Malloc(), PyMem_Realloc(), PyMem_Free()
- PyObject_Malloc(), PyObject_Realloc() and PyObject_Free()
Newly allocated memory is filled with the byte 0xCB, freed memory is filled
with the byte 0xDB. Additionnal checks:
- detect API violations, ex: PyObject_Free() called on a buffer allocated
by PyMem_Malloc()
- detect write before the start of the buffer (buffer underflow)
- detect write after the end of the buffer (buffer overflow)
The function does nothing if Python is not compiled is debug mode. */
PyAPI_FUNC
(
void
)
PyMem_SetupDebugHooks
(
void
);
#endif
#ifdef __cplusplus
}
#endif
...
...
Misc/NEWS
Dosyayı görüntüle @
ef9b47f0
...
...
@@ -10,6 +10,13 @@ What's New in Python 3.4.0 Alpha 1?
Core and Builtins
-----------------
- Issue #17206: On Windows, increase the stack size from 2 MB to 4.2 MB to fix
a stack overflow in the marshal module (fix a crash in test_marshal).
Patch written by Jeremy Kloth.
- Issue #3329: Implement the PEP 445: Add new APIs to customize Python memory
allocators.
- Issue #18328: Reorder ops in PyThreadState_Delete*() functions. Now the
tstate is first removed from TLS and then deallocated.
...
...
Modules/_testcapimodule.c
Dosyayı görüntüle @
ef9b47f0
...
...
@@ -2511,6 +2511,161 @@ test_decref_doesnt_leak(PyObject *ob)
Py_RETURN_NONE
;
}
static
PyObject
*
test_pymem_alloc0
(
PyObject
*
self
)
{
void
*
ptr
;
ptr
=
PyMem_Malloc
(
0
);
if
(
ptr
==
NULL
)
{
PyErr_SetString
(
PyExc_RuntimeError
,
"PyMem_Malloc(0) returns NULL"
);
return
NULL
;
}
PyMem_Free
(
ptr
);
ptr
=
PyObject_Malloc
(
0
);
if
(
ptr
==
NULL
)
{
PyErr_SetString
(
PyExc_RuntimeError
,
"PyObject_Malloc(0) returns NULL"
);
return
NULL
;
}
PyObject_Free
(
ptr
);
Py_RETURN_NONE
;
}
typedef
struct
{
PyMemAllocator
alloc
;
size_t
malloc_size
;
void
*
realloc_ptr
;
size_t
realloc_new_size
;
void
*
free_ptr
;
}
alloc_hook_t
;
static
void
*
hook_malloc
(
void
*
ctx
,
size_t
size
)
{
alloc_hook_t
*
hook
=
(
alloc_hook_t
*
)
ctx
;
hook
->
malloc_size
=
size
;
return
hook
->
alloc
.
malloc
(
hook
->
alloc
.
ctx
,
size
);
}
static
void
*
hook_realloc
(
void
*
ctx
,
void
*
ptr
,
size_t
new_size
)
{
alloc_hook_t
*
hook
=
(
alloc_hook_t
*
)
ctx
;
hook
->
realloc_ptr
=
ptr
;
hook
->
realloc_new_size
=
new_size
;
return
hook
->
alloc
.
realloc
(
hook
->
alloc
.
ctx
,
ptr
,
new_size
);
}
static
void
hook_free
(
void
*
ctx
,
void
*
ptr
)
{
alloc_hook_t
*
hook
=
(
alloc_hook_t
*
)
ctx
;
hook
->
free_ptr
=
ptr
;
hook
->
alloc
.
free
(
hook
->
alloc
.
ctx
,
ptr
);
}
static
PyObject
*
test_setallocators
(
PyMemAllocatorDomain
domain
)
{
PyObject
*
res
=
NULL
;
const
char
*
error_msg
;
alloc_hook_t
hook
;
PyMemAllocator
alloc
;
size_t
size
,
size2
;
void
*
ptr
,
*
ptr2
;
hook
.
malloc_size
=
0
;
hook
.
realloc_ptr
=
NULL
;
hook
.
realloc_new_size
=
0
;
hook
.
free_ptr
=
NULL
;
alloc
.
ctx
=
&
hook
;
alloc
.
malloc
=
&
hook_malloc
;
alloc
.
realloc
=
&
hook_realloc
;
alloc
.
free
=
&
hook_free
;
PyMem_GetAllocator
(
domain
,
&
hook
.
alloc
);
PyMem_SetAllocator
(
domain
,
&
alloc
);
size
=
42
;
switch
(
domain
)
{
case
PYMEM_DOMAIN_RAW
:
ptr
=
PyMem_RawMalloc
(
size
);
break
;
case
PYMEM_DOMAIN_MEM
:
ptr
=
PyMem_Malloc
(
size
);
break
;
case
PYMEM_DOMAIN_OBJ
:
ptr
=
PyObject_Malloc
(
size
);
break
;
default:
ptr
=
NULL
;
break
;
}
if
(
ptr
==
NULL
)
{
error_msg
=
"malloc failed"
;
goto
fail
;
}
if
(
hook
.
malloc_size
!=
size
)
{
error_msg
=
"malloc invalid size"
;
goto
fail
;
}
size2
=
200
;
switch
(
domain
)
{
case
PYMEM_DOMAIN_RAW
:
ptr2
=
PyMem_RawRealloc
(
ptr
,
size2
);
break
;
case
PYMEM_DOMAIN_MEM
:
ptr2
=
PyMem_Realloc
(
ptr
,
size2
);
break
;
case
PYMEM_DOMAIN_OBJ
:
ptr2
=
PyObject_Realloc
(
ptr
,
size2
);
break
;
}
if
(
ptr2
==
NULL
)
{
error_msg
=
"realloc failed"
;
goto
fail
;
}
if
(
hook
.
realloc_ptr
!=
ptr
||
hook
.
realloc_new_size
!=
size2
)
{
error_msg
=
"realloc invalid parameters"
;
goto
fail
;
}
switch
(
domain
)
{
case
PYMEM_DOMAIN_RAW
:
PyMem_RawFree
(
ptr2
);
break
;
case
PYMEM_DOMAIN_MEM
:
PyMem_Free
(
ptr2
);
break
;
case
PYMEM_DOMAIN_OBJ
:
PyObject_Free
(
ptr2
);
break
;
}
if
(
hook
.
free_ptr
!=
ptr2
)
{
error_msg
=
"free invalid pointer"
;
goto
fail
;
}
Py_INCREF
(
Py_None
);
res
=
Py_None
;
goto
finally
;
fail:
PyErr_SetString
(
PyExc_RuntimeError
,
error_msg
);
finally:
PyMem_SetAllocator
(
domain
,
&
hook
.
alloc
);
return
res
;
}
static
PyObject
*
test_pymem_setrawallocators
(
PyObject
*
self
)
{
return
test_setallocators
(
PYMEM_DOMAIN_RAW
);
}
static
PyObject
*
test_pymem_setallocators
(
PyObject
*
self
)
{
return
test_setallocators
(
PYMEM_DOMAIN_MEM
);
}
static
PyObject
*
test_pyobject_setallocators
(
PyObject
*
self
)
{
return
test_setallocators
(
PYMEM_DOMAIN_OBJ
);
}
static
PyMethodDef
TestMethods
[]
=
{
{
"raise_exception"
,
raise_exception
,
METH_VARARGS
},
{
"raise_memoryerror"
,
(
PyCFunction
)
raise_memoryerror
,
METH_NOARGS
},
...
...
@@ -2611,6 +2766,14 @@ static PyMethodDef TestMethods[] = {
{
"pytime_object_to_time_t"
,
test_pytime_object_to_time_t
,
METH_VARARGS
},
{
"pytime_object_to_timeval"
,
test_pytime_object_to_timeval
,
METH_VARARGS
},
{
"pytime_object_to_timespec"
,
test_pytime_object_to_timespec
,
METH_VARARGS
},
{
"test_pymem"
,
(
PyCFunction
)
test_pymem_alloc0
,
METH_NOARGS
},
{
"test_pymem_alloc0"
,
(
PyCFunction
)
test_pymem_setrawallocators
,
METH_NOARGS
},
{
"test_pymem_setallocators"
,
(
PyCFunction
)
test_pymem_setallocators
,
METH_NOARGS
},
{
"test_pyobject_setallocators"
,
(
PyCFunction
)
test_pyobject_setallocators
,
METH_NOARGS
},
{
NULL
,
NULL
}
/* sentinel */
};
...
...
Objects/object.c
Dosyayı görüntüle @
ef9b47f0
...
...
@@ -1859,26 +1859,6 @@ PyTypeObject *_PyCapsule_hack = &PyCapsule_Type;
Py_ssize_t
(
*
_Py_abstract_hack
)(
PyObject
*
)
=
PyObject_Size
;
/* Python's malloc wrappers (see pymem.h) */
void
*
PyMem_Malloc
(
size_t
nbytes
)
{
return
PyMem_MALLOC
(
nbytes
);
}
void
*
PyMem_Realloc
(
void
*
p
,
size_t
nbytes
)
{
return
PyMem_REALLOC
(
p
,
nbytes
);
}
void
PyMem_Free
(
void
*
p
)
{
PyMem_FREE
(
p
);
}
void
_PyObject_DebugTypeStats
(
FILE
*
out
)
{
...
...
Objects/obmalloc.c
Dosyayı görüntüle @
ef9b47f0
This diff is collapsed.
Click to expand it.
PCbuild/python.vcxproj
Dosyayı görüntüle @
ef9b47f0
...
...
@@ -243,7 +243,7 @@
<Link>
<OutputFile>
$(OutDir)python_d.exe
</OutputFile>
<SubSystem>
Console
</SubSystem>
<StackReserveSize>
2100000
</StackReserveSize>
<StackReserveSize>
4194304
</StackReserveSize>
<BaseAddress>
0x1d000000
</BaseAddress>
</Link>
</ItemDefinitionGroup>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment