void* moz_xvalloc(size_t size) { void* ptr = valloc(size); if (UNLIKELY(!ptr)) { mozalloc_handle_oom(); return moz_xvalloc(size); } return ptr; }
void* moz_xrealloc(void* ptr, size_t size) { void* newptr = realloc(ptr, size); if (UNLIKELY(!newptr)) { mozalloc_handle_oom(); return moz_xrealloc(ptr, size); } return newptr; }
char* moz_xstrndup(const char* str, size_t strsize) { char* dup = strndup(str, strsize); if (UNLIKELY(!dup)) { mozalloc_handle_oom(); return moz_xstrndup(str, strsize); } return dup; }
void* moz_xcalloc(size_t nmemb, size_t size) { void* ptr = calloc(nmemb, size); if (UNLIKELY(!ptr && nmemb && size)) { mozalloc_handle_oom(size); return moz_xcalloc(nmemb, size); } return ptr; }
void* moz_xmalloc(size_t size) { void* ptr = malloc(size); if (UNLIKELY(!ptr && size)) { mozalloc_handle_oom(size); return moz_xmalloc(size); } return ptr; }
char* moz_xstrdup(const char* str) { char* dup = strdup(str); if (UNLIKELY(!dup)) { mozalloc_handle_oom(0); return moz_xstrdup(str); } return dup; }
void* moz_xmemalign(size_t boundary, size_t size) { void* ptr = memalign(boundary, size); if (UNLIKELY(!ptr && EINVAL != errno)) { mozalloc_handle_oom(); return moz_xmemalign(boundary, size); } // non-NULL ptr or errno == EINVAL return ptr; }
int moz_xposix_memalign(void **ptr, size_t alignment, size_t size) { int err = posix_memalign(ptr, alignment, size); if (UNLIKELY(err && ENOMEM == err)) { mozalloc_handle_oom(); return moz_xposix_memalign(ptr, alignment, size); } // else: (0 == err) or (EINVAL == err) return err; }
void* moz_xrealloc(void* ptr, size_t size) { // Ensure that we have reasonable realloc semantics, regardless of the // underlying malloc implementation. if (UNLIKELY(!ptr && !size)) { return nullptr; } void* newptr = realloc(ptr, size); if (UNLIKELY(!newptr && size)) { mozalloc_handle_oom(size); return moz_xrealloc(ptr, size); } return newptr; }
void sk_out_of_memory(void) { SkDEBUGFAIL("sk_out_of_memory"); mozalloc_handle_oom(0); }