ISCMEMFUNC(allocate)((c), (s), 0 _ISC_MEM_FILELINE)
#define isc_mem_allocatex(c, s, f) \
ISCMEMFUNC(allocate)((c), (s), (f)_ISC_MEM_FILELINE)
+#define isc_mem_callocate(c, n, s) \
+ ISCMEMFUNC(callocate)((c), (n), (s), 0 _ISC_MEM_FILELINE)
#define isc_mem_reallocate(c, p, s) \
ISCMEMFUNC(reallocate)((c), (p), (s), 0 _ISC_MEM_FILELINE)
#define isc_mem_reallocatex(c, p, s, f) \
ISC_ATTR_MALLOC_DEALLOCATOR_IDX(ISCMEMFUNC(free), 2)
void *ISCMEMFUNC(allocate)(isc_mem_t *, size_t, int _ISC_MEM_FLARG);
+ISC_ATTR_MALLOC_DEALLOCATOR_IDX(ISCMEMFUNC(free), 2)
+void *ISCMEMFUNC(callocate)(isc_mem_t *, size_t, size_t, int _ISC_MEM_FLARG);
+
ISC_ATTR_DEALLOCATOR_IDX(ISCMEMFUNC(free), 2)
void *ISCMEMFUNC(reallocate)(isc_mem_t *, void *, size_t, int _ISC_MEM_FLARG);
#include <isc/mutex.h>
#include <isc/once.h>
#include <isc/os.h>
+#include <isc/overflow.h>
#include <isc/refcount.h>
#include <isc/strerr.h>
#include <isc/string.h>
return (ptr);
}
+void *
+isc__mem_callocate(isc_mem_t *ctx, size_t count, size_t size, int flags FLARG) {
+ size_t bytes = ISC_CHECKED_MUL(count, size);
+ return (isc__mem_allocate(ctx, bytes,
+ (flags | ISC_MEM_ZERO) FLARG_PASS));
+}
+
void *
isc__mem_reget(isc_mem_t *ctx, void *old_ptr, size_t old_size, size_t new_size,
int flags FLARG) {
static void *
isc__uv_calloc(size_t count, size_t size) {
- void *ptr;
- size_t res;
-#if HAVE_BUILTIN_MUL_OVERFLOW
- bool overflow = __builtin_mul_overflow(count, size, &res);
- RUNTIME_CHECK(!overflow);
-#else
- res = count * size;
- REQUIRE(count == 0 || res / count == size);
-#endif
-
- ptr = isc_mem_allocatex(isc__uv_mctx, res, ISC_MEM_ZERO);
-
- return (ptr);
+ return (isc_mem_callocate(isc__uv_mctx, count, size));
}
static void