Eobj: Improved private data lookups.

No offset array anymore - less memory wasted.
Lookup is *way* faster now.

SVN revision: 70009
This commit is contained in:
Tom Hacohen 2012-04-11 07:05:39 +00:00
parent a41960d689
commit 27429380dd
1 changed files with 15 additions and 48 deletions

View File

@ -46,7 +46,6 @@ struct _Eobj {
Eobj *parent; Eobj *parent;
const Eobj_Class *klass; const Eobj_Class *klass;
void *data_blob; void *data_blob;
void **datas;
int refcount; int refcount;
Eina_List *composite_objects; Eina_List *composite_objects;
@ -120,6 +119,8 @@ struct _Eobj_Class
const Eobj_Class **mro; const Eobj_Class **mro;
size_t data_offset; /* < Offset of the data within object data. */
Eina_Bool constructed : 1; Eina_Bool constructed : 1;
}; };
@ -591,6 +592,17 @@ eobj_class_new(const Eobj_Class_Description *desc, const Eobj_Class *parent, ...
} }
klass->desc = desc; klass->desc = desc;
/* If we have a parent, update the current offset. */
if (klass->parent)
{
/* FIXME: Make sure this alignment is enough. */
klass->data_offset = klass->parent->data_offset +
klass->parent->desc->private_size +
(sizeof(void *) -
(klass->parent->desc->private_size % sizeof(void *)));
}
_eobj_class_base_op_init(klass); _eobj_class_base_op_init(klass);
/* FIXME: Shouldn't be called here - should be called from eobj_add. */ /* FIXME: Shouldn't be called here - should be called from eobj_add. */
@ -627,18 +639,6 @@ eobj_class_free(Eobj_Class *klass)
free(klass); free(klass);
} }
/* FIXME: Do I still need count parents? */
static int
_eobj_class_count_parents(const Eobj_Class *klass)
{
int count = 0;
for (count = 0 ; klass->parent ; klass = klass->parent)
count++;
return count;
}
EAPI Eobj * EAPI Eobj *
eobj_add(const Eobj_Class *klass, Eobj *parent) eobj_add(const Eobj_Class *klass, Eobj *parent)
{ {
@ -653,40 +653,8 @@ eobj_add(const Eobj_Class *klass, Eobj *parent)
obj->parent = parent; obj->parent = parent;
obj->refcount++; obj->refcount++;
{
size_t datas_count = 0;
intptr_t offset = 0;
size_t i;
const Eobj_Class *kls_itr;
void **pvt_itr;
datas_count = _eobj_class_count_parents(klass) + 1;
obj->datas = calloc(datas_count, sizeof(*(obj->datas))); obj->data_blob = calloc(1, klass->data_offset + klass->desc->private_size);
/* Calculate all the offsets and set in the datas array. */
pvt_itr = obj->datas + datas_count - 1;
for (kls_itr = klass ; kls_itr->parent ; kls_itr = kls_itr->parent)
{
*pvt_itr = (void *) offset;
/* FIXME: Make sure this alignment is enough. */
offset += kls_itr->desc->private_size +
(sizeof(void *) -
(kls_itr->desc->private_size % sizeof(void *)));
pvt_itr--;
}
/* Allocate the datas blob and update the offsets. */
obj->data_blob = calloc(1, offset);
pvt_itr = obj->datas;
for (i = 0 ; i < datas_count ; i++)
{
*pvt_itr = ((char *) obj->data_blob) + (intptr_t) *pvt_itr;
pvt_itr++;
}
}
_eobj_kls_itr_init(obj); _eobj_kls_itr_init(obj);
eobj_class_constructor(obj, klass); eobj_class_constructor(obj, klass);
@ -753,7 +721,6 @@ eobj_unref(Eobj *obj)
if (obj->data_blob) if (obj->data_blob)
free(obj->data_blob); free(obj->data_blob);
free(obj->datas);
_eobj_generic_data_del_all(obj); _eobj_generic_data_del_all(obj);
@ -845,7 +812,7 @@ eobj_data_get(Eobj *obj, const Eobj_Class *klass)
{ {
/* FIXME: Add a check that this is of the right klass and we don't seg. /* FIXME: Add a check that this is of the right klass and we don't seg.
* Probably just return NULL. */ * Probably just return NULL. */
return obj->datas[_eobj_class_count_parents(klass)]; return ((char *) obj->data_blob) + klass->data_offset;
} }
typedef struct typedef struct