mirror of https://github.com/python/cpython
Close #14232: catch mmap() failure in new_arena() of obmalloc
This commit is contained in:
parent
28393828e2
commit
ba108823b6
|
@ -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,
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue