From dc846a20ca979695edb6105afd1ebd785a5e4f2f Mon Sep 17 00:00:00 2001 From: hyunho Date: Thu, 25 Jul 2019 15:13:45 +0900 Subject: [PATCH] Fix buffer leak The latest buffer should be released when the bind process begin. If not latest buffer will be possessed until the window is unbinded. Change-Id: I95e23c6a3088e4222e1b6f152e718d612450843e Signed-off-by: hyunho --- screen_connector_remote_surface/buffer_event_interface.h | 1 + screen_connector_remote_surface/remote_surface.cc | 4 ++++ screen_connector_remote_surface/remote_surface.h | 1 + screen_connector_remote_surface_evas/image.cc | 5 +++++ screen_connector_remote_surface_evas/image_internal.h | 1 + screen_connector_remote_surface_evas/remote_surface_evas.cc | 7 +++++++ screen_connector_remote_surface_evas/remote_surface_evas.h | 1 + screen_connector_watcher_evas/src/screen_connector_toolkit_evas.cc | 2 ++ 8 files changed, 22 insertions(+) diff --git a/screen_connector_remote_surface/buffer_event_interface.h b/screen_connector_remote_surface/buffer_event_interface.h index 93d6b05..86123c7 100644 --- a/screen_connector_remote_surface/buffer_event_interface.h +++ b/screen_connector_remote_surface/buffer_event_interface.h @@ -33,6 +33,7 @@ class EXPORT_API IBufferEvent { const std::string& instId, int pid) = 0; virtual void OnBufferChanged(int type, std::shared_ptr tbm, int fd, uint32_t size, uint32_t time) = 0; + virtual void OnBind() = 0; }; } // namespace screen_connector diff --git a/screen_connector_remote_surface/remote_surface.cc b/screen_connector_remote_surface/remote_surface.cc index 7fd2bbd..1bea25f 100644 --- a/screen_connector_remote_surface/remote_surface.cc +++ b/screen_connector_remote_surface/remote_surface.cc @@ -231,6 +231,7 @@ void RemoteSurface::Bind(std::shared_ptr surface) { SendTouchCancel(); RemoteSurfaceManager::GetInst().Bind(*(impl_->surface_), *surface); impl_->bind_surface_ = surface; + OnBind(); } void RemoteSurface::Unbind() { @@ -281,6 +282,9 @@ void RemoteSurface::OnBufferChanged(int type, std::shared_ptr tbm, int fd, uint32_t size, uint32_t time) { } +void RemoteSurface::OnBind() { +} + const std::string& RemoteSurface::GetAppId() const { return impl_->app_id_; } diff --git a/screen_connector_remote_surface/remote_surface.h b/screen_connector_remote_surface/remote_surface.h index ec2779a..baa1265 100644 --- a/screen_connector_remote_surface/remote_surface.h +++ b/screen_connector_remote_surface/remote_surface.h @@ -90,6 +90,7 @@ class EXPORT_API RemoteSurface : public IBufferEvent { const std::string& instId, int pid) override; void OnBufferChanged(int type, std::shared_ptr tbm, int fd, uint32_t size, uint32_t time) override; + void OnBind() override; static void SetDelayedResumingTime(uint32_t ms); static void InitManager(); diff --git a/screen_connector_remote_surface_evas/image.cc b/screen_connector_remote_surface_evas/image.cc index d38320f..28642b2 100644 --- a/screen_connector_remote_surface_evas/image.cc +++ b/screen_connector_remote_surface_evas/image.cc @@ -177,6 +177,11 @@ void Image::MoveCB(void* data, Evas* e, Evas_Object* obj, void* eventInfo) { img->listener_->OnMove(*img, eventInfo); } +void Image::ClearTbm() { + LOGI("clear tbm"); + prev_buf_.reset(); +} + void Image::Update(std::shared_ptr tbm) { int width; int height; diff --git a/screen_connector_remote_surface_evas/image_internal.h b/screen_connector_remote_surface_evas/image_internal.h index ef94fa1..4b9f658 100644 --- a/screen_connector_remote_surface_evas/image_internal.h +++ b/screen_connector_remote_surface_evas/image_internal.h @@ -47,6 +47,7 @@ class Image : public EvasObject { virtual ~Image(); virtual void Update(std::shared_ptr tbm); + void ClearTbm(); private: static void MouseInCB(void* data, Evas* e, Evas_Object* obj, void* eventInfo); diff --git a/screen_connector_remote_surface_evas/remote_surface_evas.cc b/screen_connector_remote_surface_evas/remote_surface_evas.cc index b86d960..701e1be 100644 --- a/screen_connector_remote_surface_evas/remote_surface_evas.cc +++ b/screen_connector_remote_surface_evas/remote_surface_evas.cc @@ -459,6 +459,10 @@ void RemoteSurfaceEvas::OnBufferRemoved(const std::string& appId, impl_->winVisibility_map_.clear(); } +void RemoteSurfaceEvas::OnBind() { + impl_->img_tbm_->ClearTbm(); +} + void RemoteSurfaceEvas::OnBufferChanged(int type, std::shared_ptr tbm, int fd, uint32_t size, uint32_t time) { bool isAdded = false; @@ -466,6 +470,9 @@ void RemoteSurfaceEvas::OnBufferChanged(int type, std::shared_ptr tbm, if (type != TIZEN_REMOTE_SURFACE_BUFFER_TYPE_TBM) return; + if (GetType() == RemoteSurface::WATCH && RemoteSurface::IsBound()) + return; + if (impl_->img_tbm_.get() == nullptr) { LOGD("first added !!!! %d %s", type, GetAppId().c_str()); impl_->winVisibility_map_.clear(); diff --git a/screen_connector_remote_surface_evas/remote_surface_evas.h b/screen_connector_remote_surface_evas/remote_surface_evas.h index 55acd13..d55ee2b 100644 --- a/screen_connector_remote_surface_evas/remote_surface_evas.h +++ b/screen_connector_remote_surface_evas/remote_surface_evas.h @@ -62,6 +62,7 @@ class EXPORT_API RemoteSurfaceEvas : public RemoteSurface, public IEvasEvent { int pid) override; void OnBufferChanged(int type, std::shared_ptr tbm, int fd, uint32_t size, uint32_t time) override; + void OnBind() override; void OnEvasAdded(const std::string& appId, const std::string& instId, int pid, const EvasObject& image) override; void OnEvasRemoved(const std::string& appId, const std::string& instId, diff --git a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.cc b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.cc index 97237a3..664ff9d 100644 --- a/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.cc +++ b/screen_connector_watcher_evas/src/screen_connector_toolkit_evas.cc @@ -398,6 +398,7 @@ screen_connector_toolkit_evas_bind(screen_connector_toolkit_evas_h h, if (!rs) return -1; + LOGI("bind window"); rs->Bind(screen_connector::EvasObject(win, false)); return 0; @@ -411,6 +412,7 @@ screen_connector_toolkit_evas_unbind(screen_connector_toolkit_evas_h h) { if (!rs) return -1; + LOGI("bind window"); rs->Unbind(); return 0; -- 2.7.4