Skip to content

Commit

Permalink
fix: ensure external memory adjustments are balanced (#33312)
Browse files Browse the repository at this point in the history
  • Loading branch information
dsanders11 committed Mar 17, 2022
1 parent a3d4c4e commit 2b5c403
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 7 deletions.
17 changes: 11 additions & 6 deletions shell/common/api/electron_api_native_image.cc
Expand Up @@ -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 defined(OS_WIN)
Expand All @@ -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
Expand Down
3 changes: 2 additions & 1 deletion shell/common/api/electron_api_native_image.h
Expand Up @@ -117,7 +117,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);
Expand All @@ -132,6 +132,7 @@ class NativeImage : public gin::Wrappable<NativeImage> {
gfx::Image image_;

v8::Isolate* isolate_;
int32_t memory_usage_ = 0;

DISALLOW_COPY_AND_ASSIGN(NativeImage);
};
Expand Down

0 comments on commit 2b5c403

Please sign in to comment.