Index: skia/ext/SkMemory_new_handler.cpp |
=================================================================== |
--- skia/ext/SkMemory_new_handler.cpp (revision 0) |
+++ skia/ext/SkMemory_new_handler.cpp (revision 0) |
@@ -0,0 +1,58 @@ |
+#include "SkTypes.h" |
+#include <stdio.h> |
+#include <stdlib.h> |
+#include <new> |
+ |
+// This implementation of sk_malloc_flags() and friends is identical |
+// to SkMemory_malloc.c, except that it disables the CRT's new_handler |
+// during malloc(), when SK_MALLOC_THROW is not set (ie., when |
+// sk_malloc_flags() would not abort on NULL). |
+ |
+void sk_throw() { |
+ SkASSERT(!"sk_throw"); |
+ abort(); |
+} |
+ |
+void sk_out_of_memory(void) { |
+ SkASSERT(!"sk_out_of_memory"); |
+ abort(); |
+} |
+ |
+void* sk_malloc_throw(size_t size) { |
+ return sk_malloc_flags(size, SK_MALLOC_THROW); |
+} |
+ |
+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; |
+} |
+ |
+void sk_free(void* p) { |
+ if (p) { |
+ free(p); |
+ } |
+} |
+ |
+void* sk_malloc_flags(size_t size, unsigned flags) { |
+ std::new_handler old_handler; |
+ if (!(flags & SK_MALLOC_THROW)) { |
+ old_handler = std::set_new_handler(NULL); |
+ } |
+ void* p = malloc(size); |
+ if (!(flags & SK_MALLOC_THROW)) { |
+ std::set_new_handler(old_handler); |
+ } |
+ if (p == NULL) { |
+ if (flags & SK_MALLOC_THROW) { |
+ sk_throw(); |
+ } |
+ } |
+ return p; |
+} |
+ |