From 01633207cabcafdaf078e7264c70c2c49f04be7a Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Wed, 14 Nov 2018 21:51:24 +0900 Subject: [PATCH] evas ector: fix memory leaks. Summary: Make it sure ref/unref pairs. unpaired reference count occures object dangled. @fix Reviewers: #committers Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D7270 --- src/lib/ector/ector_renderer_gradient.c | 8 ++++ src/lib/ector/ector_renderer_gradient.eo | 3 +- src/lib/ector/ector_renderer_shape.c | 12 ++++++ src/lib/ector/ector_renderer_shape.eo | 47 +++++++++++++----------- src/lib/evas/canvas/evas_vg_shape.c | 6 ++- 5 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/lib/ector/ector_renderer_gradient.c b/src/lib/ector/ector_renderer_gradient.c index a3e393a7d3..8ba3ba3fec 100644 --- a/src/lib/ector/ector_renderer_gradient.c +++ b/src/lib/ector/ector_renderer_gradient.c @@ -7,6 +7,8 @@ #include "ector_private.h" +#define MY_CLASS ECTOR_RENDERER_GRADIENT_MIXIN + static void _ector_renderer_gradient_efl_gfx_gradient_stop_set(Eo *obj EINA_UNUSED, Ector_Renderer_Gradient_Data *pd, @@ -49,5 +51,11 @@ _ector_renderer_gradient_efl_gfx_gradient_spread_get(const Eo *obj EINA_UNUSED, return pd->s; } +static void +_ector_renderer_gradient_efl_object_invalidate(Eo *obj EINA_UNUSED, + Ector_Renderer_Gradient_Data *pd) +{ + if (pd->colors) free(pd->colors); +} #include "ector_renderer_gradient.eo.c" diff --git a/src/lib/ector/ector_renderer_gradient.eo b/src/lib/ector/ector_renderer_gradient.eo index 045c005f7f..f19aa83147 100644 --- a/src/lib/ector/ector_renderer_gradient.eo +++ b/src/lib/ector/ector_renderer_gradient.eo @@ -1,9 +1,10 @@ -mixin Ector.Renderer.Gradient (Efl.Gfx.Gradient) +mixin Ector.Renderer.Gradient (Efl.Gfx.Gradient, Efl.Object) { [[Ector gradient renderer mixin]] eo_prefix: ector_renderer_gradient; implements { Efl.Gfx.Gradient.stop { get; set; } Efl.Gfx.Gradient.spread { get; set; } + Efl.Object.invalidate; } } diff --git a/src/lib/ector/ector_renderer_shape.c b/src/lib/ector/ector_renderer_shape.c index 162add2613..628acb6d61 100644 --- a/src/lib/ector/ector_renderer_shape.c +++ b/src/lib/ector/ector_renderer_shape.c @@ -7,6 +7,8 @@ #include "ector_private.h" +#define MY_CLASS ECTOR_RENDERER_SHAPE_MIXIN + static void _ector_renderer_shape_fill_set(Eo *obj EINA_UNUSED, Ector_Renderer_Shape_Data *pd, @@ -52,4 +54,14 @@ _ector_renderer_shape_stroke_marker_get(const Eo *obj EINA_UNUSED, return pd->stroke.marker; } +static void +_ector_renderer_shape_efl_object_invalidate(Eo *obj EINA_UNUSED, + Ector_Renderer_Shape_Data *pd) +{ + if (pd->fill) efl_unref(pd->fill); + if (pd->stroke.fill) efl_unref(pd->stroke.fill); + if (pd->stroke.marker) efl_unref(pd->stroke.marker); +} + + #include "ector_renderer_shape.eo.c" diff --git a/src/lib/ector/ector_renderer_shape.eo b/src/lib/ector/ector_renderer_shape.eo index 1a1a9ae240..0206b1afcf 100644 --- a/src/lib/ector/ector_renderer_shape.eo +++ b/src/lib/ector/ector_renderer_shape.eo @@ -1,39 +1,42 @@ import ector_renderer; -mixin Ector.Renderer.Shape (Efl.Gfx.Shape) +mixin Ector.Renderer.Shape (Efl.Gfx.Shape, Efl.Object) { [[Ector shape renderer mixin]] eo_prefix: ector_renderer_shape; methods { @property fill { - [[Fill property]] + [[Fill property]] set { - } - get { - } - values { - r: const(Ector.Renderer); [[Ector fill renderer]] - } + } + get { + } + values { + r: const(Ector.Renderer); [[Ector fill renderer]] + } } @property stroke_fill { - [[Stroke fill property]] + [[Stroke fill property]] set { - } - get { - } - values { - r: const(Ector.Renderer); [[Ector stroke fill renderer]] - } + } + get { + } + values { + r: const(Ector.Renderer); [[Ector stroke fill renderer]] + } } @property stroke_marker { - [[Stroke marker property]] + [[Stroke marker property]] set { - } - get { - } - values { - r: const(Ector.Renderer); [[Ector stroke marker renderer]] - } + } + get { + } + values { + r: const(Ector.Renderer); [[Ector stroke marker renderer]] + } } } + implements { + Efl.Object.invalidate; + } } diff --git a/src/lib/evas/canvas/evas_vg_shape.c b/src/lib/evas/canvas/evas_vg_shape.c index 24cc485944..49ea67ff6e 100644 --- a/src/lib/evas/canvas/evas_vg_shape.c +++ b/src/lib/evas/canvas/evas_vg_shape.c @@ -137,8 +137,12 @@ _efl_canvas_vg_shape_efl_object_constructor(Eo *obj, Efl_Canvas_Vg_Shape_Data *p } static void -_efl_canvas_vg_shape_efl_object_destructor(Eo *obj, Efl_Canvas_Vg_Shape_Data *pd EINA_UNUSED) +_efl_canvas_vg_shape_efl_object_destructor(Eo *obj, Efl_Canvas_Vg_Shape_Data *pd) { + if (pd->fill) efl_unref(pd->fill); + if (pd->stroke.fill) efl_unref(pd->stroke.fill); + if (pd->stroke.marker) efl_unref(pd->stroke.marker); + efl_gfx_path_reset(obj); efl_destructor(efl_super(obj, MY_CLASS)); }