aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkStream.cpp
diff options
context:
space:
mode:
authorGravatar Hal Canary <halcanary@google.com>2017-03-14 15:52:12 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-03-15 12:54:49 +0000
commitdabe8acb7f89806dc6808d3ce913dc3d190c7e81 (patch)
treecfee448aacc53c700eede1d39c664614d3f5a19e /src/core/SkStream.cpp
parent63954c9944a5eed4527e0ed368f4e501faf2c625 (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.cpp22
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;
}