aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/core/SkTypes.h
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-05-22 13:35:37 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-05-22 13:35:37 +0000
commit9eb6645956a46e81336a2ed9e705a5360163c4f9 (patch)
tree06b312302b78e6748562dd124bb0208f0822c103 /include/core/SkTypes.h
parent8c6411a603266e94dd87445ac30e0b1abc36b0af (diff)
Add return param to SkAutoSMalloc::reset() that indicates whether the allocation changed or not.
Review URL: https://codereview.chromium.org/15558005 git-svn-id: http://skia.googlecode.com/svn/trunk@9235 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include/core/SkTypes.h')
-rw-r--r--include/core/SkTypes.h46
1 files changed, 30 insertions, 16 deletions
diff --git a/include/core/SkTypes.h b/include/core/SkTypes.h
index 4f6788c928..f881719a17 100644
--- a/include/core/SkTypes.h
+++ b/include/core/SkTypes.h
@@ -484,14 +484,20 @@ public:
/**
* Reallocates the block to a new size. The ptr may or may not change.
*/
- void* reset(size_t size, OnShrink shrink = kAlloc_OnShrink) {
+ void* reset(size_t size, OnShrink shrink = kAlloc_OnShrink, bool* didChangeAlloc = NULL) {
if (size == fSize || (kReuse_OnShrink == shrink && size < fSize)) {
+ if (NULL != didChangeAlloc) {
+ *didChangeAlloc = false;
+ }
return fPtr;
}
sk_free(fPtr);
fPtr = size ? sk_malloc_throw(size) : NULL;
fSize = size;
+ if (NULL != didChangeAlloc) {
+ *didChangeAlloc = true;
+ }
return fPtr;
}
@@ -540,7 +546,7 @@ public:
*/
SkAutoSMalloc() {
fPtr = fStorage;
- fSize = 0;
+ fSize = kSize;
}
/**
@@ -550,7 +556,7 @@ public:
*/
explicit SkAutoSMalloc(size_t size) {
fPtr = fStorage;
- fSize = 0;
+ fSize = kSize;
this->reset(size);
}
@@ -579,21 +585,29 @@ public:
* heap.
*/
void* reset(size_t size,
- SkAutoMalloc::OnShrink shrink = SkAutoMalloc::kAlloc_OnShrink) {
- if (size == fSize || (SkAutoMalloc::kReuse_OnShrink == shrink &&
- size < fSize)) {
- return fPtr;
+ SkAutoMalloc::OnShrink shrink = SkAutoMalloc::kAlloc_OnShrink,
+ bool* didChangeAlloc = NULL) {
+ size = (size < kSize) ? kSize : size;
+ bool alloc = size != fSize && (SkAutoMalloc::kAlloc_OnShrink == shrink || size < fSize);
+ if (NULL != didChangeAlloc) {
+ *didChangeAlloc = alloc;
}
-
- if (fPtr != (void*)fStorage) {
- sk_free(fPtr);
- }
-
- if (size <= kSize) {
- fPtr = fStorage;
- } else {
- fPtr = sk_malloc_flags(size, SK_MALLOC_THROW | SK_MALLOC_TEMP);
+ if (alloc) {
+ if (fPtr != (void*)fStorage) {
+ sk_free(fPtr);
+ }
+
+ if (size == kSize) {
+ SkASSERT(fPtr != fStorage); // otherwise we lied when setting didChangeAlloc.
+ fPtr = fStorage;
+ } else {
+ fPtr = sk_malloc_flags(size, SK_MALLOC_THROW | SK_MALLOC_TEMP);
+ }
+
+ fSize = size;
}
+ SkASSERT(fSize >= size && fSize >= kSize);
+ SkASSERT((fPtr == fStorage) || fSize > kSize);
return fPtr;
}