* eina: fix structure content to be more futur proof and reduce

risk of ABI breakage.


SVN revision: 51390
This commit is contained in:
Cedric BAIL 2010-08-19 12:02:28 +00:00
parent 3c305771c3
commit e6f9cee051
13 changed files with 69 additions and 20 deletions

View File

@ -51,6 +51,9 @@ typedef Eina_Bool (*Eina_Accessor_Lock_Callback)(Eina_Accessor *it);
struct _Eina_Accessor struct _Eina_Accessor
{ {
#define EINA_ACCESSOR_VERSION 1
int version;
Eina_Accessor_Get_At_Callback get_at EINA_ARG_NONNULL(1, 3) EINA_WARN_UNUSED_RESULT; Eina_Accessor_Get_At_Callback get_at EINA_ARG_NONNULL(1, 3) EINA_WARN_UNUSED_RESULT;
Eina_Accessor_Get_Container_Callback get_container EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT; Eina_Accessor_Get_Container_Callback get_container EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT;
Eina_Accessor_Free_Callback free EINA_ARG_NONNULL(1); Eina_Accessor_Free_Callback free EINA_ARG_NONNULL(1);

View File

@ -65,6 +65,9 @@ typedef void **Eina_Array_Iterator;
*/ */
struct _Eina_Array struct _Eina_Array
{ {
#define EINA_ARRAY_VERSION 1
int version; /**< Should match EINA_ARRAY_VERSION used when compiled your apps, provided for ABI compatibility */
void **data; /**< Pointer to a vector of pointer to payload */ void **data; /**< Pointer to a vector of pointer to payload */
unsigned int total; /**< Total number of slots in the vector */ unsigned int total; /**< Total number of slots in the vector */
unsigned int count; /**< Number of active slots in the vector */ unsigned int count; /**< Number of active slots in the vector */
@ -76,6 +79,7 @@ EAPI Eina_Array * eina_array_new(unsigned int step) EINA_WARN_UNUS
EAPI Eina_Array * eina_array_threadsafe_new(unsigned int step) EINA_WARN_UNUSED_RESULT EINA_MALLOC EINA_WARN_UNUSED_RESULT; EAPI Eina_Array * eina_array_threadsafe_new(unsigned int step) EINA_WARN_UNUSED_RESULT EINA_MALLOC EINA_WARN_UNUSED_RESULT;
EAPI void eina_array_free(Eina_Array *array) EINA_ARG_NONNULL(1); EAPI void eina_array_free(Eina_Array *array) EINA_ARG_NONNULL(1);
EAPI void eina_array_step_set(Eina_Array *array, EAPI void eina_array_step_set(Eina_Array *array,
unsigned int sizeof_eina_array,
unsigned int step) EINA_ARG_NONNULL(1); unsigned int step) EINA_ARG_NONNULL(1);
EAPI void eina_array_clean(Eina_Array *array) EINA_ARG_NONNULL(1); EAPI void eina_array_clean(Eina_Array *array) EINA_ARG_NONNULL(1);
EAPI void eina_array_flush(Eina_Array *array) EINA_ARG_NONNULL(1); EAPI void eina_array_flush(Eina_Array *array) EINA_ARG_NONNULL(1);

View File

@ -49,6 +49,9 @@ typedef Eina_Bool (*Eina_Iterator_Lock_Callback)(Eina_Iterator *it);
struct _Eina_Iterator struct _Eina_Iterator
{ {
#define EINA_ITERATOR_VERSION 1
int version;
Eina_Iterator_Next_Callback next EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; Eina_Iterator_Next_Callback next EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT;
Eina_Iterator_Get_Container_Callback get_container EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT; Eina_Iterator_Get_Container_Callback get_container EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT;
Eina_Iterator_Free_Callback free EINA_ARG_NONNULL(1); Eina_Iterator_Free_Callback free EINA_ARG_NONNULL(1);

View File

@ -415,6 +415,7 @@ eina_array_new(unsigned int step)
EINA_MAGIC_SET(array, EINA_MAGIC_ARRAY); EINA_MAGIC_SET(array, EINA_MAGIC_ARRAY);
array->version = EINA_ARRAY_VERSION;
array->data = NULL; array->data = NULL;
array->total = 0; array->total = 0;
array->count = 0; array->count = 0;
@ -448,6 +449,7 @@ eina_array_free(Eina_Array *array)
* @brief Set the step of an array. * @brief Set the step of an array.
* *
* @param array The array. * @param array The array.
* @param sizeof_array Should be the value returned by sizeof (Eina_Array).
* @param step The count of pointers to add when increasing the array size. * @param step The count of pointers to add when increasing the array size.
* *
* This function sets the step of @p array to @p step. For performance * This function sets the step of @p array to @p step. For performance
@ -456,9 +458,23 @@ eina_array_free(Eina_Array *array)
* the array is not initialized. * the array is not initialized.
*/ */
EAPI void EAPI void
eina_array_step_set(Eina_Array *array, unsigned int step) eina_array_step_set(Eina_Array *array,
unsigned int sizeof_eina_array,
unsigned int step)
{ {
EINA_SAFETY_ON_NULL_RETURN(array); EINA_SAFETY_ON_NULL_RETURN(array);
if (sizeof (Eina_Array) != sizeof_eina_array)
{
ERR("Unknow Eina_Array size ! Got %i, expected %i !\n",
sizeof_eina_array,
(int) sizeof (Eina_Array));
/* Force memory to zero to provide a small layer of security */
memset(array, 0, sizeof_eina_array);
return ;
}
array->version = EINA_ARRAY_VERSION;
array->data = NULL; array->data = NULL;
array->total = 0; array->total = 0;
array->count = 0; array->count = 0;
@ -654,6 +670,7 @@ eina_array_iterator_new(const Eina_Array *array)
it->array = array; it->array = array;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(eina_array_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(eina_array_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
eina_array_iterator_get_container); eina_array_iterator_get_container);
@ -682,7 +699,7 @@ eina_array_accessor_new(const Eina_Array *array)
EINA_SAFETY_ON_NULL_RETURN_VAL(array, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(array, NULL);
EINA_MAGIC_CHECK_ARRAY(array); EINA_MAGIC_CHECK_ARRAY(array);
eina_error_set(0); eina_error_set(0);
it = calloc(1, sizeof (Eina_Accessor_Array)); it = calloc(1, sizeof (Eina_Accessor_Array));
if (!it) if (!it)
{ {
@ -695,6 +712,7 @@ eina_array_accessor_new(const Eina_Array *array)
it->array = array; it->array = array;
it->accessor.version = EINA_ACCESSOR_VERSION;
it->accessor.get_at = FUNC_ACCESSOR_GET_AT(eina_array_accessor_get_at); it->accessor.get_at = FUNC_ACCESSOR_GET_AT(eina_array_accessor_get_at);
it->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER( it->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER(
eina_array_accessor_get_container); eina_array_accessor_get_container);

View File

@ -431,7 +431,7 @@ eina_file_ls(const char *dir)
if (length < 1) if (length < 1)
return NULL; return NULL;
it = malloc(sizeof (Eina_File_Iterator) + length); it = calloc(1, sizeof (Eina_File_Iterator) + length);
if (!it) if (!it)
return NULL; return NULL;
@ -450,6 +450,7 @@ eina_file_ls(const char *dir)
else else
it->length = length - 1; it->length = length - 1;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_eina_file_ls_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(_eina_file_ls_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
_eina_file_ls_iterator_container); _eina_file_ls_iterator_container);
@ -498,7 +499,7 @@ eina_file_direct_ls(const char *dir)
if (length + NAME_MAX + 2 >= PATH_MAX) if (length + NAME_MAX + 2 >= PATH_MAX)
return NULL; return NULL;
it = malloc(sizeof(Eina_File_Direct_Iterator) + length); it = calloc(1, sizeof(Eina_File_Direct_Iterator) + length);
if (!it) if (!it)
return NULL; return NULL;
@ -523,6 +524,7 @@ eina_file_direct_ls(const char *dir)
it->info.name_start = length + 1; it->info.name_start = length + 1;
} }
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_eina_file_direct_ls_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(_eina_file_direct_ls_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
_eina_file_direct_ls_iterator_container); _eina_file_direct_ls_iterator_container);

View File

@ -1621,7 +1621,7 @@ eina_hash_iterator_data_new(const Eina_Hash *hash)
EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL);
EINA_MAGIC_CHECK_HASH(hash); EINA_MAGIC_CHECK_HASH(hash);
eina_error_set(0); eina_error_set(0);
it = calloc(1, sizeof (Eina_Iterator_Hash)); it = calloc(1, sizeof (Eina_Iterator_Hash));
if (!it) if (!it)
{ {
@ -1632,6 +1632,7 @@ eina_hash_iterator_data_new(const Eina_Hash *hash)
it->hash = hash; it->hash = hash;
it->get_content = FUNC_ITERATOR_GET_CONTENT(_eina_hash_iterator_data_get_content); it->get_content = FUNC_ITERATOR_GET_CONTENT(_eina_hash_iterator_data_get_content);
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_eina_hash_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(_eina_hash_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
_eina_hash_iterator_get_container); _eina_hash_iterator_get_container);
@ -1670,7 +1671,7 @@ eina_hash_iterator_key_new(const Eina_Hash *hash)
EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL);
EINA_MAGIC_CHECK_HASH(hash); EINA_MAGIC_CHECK_HASH(hash);
eina_error_set(0); eina_error_set(0);
it = calloc(1, sizeof (Eina_Iterator_Hash)); it = calloc(1, sizeof (Eina_Iterator_Hash));
if (!it) if (!it)
{ {
@ -1682,6 +1683,7 @@ eina_hash_iterator_key_new(const Eina_Hash *hash)
it->get_content = FUNC_ITERATOR_GET_CONTENT( it->get_content = FUNC_ITERATOR_GET_CONTENT(
_eina_hash_iterator_key_get_content); _eina_hash_iterator_key_get_content);
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_eina_hash_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(_eina_hash_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
_eina_hash_iterator_get_container); _eina_hash_iterator_get_container);
@ -1723,7 +1725,6 @@ eina_hash_iterator_tuple_new(const Eina_Hash *hash)
EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL);
EINA_MAGIC_CHECK_HASH(hash); EINA_MAGIC_CHECK_HASH(hash);
eina_error_set(0); eina_error_set(0);
it = calloc(1, sizeof (Eina_Iterator_Hash)); it = calloc(1, sizeof (Eina_Iterator_Hash));
if (!it) if (!it)
@ -1736,6 +1737,7 @@ eina_hash_iterator_tuple_new(const Eina_Hash *hash)
it->get_content = FUNC_ITERATOR_GET_CONTENT( it->get_content = FUNC_ITERATOR_GET_CONTENT(
_eina_hash_iterator_tuple_get_content); _eina_hash_iterator_tuple_get_content);
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_eina_hash_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(_eina_hash_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
_eina_hash_iterator_get_container); _eina_hash_iterator_get_container);

View File

@ -626,7 +626,7 @@ eina_inlist_iterator_new(const Eina_Inlist *list)
{ {
Eina_Iterator_Inlist *it; Eina_Iterator_Inlist *it;
eina_error_set(0); eina_error_set(0);
it = calloc(1, sizeof (Eina_Iterator_Inlist)); it = calloc(1, sizeof (Eina_Iterator_Inlist));
if (!it) if (!it)
{ {
@ -637,6 +637,7 @@ eina_inlist_iterator_new(const Eina_Inlist *list)
it->head = list; it->head = list;
it->current = list; it->current = list;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(eina_inlist_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(eina_inlist_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
eina_inlist_iterator_get_container); eina_inlist_iterator_get_container);
@ -676,6 +677,7 @@ eina_inlist_accessor_new(const Eina_Inlist *list)
it->current = list; it->current = list;
it->index = 0; it->index = 0;
it->accessor.version = EINA_ACCESSOR_VERSION;
it->accessor.get_at = FUNC_ACCESSOR_GET_AT(eina_inlist_accessor_get_at); it->accessor.get_at = FUNC_ACCESSOR_GET_AT(eina_inlist_accessor_get_at);
it->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER( it->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER(
eina_inlist_accessor_get_container); eina_inlist_accessor_get_container);

View File

@ -2064,7 +2064,7 @@ eina_list_iterator_new(const Eina_List *list)
{ {
Eina_Iterator_List *it; Eina_Iterator_List *it;
eina_error_set(0); eina_error_set(0);
it = calloc(1, sizeof (Eina_Iterator_List)); it = calloc(1, sizeof (Eina_Iterator_List));
if (!it) if (!it)
{ {
@ -2078,6 +2078,7 @@ eina_list_iterator_new(const Eina_List *list)
it->head = list; it->head = list;
it->current = list; it->current = list;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(eina_list_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(eina_list_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
eina_list_iterator_get_container); eina_list_iterator_get_container);
@ -2127,6 +2128,7 @@ eina_list_iterator_reversed_new(const Eina_List *list)
it->head = eina_list_last(list); it->head = eina_list_last(list);
it->current = it->head; it->current = it->head;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(eina_list_iterator_prev); it->iterator.next = FUNC_ITERATOR_NEXT(eina_list_iterator_prev);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
eina_list_iterator_get_container); eina_list_iterator_get_container);
@ -2167,6 +2169,7 @@ eina_list_accessor_new(const Eina_List *list)
it->current = list; it->current = list;
it->index = 0; it->index = 0;
it->accessor.version = EINA_ACCESSOR_VERSION;
it->accessor.get_at = FUNC_ACCESSOR_GET_AT(eina_list_accessor_get_at); it->accessor.get_at = FUNC_ACCESSOR_GET_AT(eina_list_accessor_get_at);
it->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER( it->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER(
eina_list_accessor_get_container); eina_list_accessor_get_container);

View File

@ -1608,6 +1608,7 @@ eina_matrixsparse_iterator_new(const Eina_Matrixsparse *m)
it->ref.row = m->rows; it->ref.row = m->rows;
it->ref.col = m->rows ? m->rows->cols : NULL; it->ref.col = m->rows ? m->rows->cols : NULL;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_eina_matrixsparse_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(_eina_matrixsparse_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
_eina_matrixsparse_iterator_get_container); _eina_matrixsparse_iterator_get_container);
@ -1670,6 +1671,7 @@ eina_matrixsparse_iterator_complete_new(const Eina_Matrixsparse *m)
it->dummy.col.parent = &it->dummy.row; it->dummy.col.parent = &it->dummy.row;
EINA_MAGIC_SET(&it->dummy.col, EINA_MAGIC_MATRIXSPARSE_CELL); EINA_MAGIC_SET(&it->dummy.col, EINA_MAGIC_MATRIXSPARSE_CELL);
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT( it->iterator.next = FUNC_ITERATOR_NEXT(
_eina_matrixsparse_iterator_complete_next); _eina_matrixsparse_iterator_complete_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(

View File

@ -184,7 +184,7 @@ _eina_rbtree_iterator_build(const Eina_Rbtree *root, unsigned char mask)
Eina_Iterator_Rbtree_List *first; Eina_Iterator_Rbtree_List *first;
Eina_Iterator_Rbtree *it; Eina_Iterator_Rbtree *it;
eina_error_set(0); eina_error_set(0);
it = calloc(1, sizeof (Eina_Iterator_Rbtree)); it = calloc(1, sizeof (Eina_Iterator_Rbtree));
if (!it) if (!it)
{ {
@ -204,6 +204,7 @@ _eina_rbtree_iterator_build(const Eina_Rbtree *root, unsigned char mask)
it->mask = mask; it->mask = mask;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_eina_rbtree_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(_eina_rbtree_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
_eina_rbtree_iterator_get_content); _eina_rbtree_iterator_get_content);

View File

@ -1190,6 +1190,7 @@ EAPI Eina_Iterator *eina_tiler_iterator_new(const Eina_Tiler *t)
Eina_Iterator_Tiler *it; Eina_Iterator_Tiler *it;
EINA_MAGIC_CHECK_TILER(t, NULL); EINA_MAGIC_CHECK_TILER(t, NULL);
it = calloc(1, sizeof (Eina_Iterator_Tiler)); it = calloc(1, sizeof (Eina_Iterator_Tiler));
if (!it) if (!it)
return NULL; return NULL;
@ -1209,6 +1210,8 @@ EAPI Eina_Iterator *eina_tiler_iterator_new(const Eina_Tiler *t)
} }
it->curr = it->tiler->splitter.rects.head; it->curr = it->tiler->splitter.rects.head;
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(_iterator_next);
it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
_iterator_get_container); _iterator_get_container);
@ -1282,6 +1285,7 @@ eina_tile_grid_slicer_iterator_new(int x,
EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR); EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
it->iterator.version = EINA_ITERATOR_VERSION;
it->iterator.next = FUNC_ITERATOR_NEXT(eina_tile_grid_slicer_iterator_next); it->iterator.next = FUNC_ITERATOR_NEXT(eina_tile_grid_slicer_iterator_next);
it->iterator.free = FUNC_ITERATOR_FREE(eina_tile_grid_slicer_iterator_free); it->iterator.free = FUNC_ITERATOR_FREE(eina_tile_grid_slicer_iterator_free);

View File

@ -78,7 +78,7 @@ START_TEST(eina_array_static)
eina_init(); eina_init();
eina_array_step_set(&sea, 10); eina_array_step_set(&sea, sizeof(sea), 10);
for (i = 0; i < 200; ++i) for (i = 0; i < 200; ++i)
{ {

View File

@ -155,15 +155,20 @@ evas_new(void)
e->hinting = EVAS_FONT_HINTING_BYTECODE; e->hinting = EVAS_FONT_HINTING_BYTECODE;
e->name_hash = eina_hash_string_superfast_new(NULL); e->name_hash = eina_hash_string_superfast_new(NULL);
eina_array_step_set(&e->delete_objects, 256); #define EVAS_ARRAY_SET(E, Array) \
eina_array_step_set(&e->active_objects, 256); eina_array_step_set(&E->Array, sizeof (E->Array), 256);
eina_array_step_set(&e->restack_objects, 256);
eina_array_step_set(&e->render_objects, 256); EVAS_ARRAY_SET(e, delete_objects);
eina_array_step_set(&e->pending_objects, 256); EVAS_ARRAY_SET(e, active_objects);
eina_array_step_set(&e->obscuring_objects, 256); EVAS_ARRAY_SET(e, restack_objects);
eina_array_step_set(&e->temporary_objects, 256); EVAS_ARRAY_SET(e, render_objects);
eina_array_step_set(&e->calculate_objects, 256); EVAS_ARRAY_SET(e, pending_objects);
eina_array_step_set(&e->clip_changes, 256); EVAS_ARRAY_SET(e, obscuring_objects);
EVAS_ARRAY_SET(e, temporary_objects);
EVAS_ARRAY_SET(e, calculate_objects);
EVAS_ARRAY_SET(e, clip_changes);
#undef EVAS_ARRAY_SET
return e; return e;
} }