1
2 /*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8 #include "SkTypes.h"
9 #include <stdio.h>
10 #include <stdlib.h>
11
12 #define SK_DEBUGFAILF(fmt, ...) \
13 SkASSERT((SkDebugf(fmt"\n", __VA_ARGS__), false))
14
sk_out_of_memory(size_t size)15 static inline void sk_out_of_memory(size_t size) {
16 SK_DEBUGFAILF("sk_out_of_memory (asked for " SK_SIZE_T_SPECIFIER " bytes)",
17 size);
18 abort();
19 }
20
throw_on_failure(size_t size,void * p)21 static inline void* throw_on_failure(size_t size, void* p) {
22 if (size > 0 && p == NULL) {
23 // If we've got a NULL here, the only reason we should have failed is running out of RAM.
24 sk_out_of_memory(size);
25 }
26 return p;
27 }
28
sk_throw()29 void sk_throw() {
30 SkDEBUGFAIL("sk_throw");
31 abort();
32 }
33
sk_out_of_memory(void)34 void sk_out_of_memory(void) {
35 SkDEBUGFAIL("sk_out_of_memory");
36 abort();
37 }
38
sk_malloc_throw(size_t size)39 void* sk_malloc_throw(size_t size) {
40 return sk_malloc_flags(size, SK_MALLOC_THROW);
41 }
42
sk_realloc_throw(void * addr,size_t size)43 void* sk_realloc_throw(void* addr, size_t size) {
44 return throw_on_failure(size, realloc(addr, size));
45 }
46
sk_free(void * p)47 void sk_free(void* p) {
48 if (p) {
49 free(p);
50 }
51 }
52
sk_malloc_flags(size_t size,unsigned flags)53 void* sk_malloc_flags(size_t size, unsigned flags) {
54 void* p = malloc(size);
55 if (flags & SK_MALLOC_THROW) {
56 return throw_on_failure(size, p);
57 } else {
58 return p;
59 }
60 }
61
sk_calloc(size_t size)62 void* sk_calloc(size_t size) {
63 return calloc(size, 1);
64 }
65
sk_calloc_throw(size_t size)66 void* sk_calloc_throw(size_t size) {
67 return throw_on_failure(size, sk_calloc(size));
68 }
69