Chromium Code Reviews| Index: include/private/SkTemplates.h |
| diff --git a/include/private/SkTemplates.h b/include/private/SkTemplates.h |
| index 496cf427337664d82ed499412e67168af14f8f5b..c63bfdabe19f9ea34721212e3f4af22d1cb89aed 100644 |
| --- a/include/private/SkTemplates.h |
| +++ b/include/private/SkTemplates.h |
| @@ -195,13 +195,13 @@ public: |
| } |
| if (fCount != count) { |
| - if (fCount > N) { |
| + if (fCount > N_ADJ) { |
|
mtklein
2016/02/02 03:04:29
Ditto here. It just seems easy to accidentally us
dogben
2016/02/02 19:39:34
Done. I made the naming consistent with SkAutoSMal
|
| // 'fArray' was allocated last time so free it now |
| SkASSERT((T*) fStorage != fArray); |
| sk_free(fArray); |
| } |
| - if (count > N) { |
| + if (count > N_ADJ) { |
| const uint64_t size64 = sk_64_mul(count, sizeof(T)); |
| const size_t size = static_cast<size_t>(size64); |
| if (size != size64) { |
| @@ -240,10 +240,19 @@ public: |
| } |
| private: |
| +#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 int MAX_BYTES = 4 * 1024; |
| + static const int N_ADJ = N * sizeof(T) > MAX_BYTES ? MAX_BYTES / sizeof(T) : N; |
| +#else |
| + static const int N_ADJ = N; |
| +#endif |
| + |
| int fCount; |
| T* fArray; |
| // since we come right after fArray, fStorage should be properly aligned |
| - char fStorage[N * sizeof(T)]; |
| + char fStorage[N_ADJ * sizeof(T)]; |
| }; |
| /** Manages an array of T elements, freeing the array in the destructor. |
| @@ -322,7 +331,7 @@ public: |
| SkAutoSTMalloc() : fPtr(fTStorage) {} |
| SkAutoSTMalloc(size_t count) { |
| - if (count > N) { |
| + if (count > N_ADJ) { |
| fPtr = (T*)sk_malloc_flags(count * sizeof(T), SK_MALLOC_THROW | SK_MALLOC_TEMP); |
| } else { |
| fPtr = fTStorage; |
| @@ -340,7 +349,7 @@ public: |
| if (fPtr != fTStorage) { |
| sk_free(fPtr); |
| } |
| - if (count > N) { |
| + if (count > N_ADJ) { |
| fPtr = (T*)sk_malloc_throw(count * sizeof(T)); |
| } else { |
| fPtr = fTStorage; |
| @@ -368,10 +377,10 @@ public: |
| // Reallocs the array, can be used to shrink the allocation. Makes no attempt to be intelligent |
| void realloc(size_t count) { |
| - if (count > N) { |
| + if (count > N_ADJ) { |
| if (fPtr == fTStorage) { |
| fPtr = (T*)sk_malloc_throw(count * sizeof(T)); |
| - memcpy(fPtr, fTStorage, N * sizeof(T)); |
| + memcpy(fPtr, fTStorage, N_ADJ * sizeof(T)); |
| } else { |
| fPtr = (T*)sk_realloc_throw(fPtr, count * sizeof(T)); |
| } |
| @@ -381,9 +390,20 @@ public: |
| } |
| private: |
| + // Since we use uint32_t storage, we might be able to get more elements for free. |
| + static const size_t N_WITH_PADDING = (((N*sizeof(T) + 3) >> 2) << 2) / sizeof(T); |
| +#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 MAX_BYTES = 4 * 1024; |
| + static const size_t N_ADJ = N * sizeof(T) > MAX_BYTES ? MAX_BYTES / sizeof(T) : N_WITH_PADDING; |
| +#else |
| + static const size_t N_ADJ = N_WITH_PADDING; |
| +#endif |
| + |
| T* fPtr; |
| union { |
| - uint32_t fStorage32[(N*sizeof(T) + 3) >> 2]; |
| + uint32_t fStorage32[(N_ADJ*sizeof(T) + 3) >> 2]; |
| T fTStorage[1]; // do NOT want to invoke T::T() |
| }; |
| }; |