From ff48ddb68f64d108cd0f0cf155a045a621caeef1 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Tue, 10 Nov 2015 16:31:50 -0800 Subject: [PATCH] Add the ability to dispose host objects Some host objects hold on to a lot of state and take time to tear down. This patch adds the ability to dispose them eagerly to release resources faster. --- sky/engine/core/compositing/Scene.cpp | 4 ++++ sky/engine/core/compositing/Scene.h | 2 ++ sky/engine/core/compositing/Scene.idl | 1 + sky/engine/core/compositing/SceneBuilder.cpp | 4 +++- sky/engine/core/painting/CanvasImage.cpp | 4 ++++ sky/engine/core/painting/CanvasImage.h | 1 + sky/engine/core/painting/Image.idl | 2 ++ sky/engine/core/painting/Picture.cpp | 5 +++++ sky/engine/core/painting/Picture.h | 1 + sky/engine/core/painting/Picture.idl | 2 ++ sky/engine/core/painting/PictureRecorder.cpp | 4 ++++ sky/engine/core/painting/PictureRecorder.idl | 1 - sky/engine/tonic/dart_wrappable.cc | 10 ++++++++++ sky/engine/tonic/dart_wrappable.h | 1 + sky/shell/ui/engine.cc | 4 ++-- 15 files changed, 42 insertions(+), 4 deletions(-) diff --git a/sky/engine/core/compositing/Scene.cpp b/sky/engine/core/compositing/Scene.cpp index 2d2fd29aebf..e03f6b58ff4 100644 --- a/sky/engine/core/compositing/Scene.cpp +++ b/sky/engine/core/compositing/Scene.cpp @@ -25,6 +25,10 @@ Scene::Scene(std::unique_ptr rootLayer, Scene::~Scene() {} +void Scene::dispose() { + ClearDartWrapper(); +} + std::unique_ptr Scene::takeLayerTree() { return std::move(m_layerTree); } diff --git a/sky/engine/core/compositing/Scene.h b/sky/engine/core/compositing/Scene.h index 98516d90bf0..f80523a88d7 100644 --- a/sky/engine/core/compositing/Scene.h +++ b/sky/engine/core/compositing/Scene.h @@ -28,6 +28,8 @@ class Scene : public RefCounted, public DartWrappable { std::unique_ptr takeLayerTree(); + void dispose(); + private: explicit Scene(std::unique_ptr rootLayer, uint32_t rasterizerTracingThreshold); diff --git a/sky/engine/core/compositing/Scene.idl b/sky/engine/core/compositing/Scene.idl index 359eed344ad..e3e8f0ea348 100644 --- a/sky/engine/core/compositing/Scene.idl +++ b/sky/engine/core/compositing/Scene.idl @@ -4,4 +4,5 @@ // An opaque handle to a composited scene. interface Scene { + void dispose(); }; diff --git a/sky/engine/core/compositing/SceneBuilder.cpp b/sky/engine/core/compositing/SceneBuilder.cpp index 862ef888533..c81644239c0 100644 --- a/sky/engine/core/compositing/SceneBuilder.cpp +++ b/sky/engine/core/compositing/SceneBuilder.cpp @@ -131,7 +131,9 @@ PassRefPtr SceneBuilder::build() m_currentLayer = nullptr; int32_t threshold = m_currentRasterizerTracingThreshold; m_currentRasterizerTracingThreshold = 0; - return Scene::create(std::move(m_rootLayer), threshold); + RefPtr scene = Scene::create(std::move(m_rootLayer), threshold); + ClearDartWrapper(); + return scene.release(); } } // namespace blink diff --git a/sky/engine/core/painting/CanvasImage.cpp b/sky/engine/core/painting/CanvasImage.cpp index 3e105d97b34..f63a4ed955d 100644 --- a/sky/engine/core/painting/CanvasImage.cpp +++ b/sky/engine/core/painting/CanvasImage.cpp @@ -20,4 +20,8 @@ int CanvasImage::height() const { return image_->height(); } +void CanvasImage::dispose() { + ClearDartWrapper(); +} + } // namespace blink diff --git a/sky/engine/core/painting/CanvasImage.h b/sky/engine/core/painting/CanvasImage.h index a802bf80e5f..2ab9f87cdc6 100644 --- a/sky/engine/core/painting/CanvasImage.h +++ b/sky/engine/core/painting/CanvasImage.h @@ -20,6 +20,7 @@ class CanvasImage final : public RefCounted, int width() const; int height() const; + void dispose(); SkImage* image() const { return image_.get(); } void setImage(PassRefPtr image) { image_ = image; } diff --git a/sky/engine/core/painting/Image.idl b/sky/engine/core/painting/Image.idl index c1d9e6a4ee5..deed739872b 100644 --- a/sky/engine/core/painting/Image.idl +++ b/sky/engine/core/painting/Image.idl @@ -9,4 +9,6 @@ // TODO(ianh): convert this to a Size readonly attribute long width; // width in number of image pixels readonly attribute long height; // height in number of image pixels + + void dispose(); }; diff --git a/sky/engine/core/painting/Picture.cpp b/sky/engine/core/painting/Picture.cpp index e59ca8815b9..099d1fa3b98 100644 --- a/sky/engine/core/painting/Picture.cpp +++ b/sky/engine/core/painting/Picture.cpp @@ -28,4 +28,9 @@ void Picture::playback(Canvas* canvas) m_picture->playback(canvas->skCanvas()); } +void Picture::dispose() +{ + ClearDartWrapper(); +} + } // namespace blink diff --git a/sky/engine/core/painting/Picture.h b/sky/engine/core/painting/Picture.h index 6d61bc52b0c..5c990b0c644 100644 --- a/sky/engine/core/painting/Picture.h +++ b/sky/engine/core/painting/Picture.h @@ -23,6 +23,7 @@ public: SkPicture* toSkia() const { return m_picture.get(); } void playback(Canvas* canvas); + void dispose(); private: explicit Picture(PassRefPtr skPicture); diff --git a/sky/engine/core/painting/Picture.idl b/sky/engine/core/painting/Picture.idl index 277bdbd0617..646b99eff4c 100644 --- a/sky/engine/core/painting/Picture.idl +++ b/sky/engine/core/painting/Picture.idl @@ -7,4 +7,6 @@ interface Picture { // canvas. Using the Canvas drawPicture entry point gives the destination // canvas the option of just taking a ref. void playback(Canvas canvas); + + void dispose(); }; diff --git a/sky/engine/core/painting/PictureRecorder.cpp b/sky/engine/core/painting/PictureRecorder.cpp index 142962bccf7..b9346b23387 100644 --- a/sky/engine/core/painting/PictureRecorder.cpp +++ b/sky/engine/core/painting/PictureRecorder.cpp @@ -34,7 +34,9 @@ PassRefPtr PictureRecorder::endRecording() RefPtr picture = Picture::create( adoptRef(m_pictureRecorder.endRecording())); m_canvas->clearSkCanvas(); + m_canvas->ClearDartWrapper(); m_canvas = nullptr; + ClearDartWrapper(); return picture.release(); } @@ -45,7 +47,9 @@ PassRefPtr PictureRecorder::endRecordingAsDrawable() RefPtr drawable = Drawable::create( adoptRef(m_pictureRecorder.endRecordingAsDrawable())); m_canvas->clearSkCanvas(); + m_canvas->ClearDartWrapper(); m_canvas = nullptr; + ClearDartWrapper(); return drawable.release(); } diff --git a/sky/engine/core/painting/PictureRecorder.idl b/sky/engine/core/painting/PictureRecorder.idl index b5286f906aa..0e9d1e3702a 100644 --- a/sky/engine/core/painting/PictureRecorder.idl +++ b/sky/engine/core/painting/PictureRecorder.idl @@ -4,7 +4,6 @@ [ Constructor() ] interface PictureRecorder { - readonly attribute boolean isRecording; Picture endRecording(); Drawable endRecordingAsDrawable(); }; diff --git a/sky/engine/tonic/dart_wrappable.cc b/sky/engine/tonic/dart_wrappable.cc index f4640c0c7b8..98f93b767b8 100644 --- a/sky/engine/tonic/dart_wrappable.cc +++ b/sky/engine/tonic/dart_wrappable.cc @@ -63,6 +63,16 @@ void DartWrappable::AssociateWithDartWrapper(Dart_NativeArguments args) { wrapper, this, info.size_in_bytes, &FinalizeDartWrapper); } +void DartWrappable::ClearDartWrapper() { + DCHECK(dart_wrapper_); + Dart_Handle wrapper = Dart_HandleFromWeakPersistent(dart_wrapper_); + CHECK(!LogIfError(Dart_SetNativeInstanceField(wrapper, kPeerIndex, 0))); + CHECK(!LogIfError(Dart_SetNativeInstanceField(wrapper, kWrapperInfoIndex, 0))); + Dart_DeleteWeakPersistentHandle(Dart_CurrentIsolate(), dart_wrapper_); + dart_wrapper_ = nullptr; + GetDartWrapperInfo().deref_object(this); +} + void DartWrappable::FinalizeDartWrapper(void* isolate_callback_data, Dart_WeakPersistentHandle wrapper, void* peer) { diff --git a/sky/engine/tonic/dart_wrappable.h b/sky/engine/tonic/dart_wrappable.h index 687a07ceb2e..2a1add9916c 100644 --- a/sky/engine/tonic/dart_wrappable.h +++ b/sky/engine/tonic/dart_wrappable.h @@ -41,6 +41,7 @@ class DartWrappable { Dart_Handle CreateDartWrapper(DartState* dart_state); void AssociateWithDartWrapper(Dart_NativeArguments args); + void ClearDartWrapper(); // Warning: Might delete this. Dart_WeakPersistentHandle dart_wrapper() const { return dart_wrapper_; } protected: diff --git a/sky/shell/ui/engine.cc b/sky/shell/ui/engine.cc index 619a59eee3b..c1883fddf29 100644 --- a/sky/shell/ui/engine.cc +++ b/sky/shell/ui/engine.cc @@ -13,15 +13,15 @@ #include "mojo/data_pipe_utils/data_pipe_utils.h" #include "mojo/public/cpp/application/connect.h" #include "services/asset_bundle/asset_unpacker_job.h" +#include "sky/engine/public/platform/sky_display_metrics.h" #include "sky/engine/public/platform/WebInputEvent.h" -#include "sky/engine/public/platform/sky_display_metrics.h" -#include "sky/engine/public/platform/sky_display_metrics.h" #include "sky/engine/public/web/Sky.h" #include "sky/engine/public/web/WebRuntimeFeatures.h" #include "sky/shell/dart/dart_library_provider_files.h" #include "sky/shell/dart/dart_library_provider_network.h" #include "sky/shell/service_provider.h" #include "sky/shell/switches.h" +#include "sky/shell/switches.h" #include "sky/shell/ui/animator.h" #include "sky/shell/ui/internals.h" #include "sky/shell/ui/platform_impl.h"