cedric pushed a commit to branch master.
commit 5290befb53a0ab27a18bea23bb688ecf8624b717
Author: Cedric Bail <[email protected]>
Date: Wed Sep 11 11:23:50 2013 +0900
eo: add a small object cache to make memory recycling faster.
---
src/lib/eo/eo.c | 23 ++++++++++++++++++++++-
src/lib/eo/eo_private.h | 21 ++++++++++++++++++++-
2 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c
index b1f2d15..835eb86 100644
--- a/src/lib/eo/eo.c
+++ b/src/lib/eo/eo.c
@@ -687,6 +687,8 @@ eo_class_funcs_set(Eo_Class *klass_id, const
Eo_Op_Func_Description *func_descs)
static void
eo_class_free(_Eo_Class *klass)
{
+ void *object;
+
if (klass->constructed)
{
if (klass->desc->class_destructor)
@@ -695,6 +697,11 @@ eo_class_free(_Eo_Class *klass)
_dich_func_clean_all(klass);
}
+ EINA_TRASH_CLEAN(&klass->trash, object)
+ free(object);
+
+ eina_lock_free(&klass->trash_lock);
+
free(klass);
}
@@ -886,6 +893,7 @@ eo_class_new(const Eo_Class_Description *desc, const
Eo_Class *parent_id, ...)
klass = calloc(1, _eo_class_sz + extn_sz + mro_sz + mixins_sz);
EINA_MAGIC_SET(klass, EO_CLASS_EINA_MAGIC);
+ eina_lock_new(&klass->trash_lock);
klass->parent = parent;
klass->desc = desc;
klass->extensions = (const _Eo_Class **) ((char *) klass + _eo_class_sz);
@@ -1073,6 +1081,7 @@ EAPI Eo *
eo_add_internal(const char *file, int line, const Eo_Class *klass_id, Eo
*parent_id, ...)
{
Eina_Bool do_err;
+ _Eo *obj;
_Eo_Class *klass = _eo_class_pointer_get(klass_id);
EO_MAGIC_RETURN_VAL(klass, EO_CLASS_EINA_MAGIC, NULL);
@@ -1087,7 +1096,19 @@ eo_add_internal(const char *file, int line, const
Eo_Class *klass_id, Eo *parent
return NULL;
}
- _Eo *obj = calloc(1, klass->obj_size);
+ eina_lock_take(&klass->trash_lock);
+ obj = eina_trash_pop(&klass->trash);
+ if (obj)
+ {
+ memset(obj, 0, klass->obj_size);
+ klass->trash_count--;
+ }
+ else
+ {
+ obj = calloc(1, klass->obj_size);
+ }
+ eina_lock_release(&klass->trash_lock);
+
obj->refcount++;
obj->klass = klass;
diff --git a/src/lib/eo/eo_private.h b/src/lib/eo/eo_private.h
index b236b08..5912517 100644
--- a/src/lib/eo/eo_private.h
+++ b/src/lib/eo/eo_private.h
@@ -139,6 +139,11 @@ struct _Eo_Class
const _Eo_Class **mro;
+ /* cached object for faster allocation */
+ Eina_Trash *trash;
+ Eina_Lock trash_lock;
+ unsigned int trash_count;
+
unsigned int obj_size; /**< size of an object of this class */
unsigned int chain_size;
unsigned int base_id;
@@ -204,6 +209,8 @@ _eo_del_internal(const char *file, int line, _Eo *obj)
static inline void
_eo_free(_Eo *obj)
{
+ _Eo_Class *klass = (_Eo_Class*) obj->klass;
+
#ifdef EO_DEBUG
if (obj->datarefcount)
{
@@ -211,7 +218,19 @@ _eo_free(_Eo *obj)
}
#endif
_eo_id_release(obj->obj_id);
- free(obj);
+
+ eina_lock_take(&klass->trash_lock);
+ if (klass->trash_count <= 8)
+ {
+ eina_trash_push(&klass->trash, obj);
+ klass->trash_count++;
+ eina_lock_release(&klass->trash_lock);
+ }
+ else
+ {
+ eina_lock_release(&klass->trash_lock);
+ free(obj);
+ }
}
static inline _Eo *
--
------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk