diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2016-11-04 19:13:53 +0900 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2016-11-06 13:13:10 +0900 |
commit | 45771d47abb481f3bb84480381b5c9152f20dc9e (patch) | |
tree | 4994d8b8eddc2418fcf5a48d8d0150140cebdd9b | |
parent | ac861be55034d8810afd8c12decfedb95c4fb573 (diff) | |
download | efl-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.c | 12 | ||||
-rw-r--r-- | src/lib/eo/eo_base_class.c | 23 | ||||
-rw-r--r-- | src/lib/eo/eo_private.h | 8 |
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 |