1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
87a561082645315215949fb7ad9c80c883ffd89adreed@android.com#include "SkTypes.h"
97a561082645315215949fb7ad9c80c883ffd89adreed@android.com#include <stdio.h>
107a561082645315215949fb7ad9c80c883ffd89adreed@android.com#include <stdlib.h>
117a561082645315215949fb7ad9c80c883ffd89adreed@android.com
1261b1436c224482611b864bff354b2664772b1b62halcanary#define SK_DEBUGFAILF(fmt, ...) \
1361b1436c224482611b864bff354b2664772b1b62halcanary    SkASSERT((SkDebugf(fmt"\n", __VA_ARGS__), false))
1461b1436c224482611b864bff354b2664772b1b62halcanary
1561b1436c224482611b864bff354b2664772b1b62halcanarystatic inline void sk_out_of_memory(size_t size) {
1661b1436c224482611b864bff354b2664772b1b62halcanary    SK_DEBUGFAILF("sk_out_of_memory (asked for " SK_SIZE_T_SPECIFIER " bytes)",
1761b1436c224482611b864bff354b2664772b1b62halcanary                  size);
1861b1436c224482611b864bff354b2664772b1b62halcanary    abort();
1961b1436c224482611b864bff354b2664772b1b62halcanary}
2061b1436c224482611b864bff354b2664772b1b62halcanary
21dd6cde5235d5d36607f4f1df66057d807b432b99commit-bot@chromium.orgstatic inline void* throw_on_failure(size_t size, void* p) {
22519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com    if (size > 0 && p == NULL) {
23519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com        // If we've got a NULL here, the only reason we should have failed is running out of RAM.
2461b1436c224482611b864bff354b2664772b1b62halcanary        sk_out_of_memory(size);
25519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com    }
26519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com    return p;
27519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com}
28519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com
297a561082645315215949fb7ad9c80c883ffd89adreed@android.comvoid sk_throw() {
300c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com    SkDEBUGFAIL("sk_throw");
317a561082645315215949fb7ad9c80c883ffd89adreed@android.com    abort();
327a561082645315215949fb7ad9c80c883ffd89adreed@android.com}
337a561082645315215949fb7ad9c80c883ffd89adreed@android.com
347a561082645315215949fb7ad9c80c883ffd89adreed@android.comvoid sk_out_of_memory(void) {
350c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com    SkDEBUGFAIL("sk_out_of_memory");
367a561082645315215949fb7ad9c80c883ffd89adreed@android.com    abort();
377a561082645315215949fb7ad9c80c883ffd89adreed@android.com}
387a561082645315215949fb7ad9c80c883ffd89adreed@android.com
397a561082645315215949fb7ad9c80c883ffd89adreed@android.comvoid* sk_malloc_throw(size_t size) {
407a561082645315215949fb7ad9c80c883ffd89adreed@android.com    return sk_malloc_flags(size, SK_MALLOC_THROW);
417a561082645315215949fb7ad9c80c883ffd89adreed@android.com}
427a561082645315215949fb7ad9c80c883ffd89adreed@android.com
437a561082645315215949fb7ad9c80c883ffd89adreed@android.comvoid* sk_realloc_throw(void* addr, size_t size) {
44dd6cde5235d5d36607f4f1df66057d807b432b99commit-bot@chromium.org    return throw_on_failure(size, realloc(addr, size));
457a561082645315215949fb7ad9c80c883ffd89adreed@android.com}
467a561082645315215949fb7ad9c80c883ffd89adreed@android.com
477a561082645315215949fb7ad9c80c883ffd89adreed@android.comvoid sk_free(void* p) {
487a561082645315215949fb7ad9c80c883ffd89adreed@android.com    if (p) {
497a561082645315215949fb7ad9c80c883ffd89adreed@android.com        free(p);
507a561082645315215949fb7ad9c80c883ffd89adreed@android.com    }
517a561082645315215949fb7ad9c80c883ffd89adreed@android.com}
527a561082645315215949fb7ad9c80c883ffd89adreed@android.com
537a561082645315215949fb7ad9c80c883ffd89adreed@android.comvoid* sk_malloc_flags(size_t size, unsigned flags) {
547a561082645315215949fb7ad9c80c883ffd89adreed@android.com    void* p = malloc(size);
55519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com    if (flags & SK_MALLOC_THROW) {
56dd6cde5235d5d36607f4f1df66057d807b432b99commit-bot@chromium.org        return throw_on_failure(size, p);
57519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com    } else {
58519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com        return p;
597a561082645315215949fb7ad9c80c883ffd89adreed@android.com    }
60519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com}
61519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com
62519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.comvoid* sk_calloc(size_t size) {
63519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com    return calloc(size, 1);
64519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com}
65519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.com
66519f9677a41239808f41a7c13ef1f6e05eb1ed50mtklein@google.comvoid* sk_calloc_throw(size_t size) {
67dd6cde5235d5d36607f4f1df66057d807b432b99commit-bot@chromium.org    return throw_on_failure(size, sk_calloc(size));
687a561082645315215949fb7ad9c80c883ffd89adreed@android.com}
69