#ifndef TOR_UTIL_MALLOC_H
#define TOR_UTIL_MALLOC_H
#include <stddef.h>
#include <stdlib.h>
#include "lib/cc/compat_compiler.h"
void *tor_malloc_(size_t size) ATTR_MALLOC;
void *tor_malloc_zero_(size_t size) ATTR_MALLOC;
void *tor_calloc_(size_t nmemb, size_t size) ATTR_MALLOC;
void *tor_realloc_(void *ptr, size_t size);
void *tor_reallocarray_(void *ptr, size_t size1, size_t size2);
char *tor_strdup_(const char *s) ATTR_MALLOC;
char *tor_strndup_(const char *s, size_t n)
ATTR_MALLOC;
void *tor_memdup_(const void *mem, size_t len)
ATTR_MALLOC;
void *tor_memdup_nulterm_(const void *mem, size_t len)
ATTR_MALLOC;
void tor_free_(void *mem);
#ifdef __GNUC__
#define tor_free(p) STMT_BEGIN \
typeof(&(p)) tor_free__tmpvar = &(p); \
raw_free(*tor_free__tmpvar); \
*tor_free__tmpvar=NULL; \
STMT_END
#else
#define tor_free(p) STMT_BEGIN \
raw_free(p); \
(p)=NULL; \
STMT_END
#endif
#define tor_malloc(size) tor_malloc_(size)
#define tor_malloc_zero(size) tor_malloc_zero_(size)
#define tor_calloc(nmemb,size) tor_calloc_(nmemb, size)
#define tor_realloc(ptr, size) tor_realloc_(ptr, size)
#define tor_reallocarray(ptr, sz1, sz2) \
tor_reallocarray_((ptr), (sz1), (sz2))
#define tor_strdup(s) tor_strdup_(s)
#define tor_strndup(s, n) tor_strndup_(s, n)
#define tor_memdup(s, n) tor_memdup_(s, n)
#define tor_memdup_nulterm(s, n) tor_memdup_nulterm_(s, n)
#define raw_malloc malloc
#define raw_realloc realloc
#define raw_free free
#define raw_strdup strdup
#define FREE_AND_NULL(typename, freefn, var) \
do { \
\
typename **tmp__free__ptr ## freefn = &(var); \
freefn(*tmp__free__ptr ## freefn); \
(*tmp__free__ptr ## freefn) = NULL; \
} while (0)
#ifdef UTIL_MALLOC_PRIVATE
STATIC int size_mul_check(const size_t x, const size_t y);
#endif
#endif