Skip to content

Commit b7ee98b

Browse files
committed
BUG: handle possible error for PyTraceMallocTrack
DOC: update documentation for PyDataMem_* functions
1 parent aab644b commit b7ee98b

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

doc/source/reference/c-api/array.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4044,8 +4044,8 @@ Memory management
40444044
40454045
.. c:function:: char* PyDataMem_RENEW(void * ptr, size_t newbytes)
40464046
4047-
Macros to allocate, free, and reallocate memory. These macros are used
4048-
internally to create arrays.
4047+
Functions to allocate, free, and reallocate memory. These are used
4048+
internally to manage array data memory unless overridden.
40494049
40504050
.. c:function:: npy_intp* PyDimMem_NEW(int nd)
40514051

numpy/_core/src/multiarray/alloc.c

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,11 @@ PyDataMem_NEW(size_t size)
238238

239239
assert(size != 0);
240240
result = malloc(size);
241-
PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
241+
int ret = PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
242+
if (ret == -1) {
243+
free(result);
244+
return NULL;
245+
}
242246
return result;
243247
}
244248

@@ -251,7 +255,11 @@ PyDataMem_NEW_ZEROED(size_t nmemb, size_t size)
251255
void *result;
252256

253257
result = calloc(nmemb, size);
254-
PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, nmemb * size);
258+
int ret = PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, nmemb * size);
259+
if (ret == -1) {
260+
free(result);
261+
return NULL;
262+
}
255263
return result;
256264
}
257265

@@ -276,7 +284,11 @@ PyDataMem_RENEW(void *ptr, size_t size)
276284
assert(size != 0);
277285
PyTraceMalloc_Untrack(NPY_TRACE_DOMAIN, (npy_uintp)ptr);
278286
result = realloc(ptr, size);
279-
PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
287+
int ret = PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
288+
if (ret == -1) {
289+
free(result);
290+
return NULL;
291+
}
280292
return result;
281293
}
282294

@@ -360,7 +372,11 @@ PyDataMem_UserNEW(size_t size, PyObject *mem_handler)
360372
}
361373
assert(size != 0);
362374
result = handler->allocator.malloc(handler->allocator.ctx, size);
363-
PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
375+
int ret = PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
376+
if (ret == -1) {
377+
handler->allocator.free(handler->allocator.ctx, result, size);
378+
return NULL;
379+
}
364380
return result;
365381
}
366382

@@ -374,7 +390,11 @@ PyDataMem_UserNEW_ZEROED(size_t nmemb, size_t size, PyObject *mem_handler)
374390
return NULL;
375391
}
376392
result = handler->allocator.calloc(handler->allocator.ctx, nmemb, size);
377-
PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, nmemb * size);
393+
int ret = PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, nmemb * size);
394+
if (ret == -1) {
395+
handler->allocator.free(handler->allocator.ctx, result, size);
396+
return NULL;
397+
}
378398
return result;
379399
}
380400

@@ -404,11 +424,13 @@ PyDataMem_UserRENEW(void *ptr, size_t size, PyObject *mem_handler)
404424
}
405425

406426
assert(size != 0);
427+
int ret = PyTraceMalloc_Untrack(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
407428
result = handler->allocator.realloc(handler->allocator.ctx, ptr, size);
408-
if (result != ptr) {
409-
PyTraceMalloc_Untrack(NPY_TRACE_DOMAIN, (npy_uintp)ptr);
429+
int ret = PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
430+
if (ret == -1) {
431+
handler->allocator.free(handler->allocator.ctx, result, size);
432+
return NULL;
410433
}
411-
PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
412434
return result;
413435
}
414436

0 commit comments

Comments
 (0)