cedric pushed a commit to branch master.
commit 91aea489c349b97e313ac82cac474fdd323c4b45
Author: Cedric Bail <[email protected]>
Date: Tue Jun 18 11:34:31 2013 +0900
evas: reduce memory usage by using Eo array of callbacks.
Reduce usage by 100K on my test on Elementary test, likely better with
64bits system.
---
ChangeLog | 4 +++
NEWS | 1 +
src/lib/evas/canvas/evas_object_box.c | 49 +++++++++++++++++++----------------
3 files changed, 31 insertions(+), 23 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 278d62e..295c122 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-06-18 Cedric Bail
+
+ * Evas: Use Eo array of callbacks to reduce edje memory foot print of
Evas_Object_Box.
+
2013-06-17 Sung W. Park (sung_)
* Evas: add partial rendering support for Evas_GL direct rendering
diff --git a/NEWS b/NEWS
index 0451613..5781dc5 100644
--- a/NEWS
+++ b/NEWS
@@ -189,6 +189,7 @@ Improvements:
* Evas gl engine - dont map dri/drm buffer unless we are going to render.
* Partial rendering support in evas for several gl drivers.
* edje: use eo array of callbacks to reduce callbacks memory footprint.
+ * evas: use eo array of callbacks to reduce callbacks memory footprint of
Evas_Object_Box.
Fixes:
* Fix a memory leak in ecore_con_dns when using ecore_con_server_connect
diff --git a/src/lib/evas/canvas/evas_object_box.c
b/src/lib/evas/canvas/evas_object_box.c
index a07bd7b..23624ed 100644
--- a/src/lib/evas/canvas/evas_object_box.c
+++ b/src/lib/evas/canvas/evas_object_box.c
@@ -116,16 +116,18 @@ _evas_object_box_accessor_free(Evas_Object_Box_Accessor
*it)
free(it);
}
-static void
-_on_child_resize(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
EINA_UNUSED, void *einfo EINA_UNUSED)
+static Eina_Bool
+_on_child_resize(void *data, Eo *o EINA_UNUSED, const Eo_Event_Description
*desc EINA_UNUSED, void *einfo EINA_UNUSED)
{
Evas_Object *box = data;
EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(box, priv);
if (!priv->layouting) evas_object_smart_changed(box);
+
+ return EO_CALLBACK_CONTINUE;
}
-static void
-_on_child_del(void *data, Evas *evas EINA_UNUSED, Evas_Object *o, void *einfo
EINA_UNUSED)
+static Eina_Bool
+_on_child_del(void *data, Eo *o, const Eo_Event_Description *desc EINA_UNUSED,
void *einfo EINA_UNUSED)
{
Evas_Object *box = data;
@@ -134,10 +136,12 @@ _on_child_del(void *data, Evas *evas EINA_UNUSED,
Evas_Object *o, void *einfo EI
if (!ret)
ERR("child removal failed");
evas_object_smart_changed(box);
+
+ return EO_CALLBACK_CONTINUE;
}
-static void
-_on_child_hints_changed(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
EINA_UNUSED, void *einfo EINA_UNUSED)
+static Eina_Bool
+_on_child_hints_changed(void *data, Eo *o EINA_UNUSED, const
Eo_Event_Description *desc EINA_UNUSED, void *einfo EINA_UNUSED)
{
Evas_Object *box = data;
EVAS_OBJECT_BOX_DATA_GET_OR_RETURN(box, priv);
@@ -145,6 +149,8 @@ _on_child_hints_changed(void *data, Evas *evas EINA_UNUSED,
Evas_Object *o EINA_
// to change their hints evenr WHILE being laid out. so comment this out.
// if (!priv->layouting)
evas_object_smart_changed(box);
+
+ return EO_CALLBACK_CONTINUE;
}
static void
@@ -168,15 +174,17 @@ _evas_object_box_option_new(Evas_Object *o,
Evas_Object_Box_Data *priv EINA_UNUS
return opt;
}
+static const Eo_Callback_Array_Item evas_object_box_callbacks[] = {
+ { EVAS_OBJECT_EVENT_RESIZE, _on_child_resize },
+ { EVAS_OBJECT_EVENT_FREE, _on_child_del },
+ { EVAS_OBJECT_EVENT_CHANGED_SIZE_HINTS, _on_child_hints_changed },
+ { NULL, NULL }
+};
+
static void
-_evas_object_box_child_callbacks_unregister(Evas_Object *obj)
+_evas_object_box_child_callbacks_unregister(Evas_Object *obj, Evas_Object
*parent)
{
- evas_object_event_callback_del
- (obj, EVAS_CALLBACK_RESIZE, _on_child_resize);
- evas_object_event_callback_del
- (obj, EVAS_CALLBACK_FREE, _on_child_del);
- evas_object_event_callback_del
- (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_child_hints_changed);
+ eo_do(obj, eo_event_callback_array_del(evas_object_box_callbacks, parent));
}
static Evas_Object_Box_Option *
@@ -184,12 +192,7 @@ _evas_object_box_option_callbacks_register(Evas_Object *o,
Evas_Object_Box_Data
{
Evas_Object *obj = opt->obj;
- evas_object_event_callback_add
- (obj, EVAS_CALLBACK_RESIZE, _on_child_resize, o);
- evas_object_event_callback_add
- (obj, EVAS_CALLBACK_FREE, _on_child_del, o);
- evas_object_event_callback_add
- (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _on_child_hints_changed, o);
+ eo_do(obj, eo_event_callback_array_add(evas_object_box_callbacks, o));
return opt;
}
@@ -458,7 +461,7 @@ _smart_del(Eo *o, void *_pd, va_list *list EINA_UNUSED)
{
Evas_Object_Box_Option *opt = l->data;
- _evas_object_box_child_callbacks_unregister(opt->obj);
+ _evas_object_box_child_callbacks_unregister(opt->obj, o);
eo_do(o, evas_obj_box_internal_option_free(opt));
l = eina_list_remove_list(l, l);
}
@@ -2032,7 +2035,7 @@ _box_remove(Eo *o, void *_pd EINA_UNUSED, va_list *list)
if (obj)
{
- _evas_object_box_child_callbacks_unregister(obj);
+ _evas_object_box_child_callbacks_unregister(obj, o);
evas_object_smart_member_del(obj);
evas_object_smart_changed(o);
if (result) *result = EINA_TRUE;
@@ -2060,7 +2063,7 @@ _box_remove_at(Eo *o, void *_pd EINA_UNUSED, va_list
*list)
if (obj)
{
- _evas_object_box_child_callbacks_unregister(obj);
+ _evas_object_box_child_callbacks_unregister(obj, o);
evas_object_smart_member_del(obj);
evas_object_smart_changed(o);
if (result) *result = EINA_TRUE;
@@ -2094,7 +2097,7 @@ _box_remove_all(Eo *o, void *_pd, va_list *list)
eo_do(o, evas_obj_box_internal_remove(opt->obj, &obj));
if (obj)
{
- _evas_object_box_child_callbacks_unregister(obj);
+ _evas_object_box_child_callbacks_unregister(obj, o);
evas_object_smart_member_del(obj);
if (clear)
evas_object_del(obj);
--
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev