diff options
-rw-r--r-- | src/core/SkVarAlloc.cpp | 13 | ||||
-rw-r--r-- | src/core/SkVarAlloc.h | 2 |
2 files changed, 12 insertions, 3 deletions
diff --git a/src/core/SkVarAlloc.cpp b/src/core/SkVarAlloc.cpp index cc1fc1c734..6f5b5a18d3 100644 --- a/src/core/SkVarAlloc.cpp +++ b/src/core/SkVarAlloc.cpp @@ -7,6 +7,11 @@ #include <malloc.h> #endif +enum { + kMinLgSize = 4, // The smallest block we'd ever want to allocate is 16B, + kMaxLgSize = 16, // and we see no benefit allocating blocks larger than 64K. +}; + struct SkVarAlloc::Block { Block* prev; char* data() { return (char*)(this + 1); } @@ -22,7 +27,7 @@ struct SkVarAlloc::Block { SkVarAlloc::SkVarAlloc() : fByte(NULL) , fRemaining(0) - , fLgMinSize(4) + , fLgSize(kMinLgSize) , fBlock(NULL) {} SkVarAlloc::~SkVarAlloc() { @@ -37,7 +42,7 @@ SkVarAlloc::~SkVarAlloc() { void SkVarAlloc::makeSpace(size_t bytes, unsigned flags) { SkASSERT(SkIsAlignPtr(bytes)); - size_t alloc = 1<<(fLgMinSize++); + size_t alloc = 1<<fLgSize; while (alloc < bytes + sizeof(Block)) { alloc *= 2; } @@ -45,6 +50,10 @@ void SkVarAlloc::makeSpace(size_t bytes, unsigned flags) { fByte = fBlock->data(); fRemaining = alloc - sizeof(Block); + if (fLgSize < kMaxLgSize) { + fLgSize++; + } + #if defined(SK_BUILD_FOR_MAC) SkASSERT(alloc == malloc_good_size(alloc)); #elif defined(SK_BUILD_FOR_LINUX) diff --git a/src/core/SkVarAlloc.h b/src/core/SkVarAlloc.h index 19b2d75e76..2b5401b7f0 100644 --- a/src/core/SkVarAlloc.h +++ b/src/core/SkVarAlloc.h @@ -28,7 +28,7 @@ private: char* fByte; unsigned fRemaining; - unsigned fLgMinSize; + unsigned fLgSize; // This is always in the range [4, 16], so it really only needs 4 bits. struct Block; Block* fBlock; |