180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTypes.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <stdio.h>
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <stdlib.h>
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
120a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergerstatic inline void* throw_on_failure(size_t size, void* p) {
130a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    if (size > 0 && p == NULL) {
140a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        // If we've got a NULL here, the only reason we should have failed is running out of RAM.
150a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        sk_out_of_memory();
160a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    }
170a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    return p;
180a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger}
190a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid sk_throw() {
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDEBUGFAIL("sk_throw");
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    abort();
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid sk_out_of_memory(void) {
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDEBUGFAIL("sk_out_of_memory");
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    abort();
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid* sk_malloc_throw(size_t size) {
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return sk_malloc_flags(size, SK_MALLOC_THROW);
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid* sk_realloc_throw(void* addr, size_t size) {
350a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    return throw_on_failure(size, realloc(addr, size));
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid sk_free(void* p) {
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (p) {
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        free(p);
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid* sk_malloc_flags(size_t size, unsigned flags) {
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void* p = malloc(size);
460a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    if (flags & SK_MALLOC_THROW) {
470a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        return throw_on_failure(size, p);
480a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    } else {
490a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger        return p;
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
510a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger}
520a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
530a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergervoid* sk_calloc(size_t size) {
540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    return calloc(size, 1);
550a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger}
560a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger
570a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenbergervoid* sk_calloc_throw(size_t size) {
580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger    return throw_on_failure(size, sk_calloc(size));
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
60