forked from enlightenment/enlightenment
Revert "Revert "deskmirror - fix dangling reference to mirror by refcounting it""
This reverts commit 466dd8d57d
.
sorry - this bug is still there and this tracks references - the
current code DOES NOT DO THIS RIGHT.
No symbol table info available.
No symbol table info available.
out>) at src/bin/e_deskmirror.c:336
mb = 0x1ed7220
#3 0x00007f0e3c864a8d in evas_object_smart_del
(eo_obj=0x8000039ae0101eb8) at lib/evas/canvas/evas_object_smart.c:1016
obj = <optimized out>
sobj = <optimized out>
s = 0x220d540
i = <optimized out>
__FUNCTION__ = "evas_object_smart_del"
(eo_obj=0x8000039ae0101eb8, obj=0x21432e0) at
lib/evas/canvas/evas_object_main.c:739
proxy = <optimized out>
l = <optimized out>
l2 = <optimized out>
texture = <optimized out>
__FUNCTION__ = "_evas_object_eo_base_destructor"
...
and EXACTLY as before p *(mb->m) shows that m is full of garbage.
mb->ec is a garbage pointer, w amd h arte garbage coordinates etc. m
is not tracked. pretty simple. open and close a few windows - mayeb
switch some desktops, THEN restart and see the crashes. its easy
enough to reproduce
This commit is contained in:
parent
40e6f35f2e
commit
6bef668a8f
|
@ -41,6 +41,7 @@ typedef struct Mirror
|
|||
Evas_Object *comp_object;
|
||||
Evas_Object *mirror;
|
||||
int x, y, w, h;
|
||||
int ref;
|
||||
Eina_Bool added : 1;
|
||||
} Mirror;
|
||||
|
||||
|
@ -109,6 +110,20 @@ _mirror_scale_set(Mirror *m, float sc)
|
|||
edje_object_message_send(mb->frame, EDJE_MESSAGE_FLOAT, 0, &msg);
|
||||
}
|
||||
|
||||
static void
|
||||
_mirror_ref(Mirror *m)
|
||||
{
|
||||
m->ref++;
|
||||
}
|
||||
|
||||
static void
|
||||
_mirror_unref(Mirror *m)
|
||||
{
|
||||
m->ref--;
|
||||
if (m->ref > 0) return;
|
||||
free(m);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_deskmirror_smart_reconfigure(E_Smart_Data *sd)
|
||||
{
|
||||
|
@ -337,7 +352,10 @@ _mirror_client_smart_del(Evas_Object *obj)
|
|||
evas_object_smart_callback_del_full(mb->m->ec->frame, "shadow_change", _mirror_client_shadow_change, mb->frame);
|
||||
}
|
||||
evas_object_del(mb->frame);
|
||||
mb->frame = NULL;
|
||||
evas_object_del(mb->mirror);
|
||||
mb->mirror = NULL;
|
||||
_mirror_unref(mb->m);
|
||||
free(mb);
|
||||
}
|
||||
|
||||
|
@ -474,12 +492,13 @@ _e_deskmirror_mirror_del_hash(Mirror *m)
|
|||
evas_object_smart_callback_del_full(m->comp_object, "frame_recalc_done", _e_deskmirror_mirror_frame_recalc_cb, m);
|
||||
evas_object_event_callback_del_full(m->comp_object, EVAS_CALLBACK_DEL, _e_deskmirror_mirror_del_cb, m);
|
||||
evas_object_del(m->mirror);
|
||||
m->mirror = NULL;
|
||||
evas_object_event_callback_del_full(m->comp_object, EVAS_CALLBACK_SHOW, (Evas_Object_Event_Cb)_comp_object_show, m);
|
||||
evas_object_event_callback_del_full(m->comp_object, EVAS_CALLBACK_HIDE, (Evas_Object_Event_Cb)_comp_object_hide, m);
|
||||
evas_object_event_callback_del_full(m->comp_object, EVAS_CALLBACK_RESTACK, (Evas_Object_Event_Cb)_comp_object_stack, m);
|
||||
evas_object_event_callback_del_full(m->comp_object, EVAS_CALLBACK_RESIZE, (Evas_Object_Event_Cb)_comp_object_configure, m);
|
||||
evas_object_event_callback_del_full(m->comp_object, EVAS_CALLBACK_MOVE, (Evas_Object_Event_Cb)_comp_object_configure, m);
|
||||
free(m);
|
||||
_mirror_unref(m);
|
||||
}
|
||||
|
||||
static Evas_Object *
|
||||
|
@ -492,6 +511,7 @@ _mirror_client_new(Mirror *m)
|
|||
o = evas_object_smart_add(m->sd->e, _mirror_client_smart);
|
||||
mb = evas_object_smart_data_get(o);
|
||||
mb->m = m;
|
||||
_mirror_ref(m);
|
||||
mb->frame = edje_object_add(m->sd->e);
|
||||
evas_object_name_set(mb->frame, "mirror_border");
|
||||
_mirror_client_theme_setup(mb, mb->frame);
|
||||
|
@ -656,6 +676,7 @@ _e_deskmirror_mirror_add(E_Smart_Data *sd, Evas_Object *obj)
|
|||
m->ec = ec;
|
||||
m->sd = sd;
|
||||
m->mirror = o;
|
||||
m->ref = 1;
|
||||
evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, (Evas_Object_Event_Cb)_comp_object_show, m);
|
||||
evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, (Evas_Object_Event_Cb)_comp_object_hide, m);
|
||||
evas_object_event_callback_add(obj, EVAS_CALLBACK_RESTACK, (Evas_Object_Event_Cb)_comp_object_stack, m);
|
||||
|
|
Loading…
Reference in New Issue