Reviewers: dmurph
CL:
https://codereview.chromium.org/2837873007/https://codereview.chromium.org/2837873007/diff/1/third_party/WebKit/Source/core/fileapi/FileReaderLoader.cppFile third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp
(right):
https://codereview.chromium.org/2837873007/diff/1/third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp#newcode353third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp:353:
ReportAdditionalMemoryUsageToV8(string_result_.CharactersSizeInBytes());
Hmmm... I think this can miss reporting the the string result in some
cases where the result is sample prior to load completion. I'm not sure
how much accuracy matters though?
We could dbl count the raw data bytes appended and not even try to count
the string_result_ independently. That would error on the side of
over-reporting rather than under-reporting which might be a better
compromise. Assuming somewhat over-reporting is not a problem, I think
I'd prefer that to a bunch of code to perform careful accounting for the
string_result_.
wdyt?
Description:
Tell V8 about the extra memory being held by FileReader objects.
BUG=114548
Affected files (+23, -0 lines):
M third_party/WebKit/Source/core/fileapi/FileReaderLoader.h
M third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp
Index: third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp
diff --git a/third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp b/third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp
index d0e1b24c2d903d35d7c45a57fef9bfe7281ea8a8..653ccd9cc0cbd35c8929a76182abf8fe53460e4a 100644
--- a/third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp
+++ b/third_party/WebKit/Source/core/fileapi/FileReaderLoader.cpp
@@ -50,6 +50,7 @@
#include "platform/wtf/text/Base64.h"
#include "platform/wtf/text/StringBuilder.h"
#include "public/platform/WebURLRequest.h"
+#include "v8/include/v8.h"
namespace blink {
@@ -69,6 +70,7 @@ FileReaderLoader::FileReaderLoader(ReadType read_type,
FileReaderLoader::~FileReaderLoader() {
Cleanup();
+ UnreportMemoryUsageToV8();
if (!url_for_reading_.IsEmpty()) {
BlobRegistry::RevokePublicBlobURL(url_for_reading_);
}
@@ -143,9 +145,23 @@ void FileReaderLoader::Cleanup() {
string_result_ = "";
is_raw_data_converted_ = true;
decoder_.reset();
+ UnreportMemoryUsageToV8();
}
}
+void FileReaderLoader::ReportAdditionalMemoryUsageToV8(int64_t usage) {
+ memory_usage_reported_to_v8_ += usage;
+ v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(usage);
+}
+
+void FileReaderLoader::UnreportMemoryUsageToV8() {
+ if (!memory_usage_reported_to_v8_)
+ return;
+ v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(
+ -memory_usage_reported_to_v8_);
+ memory_usage_reported_to_v8_ = 0;
+}
+
void FileReaderLoader::DidReceiveResponse(
unsigned long,
const ResourceResponse& response,
@@ -230,6 +246,7 @@ void FileReaderLoader::DidReceiveData(const char* data, unsigned data_length) {
}
bytes_loaded_ += bytes_appended;
is_raw_data_converted_ = false;
+ ReportAdditionalMemoryUsageToV8(bytes_appended);
if (client_)
client_->DidReceiveData();
@@ -332,6 +349,8 @@ String FileReaderLoader::StringResult() {
NOTREACHED();
}
+ if (finished_loading_)
+ ReportAdditionalMemoryUsageToV8(string_result_.CharactersSizeInBytes());
return string_result_;
}
Index: third_party/WebKit/Source/core/fileapi/FileReaderLoader.h
diff --git a/third_party/WebKit/Source/core/fileapi/FileReaderLoader.h b/third_party/WebKit/Source/core/fileapi/FileReaderLoader.h
index 3bccac7eeacccfcaf26395af2c450ba5a282da33..a481f5b96751c602e332acbcdc2ea8a809d5cf7d 100644
--- a/third_party/WebKit/Source/core/fileapi/FileReaderLoader.h
+++ b/third_party/WebKit/Source/core/fileapi/FileReaderLoader.h
@@ -112,6 +112,8 @@ class CORE_EXPORT FileReaderLoader final : public ThreadableLoaderClient {
FileReaderLoader(ReadType, FileReaderLoaderClient*);
void Cleanup();
+ void ReportAdditionalMemoryUsageToV8(int64_t usage);
+ void UnreportMemoryUsageToV8();
void Failed(FileError::ErrorCode);
void ConvertToText();
@@ -150,6 +152,8 @@ class CORE_EXPORT FileReaderLoader final : public ThreadableLoaderClient {
unsigned range_end_;
FileError::ErrorCode error_code_;
+
+ int64_t memory_usage_reported_to_v8_ = 0;
};
} // namespace blink