diff options
author | Hal Canary <halcanary@google.com> | 2017-03-14 15:52:12 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-03-15 12:54:49 +0000 |
commit | dabe8acb7f89806dc6808d3ce913dc3d190c7e81 (patch) | |
tree | cfee448aacc53c700eede1d39c664614d3f5a19e /src/core/SkStream.cpp | |
parent | 63954c9944a5eed4527e0ed368f4e501faf2c625 (diff) |
SkDynamicMemoryWStream::detachAsData more memory efficent
I did some testing with very large datasets, and the difference in max
RSS is measurable and significant.
Change-Id: I6bb2f795d5b4f6ebdba42c3089dc85a278355d48
Reviewed-on: https://skia-review.googlesource.com/9686
Commit-Queue: Hal Canary <halcanary@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
Diffstat (limited to 'src/core/SkStream.cpp')
-rw-r--r-- | src/core/SkStream.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/core/SkStream.cpp b/src/core/SkStream.cpp index 1435dab235..133df83078 100644 --- a/src/core/SkStream.cpp +++ b/src/core/SkStream.cpp @@ -570,15 +570,31 @@ void SkDynamicMemoryWStream::padToAlign4() { } } + +void SkDynamicMemoryWStream::copyToAndReset(void* ptr) { + // By looping through the source and freeing as we copy, we + // can reduce real memory use with large streams. + char* dst = reinterpret_cast<char*>(ptr); + Block* block = fHead; + while (block != nullptr) { + size_t len = block->written(); + memcpy(dst, block->start(), len); + dst += len; + Block* next = block->fNext; + sk_free(block); + block = next; + } + fHead = fTail = nullptr; + fBytesWrittenBeforeTail = 0; +} + sk_sp<SkData> SkDynamicMemoryWStream::detachAsData() { const size_t size = this->bytesWritten(); if (0 == size) { return SkData::MakeEmpty(); } - sk_sp<SkData> data = SkData::MakeUninitialized(size); - this->copyTo(data->writable_data()); - this->reset(); // this is the "detach" part + this->copyToAndReset(data->writable_data()); return data; } |