#include "include/private/SkMalloc.h"
#include <cstdlib>
namespace pk {
#define PK_DEBUGFAILF(fmt, ...)
static inline void sk_out_of_memory(size_t size) {
PK_DEBUGFAILF("sk_out_of_memory (asked for %zu bytes)",
size);
#if defined(PK_BUILD_FOR_AFL_FUZZ)
exit(1);
#else
abort();
#endif
}
static inline void* throw_on_failure(size_t size, void* p) {
if (size > 0 && p == nullptr) {
sk_out_of_memory(size);
}
return p;
}
void sk_abort_no_print() {
#if defined(PK_BUILD_FOR_WIN) && defined(PK_IS_BOT)
_set_abort_behavior(0, _WRITE_ABORT_MSG);
#endif
#if defined(__clang__)
__builtin_trap();
#else
abort();
#endif
}
void sk_out_of_memory(void) {
PkDEBUGFAIL("sk_out_of_memory");
#if defined(PK_BUILD_FOR_AFL_FUZZ)
exit(1);
#else
abort();
#endif
}
void* sk_realloc_throw(void* addr, size_t size) {
return throw_on_failure(size, realloc(addr, size));
}
void sk_free(void* p) {
if (p) {
free(p);
}
}
void* sk_malloc_flags(size_t size, unsigned flags) {
void* p;
if (flags & PK_MALLOC_ZERO_INITIALIZE) {
p = calloc(size, 1);
} else {
#if defined(PK_BUILD_FOR_ANDROID_FRAMEWORK) && defined(__BIONIC__)
(void)mallopt(M_THREAD_DISABLE_MEM_INIT, 1);
#endif
p = malloc(size);
#if defined(PK_BUILD_FOR_ANDROID_FRAMEWORK) && defined(__BIONIC__)
(void)mallopt(M_THREAD_DISABLE_MEM_INIT, 0);
#endif
}
if (flags & PK_MALLOC_THROW) {
return throw_on_failure(size, p);
} else {
return p;
}
}
}