diff options
author | 2013-09-20 14:31:45 +0000 | |
---|---|---|
committer | 2013-09-20 14:31:45 +0000 | |
commit | 519f9677a41239808f41a7c13ef1f6e05eb1ed50 (patch) | |
tree | a7a1acf5fc2c9d8c2390c48bc1a604628ff513e5 /src/ports | |
parent | f91e3d4f54de9976b6538decadd977b19e49eadd (diff) |
Add sk_calloc. Remove SkMemory_stdlib, which seems unused.
I'm seeing basically no difference between malloc + bzero and calloc on my desktop, but on a Galaxy Nexus calloc is never slower, and significantly faster once the allocation size becomes large, both for allocation and for _reading_.
BUG=skia:1662
R=reed@google.com
Review URL: https://codereview.chromium.org/24251008
git-svn-id: http://skia.googlecode.com/svn/trunk@11414 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/ports')
-rw-r--r-- | src/ports/SkMemory_malloc.cpp | 34 | ||||
-rw-r--r-- | src/ports/SkMemory_mozalloc.cpp | 8 |
2 files changed, 29 insertions, 13 deletions
diff --git a/src/ports/SkMemory_malloc.cpp b/src/ports/SkMemory_malloc.cpp index 73b56079a6..6db65a8524 100644 --- a/src/ports/SkMemory_malloc.cpp +++ b/src/ports/SkMemory_malloc.cpp @@ -9,6 +9,14 @@ #include <stdio.h> #include <stdlib.h> +static inline void* throwOnFailure(size_t size, void* p) { + if (size > 0 && p == NULL) { + // If we've got a NULL here, the only reason we should have failed is running out of RAM. + sk_out_of_memory(); + } + return p; +} + void sk_throw() { SkDEBUGFAIL("sk_throw"); abort(); @@ -24,14 +32,7 @@ void* sk_malloc_throw(size_t size) { } void* sk_realloc_throw(void* addr, size_t size) { - void* p = realloc(addr, size); - if (size == 0) { - return p; - } - if (p == NULL) { - sk_throw(); - } - return p; + return throwOnFailure(size, realloc(addr, size)); } void sk_free(void* p) { @@ -42,10 +43,17 @@ void sk_free(void* p) { void* sk_malloc_flags(size_t size, unsigned flags) { void* p = malloc(size); - if (p == NULL) { - if (flags & SK_MALLOC_THROW) { - sk_throw(); - } + if (flags & SK_MALLOC_THROW) { + return throwOnFailure(size, p); + } else { + return p; } - return p; +} + +void* sk_calloc(size_t size) { + return calloc(size, 1); +} + +void* sk_calloc_throw(size_t size) { + return throwOnFailure(size, sk_calloc(size)); } diff --git a/src/ports/SkMemory_mozalloc.cpp b/src/ports/SkMemory_mozalloc.cpp index 2c049b2a03..4ca9312671 100644 --- a/src/ports/SkMemory_mozalloc.cpp +++ b/src/ports/SkMemory_mozalloc.cpp @@ -37,3 +37,11 @@ void sk_free(void* p) { void* sk_malloc_flags(size_t size, unsigned flags) { return (flags & SK_MALLOC_THROW) ? moz_xmalloc(size) : moz_malloc(size); } + +void* sk_calloc(size_t size) { + return moz_calloc(size, 1); +} + +void* sk_calloc_throw(size_t size) { + return moz_xcalloc(size, 1); +} |