From 9ed6bea380719603eb6948b1b794706d688a0dfc Mon Sep 17 00:00:00 2001 From: Larry Jr Date: Sun, 5 Apr 2015 15:19:49 +0200 Subject: [PATCH] emodel: API changes and removed unnecessary eina_values copy and stringshares --- src/lib/eio/eio_model.c | 164 ++++++++-------------------- src/lib/eio/eio_model_private.h | 13 +-- src/lib/emodel/Emodel_Common.h | 18 +-- src/lib/emodel/emodel.eo | 2 +- src/tests/emodel/emodel_test_file.c | 53 ++++----- 5 files changed, 72 insertions(+), 178 deletions(-) diff --git a/src/lib/eio/eio_model.c b/src/lib/eio/eio_model.c index 7b6bf1d5a4..f642937055 100644 --- a/src/lib/eio/eio_model.c +++ b/src/lib/eio/eio_model.c @@ -22,13 +22,16 @@ static void _eio_model_emodel_properties_load(Eo *, Eio_Model_Data *); static void _eio_model_emodel_children_load(Eo *, Eio_Model_Data *); static void -_load_set(Eio_Model_Data *priv, Emodel_Load load) +_load_set(Eio_Model_Data *priv, Emodel_Load_Status status) { + Emodel_Load load; + + load.status = status; if ((priv->load.status & (EMODEL_LOAD_STATUS_LOADED | EMODEL_LOAD_STATUS_LOADING)) && (load.status & (EMODEL_LOAD_STATUS_LOADED | EMODEL_LOAD_STATUS_LOADING))) { - load.status = priv->load.status | load.status; - switch (load.status) + load.status = priv->load.status | status; + switch (status) { case EMODEL_LOAD_STATUS_LOADED_PROPERTIES: load.status &= ~EMODEL_LOAD_STATUS_LOADING_PROPERTIES; @@ -53,33 +56,6 @@ _load_set(Eio_Model_Data *priv, Emodel_Load load) } } -static void -_stat_pro_set(Eio_Model_Data *priv, int prop_id, const Eina_Value *value, Emodel_Property_Event *evt) -{ - Eina_Value old_value; - int changed; - Emodel_Property_Pair *pair = NULL; - const char *prop = EIO_MODEL_PROPERTIES_DESC->members[prop_id].name; - - eina_value_struct_value_get(priv->properties, prop, &old_value); - changed = eina_value_compare(&old_value, value); - - if(changed) eina_value_struct_value_set(priv->properties, prop, value); - eina_value_flush(&old_value); - if(!changed) return; - - pair = calloc(1, sizeof(Emodel_Property_Pair)); - EINA_SAFETY_ON_NULL_RETURN(pair); - if(!eina_value_copy((Eina_Value*)value, &pair->value)) - { - free(pair); - return; - } - - pair->property = eina_stringshare_add(prop); - evt->changed_properties = eina_list_append(evt->changed_properties, pair); -} - /** * Callbacks * Property @@ -88,52 +64,34 @@ static void _eio_stat_done_cb(void *data, Eio_File *handler EINA_UNUSED, const Eina_Stat *stat) { Emodel_Property_Event evt; - Eina_Value value; Eio_Model_Data *priv = data; - Emodel_Load load; + Eina_Bool changed = EINA_FALSE; + Eina_Value_Struct_Desc *desc = EIO_MODEL_PROPERTIES_DESC; + EINA_SAFETY_ON_FALSE_RETURN(eo_ref_get(priv->obj)); priv->stat = stat; memset(&evt, 0, sizeof(Emodel_Property_Event)); - // Setup for Eina_Bool - eina_value_setup(&value, EINA_VALUE_TYPE_INT); - eina_value_set(&value, eio_file_is_dir(stat)); - _stat_pro_set(priv, EIO_MODEL_PROP_IS_DIR, (const Eina_Value*)&value, &evt); - eina_value_flush(&value); + changed |= eina_value_struct_set(priv->properties, + desc->members[EIO_MODEL_PROP_IS_DIR].name, eio_file_is_dir(stat)); - // Setup for Eina_Bool - eina_value_setup(&value, EINA_VALUE_TYPE_INT); - eina_value_set(&value, eio_file_is_lnk(stat)); - _stat_pro_set(priv, EIO_MODEL_PROP_IS_LNK, (const Eina_Value*)&value, &evt); - eina_value_flush(&value); + changed |= eina_value_struct_set(priv->properties, + desc->members[EIO_MODEL_PROP_IS_LNK].name, eio_file_is_lnk(stat)); - // Setup for double - eina_value_setup(&value, EINA_VALUE_TYPE_TIMEVAL); - eina_value_set(&value, eio_file_mtime(stat)); - _stat_pro_set(priv, EIO_MODEL_PROP_MTIME, (const Eina_Value*)&value, &evt); - eina_value_flush(&value); + changed |= eina_value_struct_set(priv->properties, + desc->members[EIO_MODEL_PROP_MTIME].name, eio_file_mtime(stat)); - // Setup for long long - eina_value_setup(&value, EINA_VALUE_TYPE_INT64); - eina_value_set(&value, eio_file_size(stat)); - _stat_pro_set(priv, EIO_MODEL_PROP_SIZE, (const Eina_Value*)&value, &evt); - eina_value_flush(&value); + changed |= eina_value_struct_set(priv->properties, + desc->members[EIO_MODEL_PROP_SIZE].name, eio_file_size(stat)); - if (evt.changed_properties != NULL) + if (changed == EINA_TRUE) { - Emodel_Property_Pair *pair; + evt.changed_properties = priv->properties; eo_do(priv->obj, eo_event_callback_call(EMODEL_EVENT_PROPERTIES_CHANGED, &evt)); - EINA_LIST_FREE(evt.changed_properties, pair) - { - eina_stringshare_del(pair->property); - eina_value_flush(&pair->value); - free(pair); - } } - load.status = EMODEL_LOAD_STATUS_LOADED_PROPERTIES; - _load_set(priv, load); + _load_set(priv, EMODEL_LOAD_STATUS_LOADED_PROPERTIES); if (priv->load_pending & EMODEL_LOAD_STATUS_LOADED_CHILDREN) _eio_model_emodel_children_load(priv->obj, priv); @@ -149,7 +107,6 @@ static void _eio_move_done_cb(void *data, Eio_File *handler EINA_UNUSED) { Emodel_Property_Event evt; - Emodel_Property_Pair pair_path, pair_filename; Eio_Model_Data *priv = data; Eina_Value_Struct_Desc *desc = EIO_MODEL_PROPERTIES_DESC; @@ -161,24 +118,11 @@ _eio_move_done_cb(void *data, Eio_File *handler EINA_UNUSED) * When mv is executed we update our values and * notify both path and filename properties listeners. */ - pair_path.property = eina_stringshare_add(desc->members[EIO_MODEL_PROP_PATH].name); - eina_value_struct_set(priv->properties, pair_path.property, priv->path); - eina_value_struct_value_get(priv->properties, pair_path.property, &pair_path.value); - evt.changed_properties = eina_list_append(evt.changed_properties, &pair_path); - - pair_filename.property = eina_stringshare_add(desc->members[EIO_MODEL_PROP_FILENAME].name); - eina_value_struct_set(priv->properties, pair_filename.property, basename(priv->path)); - eina_value_struct_value_get(priv->properties, pair_filename.property, &pair_filename.value); - evt.changed_properties = eina_list_append(evt.changed_properties, &pair_filename); + eina_value_struct_set(priv->properties, desc->members[EIO_MODEL_PROP_PATH].name, priv->path); + eina_value_struct_set(priv->properties, desc->members[EIO_MODEL_PROP_FILENAME].name, basename(priv->path)); + evt.changed_properties = priv->properties; eo_do(priv->obj, eo_event_callback_call(EMODEL_EVENT_PROPERTIES_CHANGED, &evt)); - - eina_stringshare_del(pair_path.property); - eina_stringshare_del(pair_filename.property); - eina_value_flush(&pair_filename.value); - eina_value_flush(&pair_path.value); - - eina_list_free(evt.changed_properties); } static void @@ -247,8 +191,6 @@ _emodel_evt_deleted_ecore_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void if(cur) { Emodel_Children_Event cevt; - - cevt.index = i; cevt.child = cur->data; @@ -314,7 +256,7 @@ _eio_error_unlink_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, int */ static Emodel_Load_Status _eio_model_emodel_properties_list_get(Eo *obj EINA_UNUSED, - Eio_Model_Data *_pd, Eina_List * const* properties_list) + Eio_Model_Data *_pd, Eina_Array * const* properties_list) { Eio_Model_Data *priv = _pd; unsigned int i; @@ -322,14 +264,15 @@ _eio_model_emodel_properties_list_get(Eo *obj EINA_UNUSED, EINA_SAFETY_ON_NULL_RETURN_VAL(priv, EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(priv->obj, EINA_FALSE); - if(priv->properties_list == NULL) + if(priv->properties_array == NULL) { Eina_Value_Struct_Desc *desc = EIO_MODEL_PROPERTIES_DESC; + priv->properties_array = eina_array_new(desc->member_count); for(i = 0; i < desc->member_count; ++i) - priv->properties_list = eina_list_append(priv->properties_list, desc->members[i].name); + eina_array_push(priv->properties_array, desc->members[i].name); } - *(Eina_List **)properties_list = priv->properties_list; + *(Eina_Array **)properties_list = priv->properties_array; return priv->load.status; } @@ -340,15 +283,11 @@ _eio_model_emodel_properties_list_get(Eo *obj EINA_UNUSED, static Emodel_Load_Status _eio_model_emodel_property_get(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, const char *property, Eina_Value *value) { - Eina_Value _v; EINA_SAFETY_ON_NULL_RETURN_VAL(property, EMODEL_LOAD_STATUS_ERROR); EINA_SAFETY_ON_NULL_RETURN_VAL(priv, EMODEL_LOAD_STATUS_ERROR); - EINA_SAFETY_ON_NULL_RETURN_VAL(priv->obj, EMODEL_LOAD_STATUS_ERROR); - if (eina_value_struct_value_get(priv->properties, property, &_v) == EINA_TRUE) - { - eina_value_copy(&_v, value); - } + //XXX Return error code? + eina_value_struct_value_get(priv->properties, property, value); return priv->load.status; } @@ -375,7 +314,7 @@ _eio_model_emodel_property_set(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, const fprintf(stdout, " path %s filename %s\n", priv->path, basename(priv->path)); eina_value_struct_set(priv->properties, "path", priv->path); - eina_value_struct_set(priv->properties, "filename", eina_stringshare_add(basename(priv->path))); + eina_value_struct_set(priv->properties, "filename", basename(priv->path)); _eio_monitors_list_load(priv); @@ -413,7 +352,6 @@ _eio_model_emodel_children_count_get(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, static void _eio_model_emodel_properties_load(Eo *obj EINA_UNUSED, Eio_Model_Data *priv) { - Emodel_Load load; if (priv->path == NULL) { priv->load_pending |= EMODEL_LOAD_STATUS_LOADED_PROPERTIES; @@ -423,8 +361,7 @@ _eio_model_emodel_properties_load(Eo *obj EINA_UNUSED, Eio_Model_Data *priv) if (!(priv->load.status & (EMODEL_LOAD_STATUS_LOADED_PROPERTIES | EMODEL_LOAD_STATUS_LOADING_PROPERTIES))) { - load.status = EMODEL_LOAD_STATUS_LOADING_PROPERTIES; - _load_set(priv, load); + _load_set(priv, EMODEL_LOAD_STATUS_LOADING_PROPERTIES); priv->file = eio_file_direct_stat(priv->path, _eio_stat_done_cb, _eio_error_cb, priv); } } @@ -470,11 +407,10 @@ _eio_main_children_load_cb(void *data, Eio_File *handler EINA_UNUSED, const Eina Eio_Model_Data *priv = data; EINA_SAFETY_ON_NULL_RETURN(priv); - child = eo_add_ref(MY_CLASS, NULL, eio_model_path_set(info->path)); + child = eo_add(MY_CLASS, NULL, eio_model_path_set(info->path)); if (priv->filter_cb) - { - eo_do(child, eio_model_children_filter_set(priv->filter_cb, priv->filter_userdata)); - } + eo_do(child, eio_model_children_filter_set(priv->filter_cb, priv->filter_userdata)); + priv->children_list = eina_list_append(priv->children_list, child); } @@ -483,13 +419,11 @@ _eio_done_children_load_cb(void *data, Eio_File *handler EINA_UNUSED) { unsigned long count; Eio_Model_Data *priv = data; - Emodel_Load load; EINA_SAFETY_ON_NULL_RETURN(priv); count = eina_list_count(priv->children_list); - load.status = EMODEL_LOAD_STATUS_LOADED_CHILDREN; + _load_set(priv, EMODEL_LOAD_STATUS_LOADED_CHILDREN); - _load_set(priv, load); eo_do(priv->obj, eo_event_callback_call(EMODEL_EVENT_CHILDREN_COUNT_CHANGED, &count)); } @@ -498,14 +432,11 @@ _eio_error_children_load_cb(void *data, Eio_File *handler EINA_UNUSED, int error { Eio_Model_Data *priv = data; Eo *child; - Emodel_Load load; fprintf(stderr, "%s: err=%d\n", __FUNCTION__, error); EINA_LIST_FREE(priv->children_list, child) eo_unref(child); - load.status = EMODEL_LOAD_STATUS_LOADED_CHILDREN; - - _load_set(priv, load); + _load_set(priv, EMODEL_LOAD_STATUS_LOADED_CHILDREN); } /** @@ -514,7 +445,6 @@ _eio_error_children_load_cb(void *data, Eio_File *handler EINA_UNUSED, int error static void _eio_model_emodel_children_load(Eo *obj EINA_UNUSED, Eio_Model_Data *priv) { - Emodel_Load load; if (priv->path == NULL) { priv->load_pending |= EMODEL_LOAD_STATUS_LOADED_CHILDREN; @@ -522,12 +452,12 @@ _eio_model_emodel_children_load(Eo *obj EINA_UNUSED, Eio_Model_Data *priv) } priv->load_pending &= ~EMODEL_LOAD_STATUS_LOADED_CHILDREN; - if (!(priv->load.status & (EMODEL_LOAD_STATUS_LOADED_CHILDREN | EMODEL_LOAD_STATUS_LOADING_CHILDREN))) + if (priv->children_list == NULL && + !(priv->load.status & (EMODEL_LOAD_STATUS_LOADED_CHILDREN | EMODEL_LOAD_STATUS_LOADING_CHILDREN))) { _eio_model_emodel_monitor_add(priv); - load.status = EMODEL_LOAD_STATUS_LOADING_CHILDREN; - _load_set(priv, load); + _load_set(priv, EMODEL_LOAD_STATUS_LOADING_CHILDREN); eio_file_direct_ls(priv->path, _eio_filter_children_load_cb, _eio_main_children_load_cb, _eio_done_children_load_cb, _eio_error_children_load_cb, priv); @@ -559,7 +489,6 @@ _eio_model_emodel_load_status_get(Eo *obj EINA_UNUSED, Eio_Model_Data *priv) static void _eio_model_emodel_unload(Eo *obj EINA_UNUSED, Eio_Model_Data *priv) { - Emodel_Load load; if (!(priv->load.status & EMODEL_LOAD_STATUS_UNLOADED)) { Eo *child; @@ -568,8 +497,7 @@ _eio_model_emodel_unload(Eo *obj EINA_UNUSED, Eio_Model_Data *priv) eo_unref(child); } - load.status = EMODEL_LOAD_STATUS_UNLOADED; - _load_set(priv, load); + _load_set(priv, EMODEL_LOAD_STATUS_UNLOADED); } } @@ -709,7 +637,6 @@ _struct_properties_init(void) EINA_VALUE_STRUCT_MEMBER(NULL, This_Eio_Properties, is_lnk), EINA_VALUE_STRUCT_MEMBER(NULL, This_Eio_Properties, size) }; - //XXX: Check data types prop_members[EIO_MODEL_PROP_FILENAME].type = EINA_VALUE_TYPE_STRING; prop_members[EIO_MODEL_PROP_PATH].type = EINA_VALUE_TYPE_STRING; prop_members[EIO_MODEL_PROP_MTIME].type = EINA_VALUE_TYPE_TIMEVAL; @@ -746,7 +673,6 @@ _eio_model_eo_base_constructor(Eo *obj, Eio_Model_Data *priv) static void _eio_model_path_set(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, const char *path) { - //_eio_model_eo_base_constructor(obj, priv); priv->path = strdup(path); eina_value_struct_set(priv->properties, "path", priv->path); @@ -760,11 +686,15 @@ static void _eio_model_eo_base_destructor(Eo *obj , Eio_Model_Data *priv) { Eo *child; + if(priv->monitor) eio_monitor_del(priv->monitor); - eina_list_free(priv->properties_list); - eina_value_free(priv->properties); + if (priv->properties_array) + eina_array_free(priv->properties_array); + + if (priv->properties) + eina_value_free(priv->properties); EINA_LIST_FREE(priv->children_list, child) eo_unref(child); diff --git a/src/lib/eio/eio_model_private.h b/src/lib/eio/eio_model_private.h index 26ebdfc819..a07fba56b2 100644 --- a/src/lib/eio/eio_model_private.h +++ b/src/lib/eio/eio_model_private.h @@ -4,7 +4,6 @@ #define PROP_LIST_SIZE 7 typedef struct _Eio_Model_Data Eio_Model_Data; -//typedef struct _Eio_Model_Child_Add Eio_Model_Child_Add; typedef struct _Eio_Model_Monitor_Data Eio_Model_Monitor_Data; struct _Eio_Model_Monitor_Data @@ -33,7 +32,7 @@ struct _Eio_Model_Data { Eo *obj; char *path; - Eina_List *properties_list; + Eina_Array *properties_array; Eina_Value *properties; Emodel_Load load; int load_pending; @@ -49,14 +48,4 @@ struct _Eio_Model_Data void *filter_userdata; }; -/* -struct _Eio_Model_Child_Add -{ - Eo *child; - Eio_Model_Data *priv; - char* fullpath; - char *name; -}; -*/ - #endif diff --git a/src/lib/emodel/Emodel_Common.h b/src/lib/emodel/Emodel_Common.h index d457c48afd..608de82c35 100644 --- a/src/lib/emodel/Emodel_Common.h +++ b/src/lib/emodel/Emodel_Common.h @@ -45,27 +45,13 @@ struct _Emodel_Load */ typedef struct _Emodel_Load Emodel_Load; -/** - * @struct _Emodel_Property_Pair - */ -struct _Emodel_Property_Pair -{ - Eina_Value value; /**< the property value */ - Eina_Stringshare *property; /**< the property name */ -}; - -/** - * @typedef Emodel_Property_Pair - */ -typedef struct _Emodel_Property_Pair Emodel_Property_Pair; - /** * @struct _Emodel_Property_Event */ struct _Emodel_Property_Event { - Eina_List *changed_properties; /**< the property value */ - Eina_List *invalidated_properties; /**< the property name */ + const Eina_Value *changed_properties; /**< Eina_Value_Struct or Eina_Value_Hash with changed properties values */ + Eina_Array *invalidated_properties; /**< array of name */ }; /** diff --git a/src/lib/emodel/emodel.eo b/src/lib/emodel/emodel.eo index 39fccf239c..ca176520e4 100644 --- a/src/lib/emodel/emodel.eo +++ b/src/lib/emodel/emodel.eo @@ -66,7 +66,7 @@ interface Emodel () return: Emodel_Load_Status; } values { - const(list*) properties_list; /*@ list of current properties */ + const(array*) properties_list; /*@ list of current properties */ } } property { diff --git a/src/tests/emodel/emodel_test_file.c b/src/tests/emodel/emodel_test_file.c index 029aa2e459..d672a9da2f 100644 --- a/src/tests/emodel/emodel_test_file.c +++ b/src/tests/emodel/emodel_test_file.c @@ -30,12 +30,10 @@ struct reqs_t { int changed_is_lnk; int changed_size; int changed_mtime; - int changed_icon; /* properties list */ int proplist_filename; int proplist_path; - int proplist_icon; int proplist_mtime; int proplist_is_dir; int proplist_is_lnk; @@ -140,31 +138,24 @@ _load_status_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description *des } static Eina_Bool -_properties_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info) +_properties_change_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info) { const Emodel_Property_Event *evt = (Emodel_Property_Event *)event_info; - Emodel_Property_Pair *pair = NULL; - Eina_List *l = NULL; + Eina_Value v; - EINA_LIST_FOREACH(evt->changed_properties, l, pair) - { - char *str; - str = eina_value_to_string(&pair->value); - fprintf(stdout, "Received changed property=%s, value=%s\n", - pair->property, str); - free(str); - if(!strcmp(pair->property, "is_dir")) - reqs.changed_is_dir = 1; - if(!strcmp(pair->property, "is_lnk")) - reqs.changed_is_lnk = 1; - if(!strcmp(pair->property, "size")) - reqs.changed_size = 1; - if(!strcmp(pair->property, "mtime")) - reqs.changed_mtime = 1; - if(!strcmp(pair->property, "icon")) - reqs.changed_icon = 1; - } + if (eina_value_type_get(evt->changed_properties) != EINA_VALUE_TYPE_STRUCT) + return EINA_FALSE; + if(eina_value_struct_value_get(evt->changed_properties, "is_dir", &v) == EINA_TRUE) + reqs.changed_is_dir = 1; + if(eina_value_struct_value_get(evt->changed_properties, "is_lnk", &v) == EINA_TRUE) + reqs.changed_is_lnk = 1; + if(eina_value_struct_value_get(evt->changed_properties, "size", &v) == EINA_TRUE) + reqs.changed_size = 1; + if(eina_value_struct_value_get(evt->changed_properties, "mtime", &v) == EINA_TRUE) + reqs.changed_mtime = 1; + + eina_value_flush(&v); reqs.properties = 1; return EINA_TRUE; } @@ -192,10 +183,10 @@ START_TEST(emodel_test_test_file) #ifdef _RUN_LOCAL_TEST Eina_Value nameset_value; #endif - Eina_List *properties_list; - Eina_List *l; + Eina_Array *properties_list; + Eina_Array_Iterator iterator; char *str; - int i; + unsigned int i; memset(&reqs, -1, sizeof(struct reqs_t)); @@ -207,7 +198,7 @@ START_TEST(emodel_test_test_file) fail_if(!filemodel, "ERROR: Cannot init model!\n"); eo_do(filemodel, eo_event_callback_add(EMODEL_EVENT_LOAD_STATUS, _load_status_cb, NULL)); - eo_do(filemodel, eo_event_callback_add(EMODEL_EVENT_PROPERTIES_CHANGED, _properties_cb, NULL)); + eo_do(filemodel, eo_event_callback_add(EMODEL_EVENT_PROPERTIES_CHANGED, _properties_change_cb, NULL)); eo_do(filemodel, eo_event_callback_add(EMODEL_EVENT_CHILDREN_COUNT_CHANGED, _children_count_cb, NULL)); eo_do(filemodel, emodel_load()); @@ -225,15 +216,13 @@ START_TEST(emodel_test_test_file) i = 0; eo_do(filemodel, emodel_properties_list_get(&properties_list)); - EINA_LIST_FOREACH((Eina_List *)properties_list, l, str) + EINA_ARRAY_ITER_NEXT(properties_list, i, str, iterator) { - fprintf(stdout, "Returned property list %d: %s\n", i++, str); + fprintf(stdout, "Returned property list %d: %s\n", i, str); if(!strcmp(str, "filename")) reqs.proplist_filename = 1; else if(!strcmp(str, "path")) reqs.proplist_path = 1; - else if(!strcmp(str, "icon")) - reqs.proplist_icon = 1; else if(!strcmp(str, "mtime")) reqs.proplist_mtime = 1; else if(!strcmp(str, "is_dir")) @@ -268,6 +257,6 @@ END_TEST void emodel_test_file(TCase *tc) { - /* tcase_add_test(tc, emodel_test_test_file); */ + tcase_add_test(tc, emodel_test_test_file); }