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