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