object have breadcrumbs - this is a go at debugging info to help track that

dangling reference. its really intended not to remain permenantly - so one
day we'll remove it...


SVN revision: 15530
This commit is contained in:
Carsten Haitzler 2005-06-25 06:54:22 +00:00
parent fc56f3f6a8
commit a6abb22f0e
5 changed files with 95 additions and 2 deletions

View File

@ -491,6 +491,7 @@ e_border_zone_set(E_Border *bd, E_Zone *zone)
ev = calloc(1, sizeof(E_Event_Border_Zone_Set));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_zone_set_event");
ev->zone = zone;
e_object_ref(E_OBJECT(zone));
ecore_event_add(E_EVENT_BORDER_ZONE_SET, ev, _e_border_event_border_zone_set_free, NULL);
@ -516,6 +517,7 @@ e_border_desk_set(E_Border *bd, E_Desk *desk)
ev = calloc(1, sizeof(E_Event_Border_Desk_Set));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_desk_set_event");
ev->desk = desk;
e_object_ref(E_OBJECT(desk));
ecore_event_add(E_EVENT_BORDER_DESK_SET, ev, _e_border_event_border_desk_set_free, NULL);
@ -544,6 +546,7 @@ e_border_show(E_Border *bd)
ev = calloc(1, sizeof(E_Event_Border_Show));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_show_event");
ecore_event_add(E_EVENT_BORDER_SHOW, ev, _e_border_event_border_show_free, NULL);
}
@ -595,6 +598,7 @@ e_border_hide(E_Border *bd, int manage)
ev = calloc(1, sizeof(E_Event_Border_Hide));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_hide_event");
ecore_event_add(E_EVENT_BORDER_HIDE, ev, _e_border_event_border_hide_free, NULL);
}
}
@ -643,6 +647,7 @@ e_border_move(E_Border *bd, int x, int y)
ev = calloc(1, sizeof(E_Event_Border_Move));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_move_event");
ecore_event_add(E_EVENT_BORDER_MOVE, ev, _e_border_event_border_move_free, NULL);
}
@ -688,6 +693,7 @@ e_border_resize(E_Border *bd, int w, int h)
ev = calloc(1, sizeof(E_Event_Border_Resize));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_resize_event");
ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL);
}
@ -742,11 +748,13 @@ e_border_move_resize(E_Border *bd, int x, int y, int w, int h)
mev = calloc(1, sizeof(E_Event_Border_Move));
mev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_move_event");
ecore_event_add(E_EVENT_BORDER_MOVE, mev, _e_border_event_border_move_free, NULL);
rev = calloc(1, sizeof(E_Event_Border_Resize));
rev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_resize_event");
ecore_event_add(E_EVENT_BORDER_RESIZE, rev, _e_border_event_border_resize_free, NULL);
}
@ -764,6 +772,7 @@ e_border_raise(E_Border *bd)
ev = calloc(1, sizeof(E_Event_Border_Raise));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_raise_event");
ev->above = NULL;
ecore_event_add(E_EVENT_BORDER_RAISE, ev, _e_border_event_border_raise_free, NULL);
}
@ -783,6 +792,7 @@ e_border_lower(E_Border *bd)
ev = calloc(1, sizeof(E_Event_Border_Lower));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_lower_event");
ev->below = NULL;
ecore_event_add(E_EVENT_BORDER_LOWER, ev, _e_border_event_border_lower_free, NULL);
}
@ -802,8 +812,10 @@ e_border_stack_above(E_Border *bd, E_Border *above)
ev = calloc(1, sizeof(E_Event_Border_Raise));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_raise_event");
ev->above = above;
e_object_ref(E_OBJECT(above));
e_object_breadcrumb_add(E_OBJECT(above), "border_raise_event.above");
ecore_event_add(E_EVENT_BORDER_RAISE, ev, _e_border_event_border_raise_free, NULL);
}
}
@ -821,8 +833,10 @@ e_border_stack_below(E_Border *bd, E_Border *below)
ev = calloc(1, sizeof(E_Event_Border_Lower));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_lower_event");
ev->below = below;
e_object_ref(E_OBJECT(below));
e_object_breadcrumb_add(E_OBJECT(below), "border_lower_event.below");
ecore_event_add(E_EVENT_BORDER_LOWER, ev, _e_border_event_border_lower_free, NULL);
}
}
@ -994,6 +1008,7 @@ e_border_shade(E_Border *bd, E_Direction dir)
/* The resize is added in the animator when animation complete */
/* For non-animated, we add it immediately with the new size */
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_resize_event");
ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL);
}
@ -1082,6 +1097,7 @@ e_border_unshade(E_Border *bd, E_Direction dir)
/* The resize is added in the animator when animation complete */
/* For non-animated, we add it immediately with the new size */
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_resize_event");
ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL);
}
@ -1354,6 +1370,7 @@ e_border_iconify(E_Border *bd)
ev = E_NEW(E_Event_Border_Iconify, 1);
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_iconify_event");
ecore_event_add(E_EVENT_BORDER_ICONIFY, ev, _e_border_event_border_iconify_free, NULL);
}
@ -1382,6 +1399,7 @@ e_border_uniconify(E_Border *bd)
ev = E_NEW(E_Event_Border_Uniconify, 1);
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_uniconify_event");
ecore_event_add(E_EVENT_BORDER_UNICONIFY, ev, _e_border_event_border_uniconify_free, NULL);
}
@ -1401,6 +1419,7 @@ e_border_stick(E_Border *bd)
ev = E_NEW(E_Event_Border_Stick, 1);
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_stick_event");
ecore_event_add(E_EVENT_BORDER_STICK, ev, _e_border_event_border_stick_free, NULL);
}
@ -1421,6 +1440,7 @@ e_border_unstick(E_Border *bd)
ev = E_NEW(E_Event_Border_Unstick, 1);
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_unstick_event");
ecore_event_add(E_EVENT_BORDER_UNSTICK, ev, _e_border_event_border_unstick_free, NULL);
}
@ -1947,6 +1967,7 @@ _e_border_del_dangling_ref_check(void *data)
printf("%p, %i, \"%s\" [\"%s\" \"%s\"]\n",
bd, e_object_ref_get(E_OBJECT(bd)), bd->client.icccm.title,
bd->client.icccm.name, bd->client.icccm.class);
e_object_breadcrumb_debug(E_OBJECT(bd));
printf("---\n");
return 1;
}
@ -1973,6 +1994,7 @@ _e_border_del(E_Border *bd)
/* FIXME Don't ref this during shutdown. And the event is pointless
* during shutdown.. */
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_remove_event");
ecore_event_add(E_EVENT_BORDER_REMOVE, ev, _e_border_event_border_remove_free, NULL);
}
@ -3761,6 +3783,7 @@ _e_border_eval(E_Border *bd)
ev = calloc(1, sizeof(E_Event_Border_Icon_Change));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_icon_change_event");
ecore_event_add(E_EVENT_BORDER_ICON_CHANGE, ev,
_e_border_event_border_icon_change_free, NULL);
}
@ -4088,6 +4111,7 @@ _e_border_eval(E_Border *bd)
ev = calloc(1, sizeof(E_Event_Border_Add));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_add_event");
ecore_event_add(E_EVENT_BORDER_ADD, ev, _e_border_event_border_add_free, NULL);
/* Recreate state */
@ -4636,6 +4660,7 @@ _e_border_shade_animator(void *data)
ev = calloc(1, sizeof(E_Event_Border_Resize));
ev->border = bd;
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "border_resize_event");
ecore_event_add(E_EVENT_BORDER_RESIZE, ev, _e_border_event_border_resize_free, NULL);
return 0;
}
@ -5001,6 +5026,7 @@ _e_border_event_border_resize_free(void *data, void *ev)
E_Event_Border_Resize *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_resize_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}
@ -5011,6 +5037,7 @@ _e_border_event_border_move_free(void *data, void *ev)
E_Event_Border_Move *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_move_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}
@ -5021,6 +5048,7 @@ _e_border_event_border_add_free(void *data, void *ev)
E_Event_Border_Add *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_add_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}
@ -5031,6 +5059,7 @@ _e_border_event_border_remove_free(void *data, void *ev)
E_Event_Border_Remove *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_remove_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}
@ -5041,6 +5070,7 @@ _e_border_event_border_show_free(void *data, void *ev)
E_Event_Border_Show *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_show_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}
@ -5051,6 +5081,7 @@ _e_border_event_border_hide_free(void *data, void *ev)
E_Event_Border_Hide *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_hide_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}
@ -5061,6 +5092,7 @@ _e_border_event_border_iconify_free(void *data, void *ev)
E_Event_Border_Iconify *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_iconify_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}
@ -5071,6 +5103,7 @@ _e_border_event_border_uniconify_free(void *data, void *ev)
E_Event_Border_Uniconify *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_uniconify_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}
@ -5081,6 +5114,7 @@ _e_border_event_border_stick_free(void *data, void *ev)
E_Event_Border_Stick *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_stick_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}
@ -5091,6 +5125,7 @@ _e_border_event_border_unstick_free(void *data, void *ev)
E_Event_Border_Unstick *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_unstick_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}
@ -5101,6 +5136,7 @@ _e_border_event_border_zone_set_free(void *data, void *ev)
E_Event_Border_Zone_Set *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_zone_set_event");
e_object_unref(E_OBJECT(e->border));
e_object_unref(E_OBJECT(e->zone));
free(e);
@ -5112,6 +5148,7 @@ _e_border_event_border_desk_set_free(void *data, void *ev)
E_Event_Border_Desk_Set *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_desk_set_event");
e_object_unref(E_OBJECT(e->border));
e_object_unref(E_OBJECT(e->desk));
free(e);
@ -5123,8 +5160,13 @@ _e_border_event_border_raise_free(void *data, void *ev)
E_Event_Border_Raise *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_raise_event");
e_object_unref(E_OBJECT(e->border));
if (e->above) e_object_unref(E_OBJECT(e->above));
if (e->above)
{
e_object_breadcrumb_del(E_OBJECT(e->above), "border_raise_event.above");
e_object_unref(E_OBJECT(e->above));
}
free(e);
}
@ -5134,8 +5176,13 @@ _e_border_event_border_lower_free(void *data, void *ev)
E_Event_Border_Lower *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_lower_event");
e_object_unref(E_OBJECT(e->border));
if (e->below) e_object_unref(E_OBJECT(e->below));
if (e->below)
{
e_object_breadcrumb_del(E_OBJECT(e->below), "border_lower_event.below");
e_object_unref(E_OBJECT(e->below));
}
free(e);
}
@ -5145,6 +5192,7 @@ _e_border_event_border_icon_change_free(void *data, void *ev)
E_Event_Border_Icon_Change *e;
e = ev;
e_object_breadcrumb_del(E_OBJECT(e->border), "border_icon_change_event");
e_object_unref(E_OBJECT(e->border));
free(e);
}

View File

@ -556,6 +556,7 @@ _e_int_menus_clients_pre_cb(void *data, E_Menu *m)
e_menu_item_label_set(mi, _("No name!!"));
/* ref the border as we implicitly unref it in the callback */
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "clients_menu");
e_menu_item_callback_set(mi, _e_int_menus_clients_item_cb, bd);
if (!bd->iconic) e_menu_item_toggle_set(mi, 1);
a = e_app_window_name_class_find(bd->client.icccm.name,
@ -589,6 +590,7 @@ _e_int_menus_clients_free_hook(void *obj)
bd = borders->data;
borders = evas_list_remove_list(borders, borders);
e_object_breadcrumb_del(E_OBJECT(bd), "clients_menu");
e_object_unref(E_OBJECT(bd));
}
}
@ -797,6 +799,7 @@ _e_int_menus_lost_clients_pre_cb(void *data, E_Menu *m)
e_menu_item_label_set(mi, _("No name!!"));
/* ref the border as we implicitly unref it in the callback */
e_object_ref(E_OBJECT(bd));
e_object_breadcrumb_add(E_OBJECT(bd), "lost_clients_menu");
e_menu_item_callback_set(mi, _e_int_menus_lost_clients_item_cb, bd);
a = e_app_window_name_class_find(bd->client.icccm.name,
bd->client.icccm.class);
@ -820,6 +823,7 @@ _e_int_menus_lost_clients_free_hook(void *obj)
bd = borders->data;
borders = evas_list_remove_list(borders, borders);
e_object_breadcrumb_del(E_OBJECT(bd), "lost_clients_menu");
e_object_unref(E_OBJECT(bd));
}
}

View File

@ -252,6 +252,39 @@ e_object_del_attach_func_set(E_Object *obj, void (*func) (void *obj))
obj->del_att_func = func;
}
void
e_object_breadcrumb_add(E_Object *obj, char *crumb)
{
E_OBJECT_CHECK(obj);
obj->crumbs = evas_list_append(obj->crumbs, strdup(crumb));
}
void
e_object_breadcrumb_del(E_Object *obj, char *crumb)
{
Evas_List *l;
E_OBJECT_CHECK(obj);
for (l = obj->crumbs; l; l = l->next)
{
if (!strcmp(crumb, l->data))
{
free(l->data);
obj->crumbs = evas_list_remove_list(obj->crumbs, l);
}
}
}
void
e_object_breadcrumb_debug(E_Object *obj)
{
Evas_List *l;
E_OBJECT_CHECK(obj);
for (l = obj->crumbs; l; l = l->next)
printf("CRUMB: %s\n", l->data);
}
#ifdef OBJECT_PARANOIA_CHECK
/* local subsystem functions */
static void

View File

@ -70,6 +70,7 @@ struct _E_Object
void (*del_att_func) (void *obj);
void *data;
unsigned char deleted : 1;
Evas_List *crumbs;
};
EAPI void *e_object_alloc (int size, int type, E_Object_Cleanup_Func cleanup_func);
@ -87,5 +88,9 @@ EAPI void *e_object_data_get (E_Object *obj);
EAPI void e_object_free_attach_func_set(E_Object *obj, void (*func) (void *obj));
EAPI void e_object_del_attach_func_set (E_Object *obj, void (*func) (void *obj));
EAPI void e_object_breadcrumb_add (E_Object *obj, char *crumb);
EAPI void e_object_breadcrumb_del (E_Object *obj, char *crumb);
EAPI void e_object_breadcrumb_debug (E_Object *obj);
#endif
#endif

View File

@ -606,6 +606,8 @@ _pager_window_new(Pager_Desk *pd, E_Border *border)
pw->border = border;
e_object_ref(E_OBJECT(border));
e_object_breadcrumb_add(E_OBJECT(border), "pager_module");
visible = !border->iconic;
pw->desk = pd;
@ -636,6 +638,7 @@ _pager_window_free(Pager_Win *pw)
{
if (pw->window_object) evas_object_del(pw->window_object);
if (pw->icon_object) evas_object_del(pw->icon_object);
e_object_breadcrumb_del(E_OBJECT(pw->border), "pager_module");
e_object_unref(E_OBJECT(pw->border));
free(pw);
}