fix: ensure external memory adjustments are balanced (#33266)

This commit is contained in:
David Sanders 2022-03-16 10:54:30 -07:00 коммит произвёл GitHub
Родитель cf3ee7be56
Коммит 652680e801
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 13 добавлений и 7 удалений

Просмотреть файл

@ -109,7 +109,7 @@ base::win::ScopedHICON ReadICOFromPath(int size, const base::FilePath& path) {
NativeImage::NativeImage(v8::Isolate* isolate, const gfx::Image& image)
: image_(image), isolate_(isolate) {
AdjustAmountOfExternalAllocatedMemory(true);
UpdateExternalAllocatedMemoryUsage();
}
#if BUILDFLAG(IS_WIN)
@ -120,22 +120,27 @@ NativeImage::NativeImage(v8::Isolate* isolate, const base::FilePath& hicon_path)
electron::util::ReadImageSkiaFromICO(&image_skia, GetHICON(256));
image_ = gfx::Image(image_skia);
AdjustAmountOfExternalAllocatedMemory(true);
UpdateExternalAllocatedMemoryUsage();
}
#endif
NativeImage::~NativeImage() {
AdjustAmountOfExternalAllocatedMemory(false);
isolate_->AdjustAmountOfExternalAllocatedMemory(-memory_usage_);
}
void NativeImage::AdjustAmountOfExternalAllocatedMemory(bool add) {
void NativeImage::UpdateExternalAllocatedMemoryUsage() {
int32_t new_memory_usage = 0;
if (image_.HasRepresentation(gfx::Image::kImageRepSkia)) {
auto* const image_skia = image_.ToImageSkia();
if (!image_skia->isNull()) {
int64_t size = image_skia->bitmap()->computeByteSize();
isolate_->AdjustAmountOfExternalAllocatedMemory(add ? size : -size);
new_memory_usage = image_skia->bitmap()->computeByteSize();
}
}
isolate_->AdjustAmountOfExternalAllocatedMemory(new_memory_usage -
memory_usage_);
memory_usage_ = new_memory_usage;
}
// static

Просмотреть файл

@ -121,7 +121,7 @@ class NativeImage : public gin::Wrappable<NativeImage> {
float GetAspectRatio(const absl::optional<float> scale_factor);
void AddRepresentation(const gin_helper::Dictionary& options);
void AdjustAmountOfExternalAllocatedMemory(bool add);
void UpdateExternalAllocatedMemoryUsage();
// Mark the image as template image.
void SetTemplateImage(bool setAsTemplate);
@ -136,6 +136,7 @@ class NativeImage : public gin::Wrappable<NativeImage> {
gfx::Image image_;
v8::Isolate* isolate_;
int32_t memory_usage_ = 0;
};
} // namespace api