| Index: include/core/SkTypes.h
|
| diff --git a/include/core/SkTypes.h b/include/core/SkTypes.h
|
| index 0d31efc6ccf7dd904dd7232b094aedaddbbc6870..4592168bd4d6da020179236511f439cd5cd30937 100644
|
| --- a/include/core/SkTypes.h
|
| +++ b/include/core/SkTypes.h
|
| @@ -606,17 +606,16 @@ private:
|
| #define SkAutoMalloc(...) SK_REQUIRE_LOCAL_VAR(SkAutoMalloc)
|
|
|
| /**
|
| - * Manage an allocated block of memory. If the requested size is <= kSize, then
|
| - * the allocation will come from the stack rather than the heap. This object
|
| - * is the sole manager of the lifetime of the block, so the caller must not
|
| - * call sk_free() or delete on the block.
|
| + * Manage an allocated block of memory. If the requested size is <= kSizeRequested (or slightly
|
| + * more), then the allocation will come from the stack rather than the heap. This object is the
|
| + * sole manager of the lifetime of the block, so the caller must not call sk_free() or delete on
|
| + * the block.
|
| */
|
| -template <size_t kSize> class SkAutoSMalloc : SkNoncopyable {
|
| +template <size_t kSizeRequested> class SkAutoSMalloc : SkNoncopyable {
|
| public:
|
| /**
|
| - * Creates initially empty storage. get() returns a ptr, but it is to
|
| - * a zero-byte allocation. Must call reset(size) to return an allocated
|
| - * block.
|
| + * Creates initially empty storage. get() returns a ptr, but it is to a zero-byte allocation.
|
| + * Must call reset(size) to return an allocated block.
|
| */
|
| SkAutoSMalloc() {
|
| fPtr = fStorage;
|
| @@ -624,9 +623,8 @@ public:
|
| }
|
|
|
| /**
|
| - * Allocate a block of the specified size. If size <= kSize, then the
|
| - * allocation will come from the stack, otherwise it will be dynamically
|
| - * allocated.
|
| + * Allocate a block of the specified size. If size <= kSizeRequested (or slightly more), then
|
| + * the allocation will come from the stack, otherwise it will be dynamically allocated.
|
| */
|
| explicit SkAutoSMalloc(size_t size) {
|
| fPtr = fStorage;
|
| @@ -635,8 +633,8 @@ public:
|
| }
|
|
|
| /**
|
| - * Free the allocated block (if any). If the block was small enought to
|
| - * have been allocated on the stack (size <= kSize) then this does nothing.
|
| + * Free the allocated block (if any). If the block was small enough to have been allocated on
|
| + * the stack, then this does nothing.
|
| */
|
| ~SkAutoSMalloc() {
|
| if (fPtr != (void*)fStorage) {
|
| @@ -645,18 +643,16 @@ public:
|
| }
|
|
|
| /**
|
| - * Return the allocated block. May return non-null even if the block is
|
| - * of zero size. Since this may be on the stack or dynamically allocated,
|
| - * the caller must not call sk_free() on it, but must rely on SkAutoSMalloc
|
| - * to manage it.
|
| + * Return the allocated block. May return non-null even if the block is of zero size. Since
|
| + * this may be on the stack or dynamically allocated, the caller must not call sk_free() on it,
|
| + * but must rely on SkAutoSMalloc to manage it.
|
| */
|
| void* get() const { return fPtr; }
|
|
|
| /**
|
| - * Return a new block of the requested size, freeing (as necessary) any
|
| - * previously allocated block. As with the constructor, if size <= kSize
|
| - * then the return block may be allocated locally, rather than from the
|
| - * heap.
|
| + * Return a new block of the requested size, freeing (as necessary) any previously allocated
|
| + * block. As with the constructor, if size <= kSizeRequested (or slightly more) then the return
|
| + * block may be allocated locally, rather than from the heap.
|
| */
|
| void* reset(size_t size,
|
| SkAutoMalloc::OnShrink shrink = SkAutoMalloc::kAlloc_OnShrink,
|
| @@ -686,9 +682,20 @@ public:
|
| }
|
|
|
| private:
|
| + // Align up to 32 bits.
|
| + static const size_t kSizeAlign4 = SkAlign4(kSizeRequested);
|
| +#if defined(GOOGLE3)
|
| + // Stack frame size is limited for GOOGLE3. 4k is less than the actual max, but some functions
|
| + // have multiple large stack allocations.
|
| + static const size_t kMaxBytes = 4 * 1024;
|
| + static const size_t kSize = kSizeRequested > kMaxBytes ? kMaxBytes : kSizeAlign4;
|
| +#else
|
| + static const size_t kSize = kSizeAlign4;
|
| +#endif
|
| +
|
| void* fPtr;
|
| size_t fSize; // can be larger than the requested size (see kReuse)
|
| - uint32_t fStorage[(kSize + 3) >> 2];
|
| + uint32_t fStorage[kSize >> 2];
|
| };
|
| // Can't guard the constructor because it's a template class.
|
|
|
|
|