summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-11-04 19:13:53 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2016-11-06 13:13:10 +0900
commit45771d47abb481f3bb84480381b5c9152f20dc9e (patch)
tree4994d8b8eddc2418fcf5a48d8d0150140cebdd9b
parentac861be55034d8810afd8c12decfedb95c4fb573 (diff)
downloadefl-45771d47abb481f3bb84480381b5c9152f20dc9e.tar.gz
eo - use free queue for at least some eo core memory and pointers
this should help improve robusteness by keeping memory around for a bit until the free queue flushes or is full @feature
-rw-r--r--src/lib/eo/eo.c12
-rw-r--r--src/lib/eo/eo_base_class.c23
-rw-r--r--src/lib/eo/eo_private.h8
3 files changed, 21 insertions, 22 deletions
diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c
index 1da45664e6..46d69441e3 100644
--- a/src/lib/eo/eo.c
+++ b/src/lib/eo/eo.c
@@ -1082,15 +1082,15 @@ eo_class_free(_Efl_Class *klass)
}
EINA_TRASH_CLEAN(&klass->objects.trash, data)
- free(data);
+ eina_freeq_ptr_main_add(data, free, klass->obj_size);
EINA_TRASH_CLEAN(&klass->iterators.trash, data)
- free(data);
+ eina_freeq_ptr_main_add(data, free, 0);
eina_spinlock_free(&klass->objects.trash_lock);
eina_spinlock_free(&klass->iterators.trash_lock);
- free(klass);
+ eina_freeq_ptr_main_add(klass, free, 0);
}
/* Not really called, just used for the ptr... */
@@ -1438,7 +1438,7 @@ efl_object_override(Eo *eo_id, const Efl_Object_Ops *ops)
{
if (obj->vtable != &obj->klass->vtable)
{
- free(obj->vtable);
+ eina_freeq_ptr_main_add(obj->vtable, free, 0);
obj->vtable = (Eo_Vtable *) &obj->klass->vtable;
}
}
@@ -1573,7 +1573,7 @@ efl_xunref(Eo *obj_id, const Eo *ref_obj_id)
if (xref)
{
obj->xrefs = eina_inlist_remove(obj->xrefs, EINA_INLIST_GET(xref));
- free(xref);
+ eina_freeq_ptr_main_add(xref, free, sizeof(*xref));
}
else
{
@@ -1778,7 +1778,7 @@ _efl_data_xunref_internal(_Eo_Object *obj, void *data, const _Eo_Object *ref_obj
if (xref)
{
obj->data_xrefs = eina_inlist_remove(obj->data_xrefs, EINA_INLIST_GET(xref));
- free(xref);
+ eina_freeq_ptr_main_add(xref, free, sizeof(*xref));
}
else
{
diff --git a/src/lib/eo/eo_base_class.c b/src/lib/eo/eo_base_class.c
index 5ef35092de..7446c3637b 100644
--- a/src/lib/eo/eo_base_class.c
+++ b/src/lib/eo/eo_base_class.c
@@ -72,7 +72,7 @@ typedef struct
static inline void
_efl_object_extension_free(Efl_Object_Extension *ext)
{
- free(ext);
+ eina_freeq_ptr_main_add(ext, free, sizeof(*ext));
}
static inline Efl_Object_Extension *
@@ -118,7 +118,7 @@ _eo_generic_data_node_free(Eo_Generic_Data_Node *node)
break;
}
eina_stringshare_del(node->key);
- free(node);
+ eina_freeq_ptr_main_add(node, free, sizeof(*node));
}
static void
@@ -679,7 +679,7 @@ _efl_children_iterator_free(Eo_Children_Iterator *it)
}
else
{
- free(it);
+ eina_freeq_ptr_main_add(it, free, sizeof(*it));
}
eina_spinlock_release(&klass->iterators.trash_lock);
@@ -811,7 +811,7 @@ _efl_object_wref_del(Eo *obj, Efl_Object_Data *pd, Eo **wref)
}
else
{
- free(ext->wrefs);
+ eina_freeq_ptr_main_add(ext->wrefs, free, 0);
ext->wrefs = NULL;
_efl_object_extension_noneed(pd);
}
@@ -841,7 +841,7 @@ _wref_destruct(Efl_Object_Data *pd)
if ((!ext) || (!ext->wrefs)) return;
for (itr = ext->wrefs; *itr; itr++) **itr = NULL;
- free(ext->wrefs);
+ eina_freeq_ptr_main_add(ext->wrefs, free, 0);
ext->wrefs = NULL;
}
@@ -885,7 +885,7 @@ _legacy_events_hash_free_cb(void *_desc)
{
Efl_Event_Description *desc = _desc;
eina_stringshare_del(desc->name);
- free(desc);
+ eina_freeq_ptr_main_add(desc, free, sizeof(*desc));
}
/* EOF Legacy */
@@ -971,7 +971,7 @@ _eo_callback_remove_all(Efl_Object_Data *pd)
for (i = 0; i < pd->callbacks_count; i++)
_eo_callback_free(pd->callbacks[i]);
- free(pd->callbacks);
+ eina_freeq_ptr_main_add(pd->callbacks, free, 0);
pd->callbacks = NULL;
pd->callbacks_count = 0;
}
@@ -1531,7 +1531,7 @@ EAPI void
efl_dbg_info_free(Efl_Dbg_Info *info)
{
eina_value_flush(&(info->value));
- free(info);
+ eina_freeq_ptr_main_add(info, free, sizeof(*info));
}
static Eina_Bool
@@ -1547,7 +1547,7 @@ _eo_dbg_info_flush(const Eina_Value_Type *type EINA_UNUSED, void *_mem)
Efl_Dbg_Info *mem = *(Efl_Dbg_Info **) _mem;
eina_stringshare_del(mem->name);
eina_value_flush(&(mem->value));
- free(mem);
+ eina_freeq_ptr_main_add(mem, free, sizeof(*mem));
return EINA_TRUE;
}
@@ -1577,7 +1577,7 @@ _eo_dbg_info_convert_to(const Eina_Value_Type *type EINA_UNUSED, const Eina_Valu
char *inner_val = eina_value_to_string(&(*src)->value);
other_mem = inner_val;
ret = eina_value_type_pset(convert, convert_mem, &other_mem);
- free(inner_val);
+ eina_freeq_ptr_main_add(inner_val, free, 0);
return ret;
}
@@ -1589,8 +1589,7 @@ static Eina_Bool
_eo_dbg_info_pset(const Eina_Value_Type *type EINA_UNUSED, void *_mem, const void *_ptr)
{
Efl_Dbg_Info **mem = _mem;
- if (*mem)
- free(*mem);
+ if (*mem) free(*mem);
*mem = (void *) _ptr;
return EINA_TRUE;
}
diff --git a/src/lib/eo/eo_private.h b/src/lib/eo/eo_private.h
index 99f667a62b..b79cbea32e 100644
--- a/src/lib/eo/eo_private.h
+++ b/src/lib/eo/eo_private.h
@@ -284,7 +284,7 @@ _eo_free(_Eo_Object *obj)
if (_obj_is_override(obj))
{
_vtable_func_clean_all(obj->vtable);
- free(obj->vtable);
+ eina_freeq_ptr_main_add(obj->vtable, free, 0);
obj->vtable = &klass->vtable;
}
@@ -298,7 +298,7 @@ _eo_free(_Eo_Object *obj)
}
else
{
- free(obj);
+ eina_freeq_ptr_main_add(obj, free, klass->obj_size);
}
eina_spinlock_release(&klass->objects.trash_lock);
}
@@ -351,7 +351,7 @@ _efl_unref(_Eo_Object *obj)
{
ERR("obj->xrefs is not empty, possibly a bug, please report. - An error will be reported for each xref in the stack.");
Eina_Inlist *nitr = obj->xrefs->next;
- free(EINA_INLIST_CONTAINER_GET(obj->xrefs, Eo_Xref_Node));
+ eina_freeq_ptr_main_add(EINA_INLIST_CONTAINER_GET(obj->xrefs, Eo_Xref_Node), free, 0);
obj->xrefs = nitr;
}
while (obj->data_xrefs)
@@ -360,7 +360,7 @@ _efl_unref(_Eo_Object *obj)
Eo_Xref_Node *xref = EINA_INLIST_CONTAINER_GET(obj->data_xrefs, Eo_Xref_Node);
ERR("Data of object 0x%lx is still referenced by object %p", (unsigned long) _eo_obj_id_get(obj), xref->ref_obj);
- free(xref);
+ eina_freeq_ptr_main_add(xref, free, sizeof(*xref));
obj->data_xrefs = nitr;
}
#endif