summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCharles-François Natali <cf.natali@gmail.com>2014-06-19 21:42:51 (GMT)
committerCharles-François Natali <cf.natali@gmail.com>2014-06-19 21:42:51 (GMT)
commitcee4f034385902659ec1ade666e17537eb2bc399 (patch)
treeef6415bdd6d7899f8aede6fa74f2e48dfdb6ff8e
parent4ade2d25fc585876540ac9d591a44469fd853462 (diff)
downloadcpython-cee4f034385902659ec1ade666e17537eb2bc399.zip
cpython-cee4f034385902659ec1ade666e17537eb2bc399.tar.gz
cpython-cee4f034385902659ec1ade666e17537eb2bc399.tar.bz2
Issue #21810: Backport mmap-based arena allocation failure check.
-rw-r--r--Objects/obmalloc.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c
index b1de4cf..1434206 100644
--- a/Objects/obmalloc.c
+++ b/Objects/obmalloc.c
@@ -540,6 +540,8 @@ new_arena(void)
{
struct arena_object* arenaobj;
uint excess; /* number of bytes above pool alignment */
+ void *address;
+ int err;
#ifdef PYMALLOC_DEBUG
if (Py_GETENV("PYTHONMALLOCSTATS"))
@@ -593,12 +595,14 @@ new_arena(void)
unused_arena_objects = arenaobj->nextarena;
assert(arenaobj->address == 0);
#ifdef ARENAS_USE_MMAP
- arenaobj->address = (uptr)mmap(NULL, ARENA_SIZE, PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ address = mmap(NULL, ARENA_SIZE, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ err = (address == MAP_FAILED);
#else
- arenaobj->address = (uptr)malloc(ARENA_SIZE);
+ address = malloc(ARENA_SIZE);
+ err = (address == 0);
#endif
- if (arenaobj->address == 0) {
+ if (err) {
/* The allocation failed: return NULL after putting the
* arenaobj back.
*/
@@ -606,6 +610,7 @@ new_arena(void)
unused_arena_objects = arenaobj;
return NULL;
}
+ arenaobj->address = (uptr)address;
++narenas_currently_allocated;
#ifdef PYMALLOC_DEBUG