[Bug] Fix P121025-5370, P121023-4593, P121023-5109, S1-9544 : Use thread to calculate...
authorJing Yigang <yigang.jing@samsung.com>
Tue, 30 Oct 2012 05:44:08 +0000 (13:44 +0800)
committerJing Yigang <yigang.jing@samsung.com>
Tue, 30 Oct 2012 05:47:15 +0000 (13:47 +0800)
Change-Id: I7a2495dde78e098790e3c17476d7152a08dbfc6e

setting-storage/include/setting-storage.h
setting-storage/src/setting-storage-main.c
setting-storage/src/setting-storage.c

index 53e82b2..081782c 100755 (executable)
@@ -36,6 +36,8 @@
 #include <glib.h>
 #include <glib/gprintf.h>
 #include <sysman.h>
+#include <pthread.h>
+#include <media_content.h>
 
 #define SETTING_STORAGE_PROGRESSBAR_TIMEOUT 10
 #define SETTING_STORAGE_POPUP_TIMER    2
@@ -93,6 +95,16 @@ enum {
        SETTING_STORAGE_SYSMAN_REQUEST_SUCCESS = 0
 };
 
+typedef enum {
+       SETTING_STORAGE_SLEEP = -1,
+       SETTING_STORAGE_REUPDATE = 0,
+       SETTING_STORAGE_PICTURES_VIDEO = 1,
+       SETTING_STORAGE_DOWNLOADS,
+       SETTING_STORAGE_AUDIO,
+       SETTING_STORAGE_MISCELLANEOUS,
+       SETTING_STORAGE_APPLICATIONS,
+       SETTING_STORAGE_MAX,
+} update_type;
 
 typedef void (*setting_storage_mmc_cb) (int val, void *data);
 
@@ -114,6 +126,11 @@ typedef struct _app_info_t {
        int     total_size;
 } App_Info;
 
+typedef struct _update_info_t {
+       double total_size;
+       update_type type;
+} Update_Info;
+
 typedef struct _SettingStorageUG SettingStorageUG;
 
 /**
@@ -179,9 +196,14 @@ struct _SettingStorageUG {
 
        Setting_Done_List_Data miscellaneous_list;  /* miscellaneous files list */
 
-       Eina_List *apps_list;
-       Ecore_Timer *timer;
-       Evas_Object *pop_progress;
+       Ecore_Pipe *pipe;
+       Eina_Bool exit_flag;
+       update_type type;
+       pthread_t tid;
+
+       pthread_mutex_t exit_mutex;
+       pthread_mutex_t update_mutex;
+       pthread_cond_t wait_cond;
 };
 
 extern setting_view setting_view_storage_main;
index eeba091..55dbb27 100755 (executable)
@@ -22,7 +22,6 @@
 #include <Ecore_X.h>
 #include <package-manager.h>
 #include <ail.h>
-#include <media_content.h>
 
 static int setting_storage_main_create(void *cb);
 static int setting_storage_main_destroy(void *cb);
@@ -226,7 +225,7 @@ static int __setting_storage_main_fs_stat(double *total, double *avail, const ch
 
 static long long __setting_storage_main_folder_size_get(char *path)
 {
-       SETTING_TRACE_BEGIN;
+       //SETTING_TRACE_BEGIN;
        setting_retvm_if(NULL == path, SETTING_RETURN_FAIL, "path is NULL");
 
        unsigned long long size = 0;
@@ -241,7 +240,7 @@ static long long __setting_storage_main_folder_size_get(char *path)
                        int i = 0;
                        int dir_list_len =  setting_storage_list_len_get(dir_list);
                        int file_list_len = setting_storage_list_len_get(file_list);
-                       SETTING_TRACE("dir_list_len is [%d] file_list_len is [%d]", dir_list_len, file_list_len);
+                       //SETTING_TRACE("dir_list_len is [%d] file_list_len is [%d]", dir_list_len, file_list_len);
                        for (i = 0; i < file_list_len; i++) {
                                Node_Info *pNode = NULL;
                                pNode = (Node_Info *)eina_list_nth(file_list, i);
@@ -256,7 +255,7 @@ static long long __setting_storage_main_folder_size_get(char *path)
                                if (pNode == NULL)
                                        continue;
                                full_path =  g_strconcat(pNode->path, "/", pNode->name, NULL);
-                               SETTING_TRACE("full_path is [%s]", full_path);
+                               //SETTING_TRACE("full_path is [%s]", full_path);
                                size += (__setting_storage_main_folder_size_get(full_path));
                                FREE(full_path);
                        }
@@ -278,8 +277,8 @@ static long long __setting_storage_main_folder_size_get(char *path)
 
 static int __setting_storage_status_size_transition(double size, char *size_desc)
 {
-       SETTING_TRACE_BEGIN;
-       SETTING_TRACE("size = %f", size);
+       //SETTING_TRACE_BEGIN;
+       //SETTING_TRACE("size = %f", size);
        double tmp_size = 0.0;
        int ret = 0;
        if (size < SETTING_STORAGE_MEGABYTE_VALUE) {    // size < 1MB: show x.xKB
@@ -327,63 +326,49 @@ static void __setting_storage_main_internal_storage_status_get(void *data)
        ad->internal_status = internal_status;
 }
 
-static void __setting_storage_main_pictures_videos_status_get(void *data)
+static double __setting_storage_main_pictures_videos_status_get()
 {
        SETTING_TRACE_BEGIN;
-       setting_retm_if(data == NULL, "Data parameter is NULL");
-       SettingStorageUG *ad = (SettingStorageUG *) data;
-
-       double dTotal = 0.0;
+       double total_size = 0.0;
+       double tmp_size = 0.0;
        int ret = SETTING_RETURN_SUCCESS;
-       Setting_Storage_Status pics_videos_status;
 
-       dTotal = __setting_storage_main_folder_size_get(SETTING_STORAGE_PICTURES_PATH);
-       setting_retm_if(ret == SETTING_RETURN_FAIL, "get pictures status failed");
-       pics_videos_status.dTotal = dTotal;
-       //SETTING_TRACE("pics_videos_status = %f", dTotal);
+       tmp_size = __setting_storage_main_folder_size_get(SETTING_STORAGE_PICTURES_PATH);
+       setting_retvm_if(ret == SETTING_RETURN_FAIL, total_size, "get pictures status failed");
+       total_size += tmp_size;
 
-       dTotal = 0.0;
-       dTotal = __setting_storage_main_folder_size_get(SETTING_STORAGE_VIDEOS_PATH);
-       setting_retm_if(ret == SETTING_RETURN_FAIL, "get video status failed");
-       //SETTING_TRACE("pics_videos_status = %f", dTotal);
-       pics_videos_status.dTotal += dTotal;
+       tmp_size = 0.0;
+       tmp_size = __setting_storage_main_folder_size_get(SETTING_STORAGE_VIDEOS_PATH);
+       setting_retvm_if(ret == SETTING_RETURN_FAIL, total_size, "get video status failed");
+       total_size += tmp_size;
 
-       dTotal = 0.0;
-       dTotal = __setting_storage_main_folder_size_get(SETTING_STORAGE_CAMERA_PATH);
-       setting_retm_if(ret == SETTING_RETURN_FAIL, "get camera status failed");
-       //SETTING_TRACE("pics_videos_status = %f", dTotal);
-       pics_videos_status.dTotal += dTotal;
+       tmp_size = 0.0;
+       tmp_size = __setting_storage_main_folder_size_get(SETTING_STORAGE_CAMERA_PATH);
+       setting_retvm_if(ret == SETTING_RETURN_FAIL, total_size, "get camera status failed");
+       total_size += tmp_size;
 
-       //SETTING_TRACE("pics_videos_status = %f", pics_videos_status.dTotal);
-
-       ad->pics_videos_status = pics_videos_status;
+       return total_size;
 }
 
-static void __setting_storage_main_downloads_status_get(void *data)
+static double __setting_storage_main_downloads_status_get()
 {
        SETTING_TRACE_BEGIN;
-       setting_retm_if(data == NULL, "Data parameter is NULL");
-       SettingStorageUG *ad = (SettingStorageUG *) data;
 
-       double dTotal = 0.0;
+       double total_size = 0.0;
        int ret = SETTING_RETURN_SUCCESS;
-       Setting_Storage_Status downloads_status;
-
-       dTotal = __setting_storage_main_folder_size_get(SETTING_STORAGE_DOWNLOADS_PATH);
-       setting_retm_if(ret == SETTING_RETURN_FAIL, "get pictures status failed");
-       downloads_status.dTotal = dTotal;
 
-       //SETTING_TRACE("downloads_status = %f", dTotal);
+       total_size = __setting_storage_main_folder_size_get(SETTING_STORAGE_DOWNLOADS_PATH);
+       setting_retvm_if(ret == SETTING_RETURN_FAIL, total_size, "get downloads status failed");
 
-       ad->downloads_status = downloads_status;
+       return total_size;
 }
 
 static bool __setting_storage_main_media_item_cb(media_info_h media, void *data)
 {
-       SETTING_TRACE_BEGIN;
+       //SETTING_TRACE_BEGIN;
        setting_retvm_if(media == NULL, true, "media is NULL");
        setting_retvm_if(data == NULL, true, "Data parameter is NULL");
-       SettingStorageUG *ad = (SettingStorageUG *) data;
+       double *total_size = (double *) data;
 
        media_content_type_e media_type = 0;
        unsigned long long size = 0;
@@ -392,11 +377,9 @@ static bool __setting_storage_main_media_item_cb(media_info_h media, void *data)
        //SETTING_TRACE("media_type : [%d]", media_type);
 
        if(media_type == MEDIA_CONTENT_TYPE_MUSIC) {
-               SETTING_TRACE("MEDIA_CONTENT_TYPE_MUSIC");
-
                media_info_get_size(media, &size);
                //SETTING_TRACE("size : [%lld]", size);
-               ad->audio_status.dTotal += size;
+               *total_size += size;
        } else {
                SETTING_TRACE("Other Content");
        }
@@ -404,13 +387,11 @@ static bool __setting_storage_main_media_item_cb(media_info_h media, void *data)
        return true;
 }
 
-static void __setting_storage_main_audio_status_get(void *data)
+static double __setting_storage_main_audio_status_get()
 {
        SETTING_TRACE_BEGIN;
-       setting_retm_if(data == NULL, "Data parameter is NULL");
-       SettingStorageUG *ad = (SettingStorageUG *) data;
 
-       ad->audio_status.dTotal = 0;
+       double total_size = 0.0;
 
        int ret = MEDIA_CONTENT_ERROR_NONE;
        filter_h filter = NULL;
@@ -421,29 +402,31 @@ static void __setting_storage_main_audio_status_get(void *data)
        ret = media_filter_create(&filter);
        if(ret != MEDIA_CONTENT_ERROR_NONE) {
                SETTING_TRACE("Fail to create filter");
-               return;
+               return total_size;
        }
 
        ret = media_filter_set_condition(filter, condition, MEDIA_CONTENT_COLLATE_DEFAULT);
        if(ret != MEDIA_CONTENT_ERROR_NONE) {
                media_filter_destroy(filter);
                SETTING_TRACE("Fail to set condition");
-               return;
+               return total_size;
        }
 
        ret = media_filter_set_order(filter, MEDIA_CONTENT_ORDER_ASC, MEDIA_TITLE, MEDIA_CONTENT_COLLATE_NOCASE);
        if(ret != MEDIA_CONTENT_ERROR_NONE) {
                media_filter_destroy(filter);
                SETTING_TRACE("Fail to set order");
-               return;
+               return total_size;
        }
 
-       ret = media_info_foreach_media_from_db(filter, __setting_storage_main_media_item_cb, ad);
+       ret = media_info_foreach_media_from_db(filter, __setting_storage_main_media_item_cb, &total_size);
        if(ret != MEDIA_CONTENT_ERROR_NONE) {
                media_filter_destroy(filter);
                SETTING_TRACE("Fail to get media");
-               return;
+               return total_size;
        }
+
+       return total_size;
 }
 
 static int __setting_storage_main_miscellaneous_list_get(char *path, Eina_List **dir_list, Eina_List **file_list)
@@ -530,11 +513,9 @@ static int __setting_storage_main_miscellaneous_list_get(char *path, Eina_List *
   *  drwxrwxrwx  2 app  app  16384 Oct  5      2012 lost+found
   * ++++++++++++++++++++++++++++++++++++++++++++++++
   */
-static void __setting_storage_main_miscellaneous_size_get(void *data)
+static double __setting_storage_main_miscellaneous_size_get()
 {
        SETTING_TRACE_BEGIN;
-       setting_retm_if(data == NULL, "Data parameter is NULL");
-       SettingStorageUG *ad = (SettingStorageUG *) data;
 
        unsigned long long size = 0;
        Eina_List *file_list = NULL;
@@ -550,14 +531,14 @@ static void __setting_storage_main_miscellaneous_size_get(void *data)
                        int i = 0;
                        int dir_list_len =  setting_storage_list_len_get(dir_list);
                        int file_list_len = setting_storage_list_len_get(file_list);
-                       SETTING_TRACE("dir_list_len is [%d] file_list_len is [%d]", dir_list_len, file_list_len);
+                       //SETTING_TRACE("dir_list_len is [%d] file_list_len is [%d]", dir_list_len, file_list_len);
                        for (i = 0; i < file_list_len; i++) {
                                Node_Info *pNode = NULL;
                                pNode = (Node_Info *)eina_list_nth(file_list, i);
                                if (pNode == NULL)
                                        continue;
                                size += pNode->size;
-                               SETTING_TRACE("path is [%s], name is [%s]", pNode->path, pNode->name);
+                               //SETTING_TRACE("path is [%s], name is [%s]", pNode->path, pNode->name);
                        }
                        for (i = 0; i < dir_list_len; i++) {
                                Node_Info *pNode = NULL;
@@ -566,7 +547,7 @@ static void __setting_storage_main_miscellaneous_size_get(void *data)
                                if (pNode == NULL)
                                        continue;
                                full_path =  g_strconcat(pNode->path, "/", pNode->name, NULL);
-                               SETTING_TRACE("full_path is [%s]", full_path);
+                               //SETTING_TRACE("full_path is [%s]", full_path);
                                size += (__setting_storage_main_folder_size_get(full_path));
                                FREE(full_path);
                        }
@@ -583,141 +564,7 @@ static void __setting_storage_main_miscellaneous_size_get(void *data)
                dir_list = NULL;
        }
 
-       ad->others_status.dTotal = size;
-}
-
-static void __setting_storage_main_apps_list_free(void *data)
-{
-       setting_retm_if(data == NULL, "Data parameter is NULL");
-       SettingStorageUG *ad = (SettingStorageUG *) data;
-
-       Eina_List *l = NULL;
-       App_Info *app_info;
-       EINA_LIST_FOREACH (ad->apps_list, l, app_info)
-       {
-               G_FREE(app_info->pkg_name);
-               G_FREE(app_info->pkg_type);
-               FREE(app_info);
-       }
-       eina_list_free(ad->apps_list);
-       ad->apps_list = NULL;
-}
-
-static ail_cb_ret_e __setting_storage_main_appinfo_func_cb(const ail_appinfo_h ail_info, void *data)
-{
-       setting_retvm_if(data == NULL, AIL_CB_RET_CONTINUE, "Data parameter is NULL");
-       SettingStorageUG *ad = (SettingStorageUG *) data;
-
-       char *pkg_name = NULL;
-       char *pkg_type = NULL;
-
-       ail_appinfo_get_str(ail_info, AIL_PROP_PACKAGE_STR, &pkg_name);
-       setting_retvm_if(pkg_name == NULL, AIL_CB_RET_CONTINUE, "get pkg_name failed");
-
-       ail_appinfo_get_str(ail_info, AIL_PROP_X_SLP_PACKAGETYPE_STR, &pkg_type);
-       setting_retvm_if(pkg_type == NULL, AIL_CB_RET_CONTINUE, "get pkg_type failed");
-
-       App_Info *app_info = (App_Info*)calloc(1, sizeof(App_Info));
-       setting_retvm_if(app_info == NULL, AIL_CB_RET_CONTINUE, "failed to calloc");
-
-       app_info->pkg_name = (char *)g_strdup(pkg_name);
-       app_info->pkg_type = (char *)g_strdup(pkg_type);
-       ad->apps_list = eina_list_append(ad->apps_list, app_info);
-       return AIL_CB_RET_CONTINUE;
-}
-
-static void __setting_storage_main_applications_list_get(void *data)
-{
-       SETTING_TRACE_BEGIN;
-       setting_retm_if(data == NULL, "Data parameter is NULL");
-       SettingStorageUG *ad = (SettingStorageUG *) data;
-
-       __setting_storage_main_apps_list_free(ad);
-
-       /* get app_info from AIL */
-       ail_filter_h filter_rpm = NULL;
-       ail_filter_h filter_wrt = NULL;
-       ail_filter_h filter_tpk = NULL;
-
-       ail_filter_new(&filter_rpm);
-       ail_filter_new(&filter_wrt);
-       ail_filter_new(&filter_tpk);
-
-       ail_filter_add_str(filter_rpm, AIL_PROP_X_SLP_PACKAGETYPE_STR, RPM_PREFIX);
-       ail_filter_add_str(filter_wrt, AIL_PROP_X_SLP_PACKAGETYPE_STR, WRT_PREFIX);
-       ail_filter_add_str(filter_tpk, AIL_PROP_X_SLP_PACKAGETYPE_STR, TPK_PREFIX);
-
-       ail_filter_list_appinfo_foreach(filter_rpm, __setting_storage_main_appinfo_func_cb, (void*)ad);
-       ail_filter_list_appinfo_foreach(filter_wrt, __setting_storage_main_appinfo_func_cb, (void*)ad);
-       ail_filter_list_appinfo_foreach(filter_tpk, __setting_storage_main_appinfo_func_cb, (void*)ad);
-
-       ail_filter_destroy(filter_rpm);
-       ail_filter_destroy(filter_wrt);
-       ail_filter_destroy(filter_tpk);
-}
-
-static void __setting_storage_main_applications_status_get(void *data)
-{
-       SETTING_TRACE_BEGIN;
-       setting_retm_if(data == NULL, "Data parameter is NULL");
-       SettingStorageUG *ad = (SettingStorageUG *) data;
-
-       __setting_storage_main_applications_list_get(ad);
-
-       ad->apps_status.dTotal = 0;
-
-       Eina_List *l = NULL;
-       App_Info *app_info;
-       EINA_LIST_FOREACH (ad->apps_list, l, app_info)
-       {
-               //SETTING_TRACE("pkg_name: %s ", app_info->pkg_name);
-               //SETTING_TRACE("pkg_type: %s", app_info->pkg_type);
-               pkgmgr_info *pkg_info = pkgmgr_info_new(app_info->pkg_type, app_info->pkg_name);
-               if (!pkg_info) {
-                       SETTING_TRACE("pkg_info is null, couldn't get the sizes");
-                       app_info->total_size = 0;
-               } else {
-                       char *buf = NULL;
-                       buf = pkgmgr_info_get_string(pkg_info, STR_INSTALLED_SIZE);
-                       if (buf) {
-                               //SETTING_TRACE("size : %s", buf);
-                               app_info->total_size = atoi(buf);
-                               G_FREE(buf);
-                       } else {
-                               app_info->total_size = 0;
-                       }
-                       pkgmgr_info_free(pkg_info);
-               }
-
-               ad->apps_status.dTotal += app_info->total_size;
-       }
-
-       char apps_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
-       int ret = __setting_storage_status_size_transition(ad->apps_status.dTotal, apps_desc);
-       setting_retm_if(ret == SETTING_RETURN_FAIL, "failed to transform");
-
-       G_FREE(ad->apps->sub_desc);
-       ad->apps->sub_desc = (char *)g_strdup(apps_desc);
-       elm_object_item_data_set(ad->apps->item, ad->apps);
-       elm_genlist_item_update(ad->apps->item);
-
-       elm_object_item_data_set(ad->internal->item, ad->internal);
-       elm_genlist_item_update(ad->internal->item);
-
-       if (ad->pop_progress) {
-               evas_object_del(ad->pop_progress);
-               ad->pop_progress = NULL;
-       }
-}
-
-static Eina_Bool __setting_storage_main_timer_cb(void *data)
-{
-       SETTING_TRACE_BEGIN;
-       setting_retvm_if(data == NULL, ECORE_CALLBACK_CANCEL, "data is NULL");
-       SettingStorageUG *ad = (SettingStorageUG *)data;
-
-       __setting_storage_main_applications_status_get(ad);
-       return ECORE_CALLBACK_CANCEL;
+       return size;
 }
 
 static void __setting_storage_main_launch_ug_destroy_cb(ui_gadget_h ug, void *priv)
@@ -736,20 +583,6 @@ static void __setting_storage_main_launch_ug_destroy_cb(ui_gadget_h ug, void *pr
        if (back_btn != NULL) {
                elm_object_style_set(back_btn, NAVI_BACK_BUTTON_STYLE); /* take into effect */
        }
-
-       if (ad->pop_progress) {
-               evas_object_del(ad->pop_progress);
-               ad->pop_progress = NULL;
-       }
-       ad->pop_progress = setting_create_popup_with_progressbar(ad, ad->win_get,
-                                "pending_list",
-                                NULL, NULL, NULL, 0, TRUE, TRUE);
-
-       if(ad->timer) {
-               ecore_timer_del(ad->timer);
-               ad->timer = NULL;
-       }
-       ad->timer = ecore_timer_add(2, (Ecore_Task_Cb)__setting_storage_main_timer_cb, ad);
 }
 
 static void __setting_storage_main_launch_ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
@@ -1355,13 +1188,13 @@ static void __setting_storage_vconf_change_cb(keynode_t *key, void *data)
 
 static void __setting_storage_main_genlist_update(Setting_GenGroupItem_Data *data, Setting_Storage_Status status)
 {
-       SETTING_TRACE_BEGIN;
+       //SETTING_TRACE_BEGIN;
        setting_retm_if(data == NULL, "Data parameter is NULL");
        Setting_GenGroupItem_Data *item_data = (Setting_GenGroupItem_Data *) data;
 
        char desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
        int ret = __setting_storage_status_size_transition(status.dTotal, desc);
-       setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
+       setting_retm_if(ret == SETTING_RETURN_FAIL, "failed to transform")
 
        G_FREE(item_data->sub_desc);
        item_data->sub_desc = (char *)g_strdup(desc);
@@ -1369,6 +1202,328 @@ static void __setting_storage_main_genlist_update(Setting_GenGroupItem_Data *dat
        elm_genlist_item_update(item_data->item);
 }
 
+static ail_cb_ret_e __setting_storage_main_appinfo_func_cb(const ail_appinfo_h ail_info, void *data)
+{
+       Eina_List **apps_list = (Eina_List **) data;
+
+       char *pkg_name = NULL;
+       char *pkg_type = NULL;
+
+       ail_appinfo_get_str(ail_info, AIL_PROP_PACKAGE_STR, &pkg_name);
+       setting_retvm_if(pkg_name == NULL, AIL_CB_RET_CONTINUE, "get pkg_name failed");
+
+       ail_appinfo_get_str(ail_info, AIL_PROP_X_SLP_PACKAGETYPE_STR, &pkg_type);
+       setting_retvm_if(pkg_type == NULL, AIL_CB_RET_CONTINUE, "get pkg_type failed");
+
+       App_Info *app_info = (App_Info*)calloc(1, sizeof(App_Info));
+       setting_retvm_if(app_info == NULL, AIL_CB_RET_CONTINUE, "failed to calloc");
+
+       app_info->pkg_name = (char *)g_strdup(pkg_name);
+       app_info->pkg_type = (char *)g_strdup(pkg_type);
+       *apps_list = eina_list_append(*apps_list, app_info);
+       return AIL_CB_RET_CONTINUE;
+}
+
+static void __setting_storage_main_applications_list_get(Eina_List **apps_list)
+{
+       SETTING_TRACE_BEGIN;
+       /* get app_info from AIL */
+       ail_filter_h filter_rpm = NULL;
+       ail_filter_h filter_wrt = NULL;
+       ail_filter_h filter_tpk = NULL;
+
+       ail_filter_new(&filter_rpm);
+       ail_filter_new(&filter_wrt);
+       ail_filter_new(&filter_tpk);
+
+       ail_filter_add_str(filter_rpm, AIL_PROP_X_SLP_PACKAGETYPE_STR, RPM_PREFIX);
+       ail_filter_add_str(filter_wrt, AIL_PROP_X_SLP_PACKAGETYPE_STR, WRT_PREFIX);
+       ail_filter_add_str(filter_tpk, AIL_PROP_X_SLP_PACKAGETYPE_STR, TPK_PREFIX);
+
+       ail_filter_list_appinfo_foreach(filter_rpm, __setting_storage_main_appinfo_func_cb, (void*)apps_list);
+       ail_filter_list_appinfo_foreach(filter_wrt, __setting_storage_main_appinfo_func_cb, (void*)apps_list);
+       ail_filter_list_appinfo_foreach(filter_tpk, __setting_storage_main_appinfo_func_cb, (void*)apps_list);
+
+       ail_filter_destroy(filter_rpm);
+       ail_filter_destroy(filter_wrt);
+       ail_filter_destroy(filter_tpk);
+}
+
+static double __setting_storage_main_applications_status_get(void *data)
+{
+       SETTING_TRACE_BEGIN;
+       setting_retvm_if(data == NULL, 0.0, "Data parameter is NULL");
+       SettingStorageUG *ad = (SettingStorageUG *)data;
+
+       Eina_List *apps_list = NULL;
+       __setting_storage_main_applications_list_get(&apps_list);
+
+       SETTING_TRACE("count = %d", eina_list_count(apps_list));
+
+       double total_size = 0.0;
+
+       Eina_List *l = NULL;
+       App_Info *app_info = NULL;
+       EINA_LIST_FOREACH (apps_list, l, app_info)
+       {
+               int exit_flag = 0;
+               pthread_mutex_lock(&ad->exit_mutex);
+               exit_flag = ad->exit_flag;
+               pthread_mutex_unlock(&ad->exit_mutex);
+
+               if (exit_flag == 1) {
+                       SETTING_TRACE("exit_flag is 1");
+                       break;
+               }
+
+               //SETTING_TRACE("pkg_name: %s ", app_info->pkg_name);
+               //SETTING_TRACE("pkg_type: %s", app_info->pkg_type);
+               pkgmgr_info *pkg_info = pkgmgr_info_new(app_info->pkg_type, app_info->pkg_name);
+               if (!pkg_info) {
+                       SETTING_TRACE("pkg_info is null, couldn't get the sizes");
+                       app_info->total_size = 0;
+               } else {
+                       char *buf = NULL;
+                       buf = pkgmgr_info_get_string(pkg_info, STR_INSTALLED_SIZE);
+                       if (buf) {
+                               //SETTING_TRACE("size : %s", buf);
+                               app_info->total_size = atoi(buf);
+                               G_FREE(buf);
+                       } else {
+                               app_info->total_size = 0;
+                       }
+                       pkgmgr_info_free(pkg_info);
+               }
+
+               total_size += app_info->total_size;
+       }
+
+       /* free the list */
+       Eina_List *tmp = NULL;
+       app_info = NULL;
+       EINA_LIST_FOREACH(apps_list, tmp, app_info)
+       {
+               G_FREE(app_info->pkg_name);
+               G_FREE(app_info->pkg_type);
+               FREE(app_info);
+       }
+       eina_list_free(apps_list);
+       apps_list = NULL;
+
+       return total_size;
+}
+
+void __setting_storage_main_pipe_cb(void *data, void *buffer, unsigned int nbyte)
+{
+       SETTING_TRACE_BEGIN;
+       setting_retm_if(data == NULL, "Data parameter is NULL");
+       setting_retm_if(buffer == NULL, "buffer parameter is NULL");
+       SettingStorageUG *ad = (SettingStorageUG *)data;
+
+       Update_Info *update_info = (Update_Info *) buffer;
+
+       SETTING_TRACE("update_info : %d", update_info->type);
+
+       switch (update_info->type) {
+       case SETTING_STORAGE_APPLICATIONS:
+               {
+                       ad->apps_status.dTotal = update_info->total_size;
+                       __setting_storage_main_genlist_update(ad->apps, ad->apps_status);
+               }
+               break;
+       case SETTING_STORAGE_PICTURES_VIDEO:
+               {
+                       ad->pics_videos_status.dTotal = update_info->total_size;
+                       __setting_storage_main_genlist_update(ad->pics_videos, ad->pics_videos_status);
+               }
+               break;
+       case SETTING_STORAGE_DOWNLOADS:
+               {
+                       ad->downloads_status.dTotal = update_info->total_size;
+                       __setting_storage_main_genlist_update(ad->downloads, ad->downloads_status);
+               }
+               break;
+       case SETTING_STORAGE_AUDIO:
+               {
+                       ad->audio_status.dTotal = update_info->total_size;
+                       __setting_storage_main_genlist_update(ad->audio, ad->audio_status);
+               }
+               break;
+       case SETTING_STORAGE_MISCELLANEOUS:
+               {
+                       ad->others_status.dTotal = update_info->total_size;
+                       __setting_storage_main_genlist_update(ad->others, ad->others_status);
+               }
+               break;
+       default:
+               /* do nothing*/
+               SETTING_TRACE_ERROR("wrong update type");
+               break;
+       }
+
+       __setting_storage_main_genlist_update(ad->internal, ad->internal_status);
+
+       SETTING_TRACE_END;
+}
+
+static void *__setting_storage_main_thread_start_routine(void *data)
+{
+       SETTING_TRACE("==== sub thread id = %d =====", (int)pthread_self());
+       SETTING_TRACE_BEGIN;
+       setting_retvm_if(data == NULL, NULL, "Data parameter is NULL");
+       SettingStorageUG *ad = (SettingStorageUG *)data;
+
+       Ecore_Pipe *pipe = ad->pipe;
+       update_type type = SETTING_STORAGE_PICTURES_VIDEO;
+       while (1) {
+               pthread_mutex_lock(&ad->update_mutex);
+               while (ad->type == SETTING_STORAGE_SLEEP) {
+                       /* wait to be waked up*/
+                       pthread_cond_wait(&ad->wait_cond, &ad->update_mutex);
+               }
+               type = ad->type;
+               pthread_mutex_unlock(&ad->update_mutex);
+
+               SETTING_TRACE("thread start to work, update type = %d", type);
+
+               int exit_flag = 0;
+
+               pthread_mutex_lock(&ad->exit_mutex);
+               exit_flag = ad->exit_flag;
+               pthread_mutex_unlock(&ad->exit_mutex);
+
+               if (exit_flag == 1) {
+                       SETTING_TRACE("exit_flag is 1");
+                       break;
+               }
+
+               if (type >= SETTING_STORAGE_MAX) {
+                       SETTING_TRACE("work is done, thread will sleep");
+                       pthread_mutex_lock(&ad->update_mutex);
+                       ad->type = SETTING_STORAGE_SLEEP;
+                       pthread_mutex_unlock(&ad->update_mutex);
+                       continue;
+               }
+
+               switch (type) {
+               case SETTING_STORAGE_PICTURES_VIDEO:
+               {
+                       /* get pictures and videos info */
+                       double pics_videos_size = __setting_storage_main_pictures_videos_status_get();
+                       SETTING_TRACE("pics_videos_size = %f", pics_videos_size);
+
+                       Update_Info pics_videos_info;
+                       memset(&pics_videos_info, 0, sizeof(Update_Info));
+                       pics_videos_info.type = SETTING_STORAGE_PICTURES_VIDEO;
+                       pics_videos_info.total_size = pics_videos_size;
+
+                       ecore_pipe_write(pipe, &pics_videos_info, sizeof(pics_videos_info));
+               }
+               break;
+               case SETTING_STORAGE_DOWNLOADS:
+               {
+                       /* get downloads info */
+                       double downloads_size = __setting_storage_main_downloads_status_get();
+                       SETTING_TRACE("downloads_size = %f", downloads_size);
+
+                       Update_Info downloads_info;
+                       memset(&downloads_info, 0, sizeof(Update_Info));
+                       downloads_info.type = SETTING_STORAGE_DOWNLOADS;
+                       downloads_info.total_size = downloads_size;
+
+                       ecore_pipe_write(pipe, &downloads_info, sizeof(downloads_info));
+               }
+               break;
+               case SETTING_STORAGE_AUDIO:
+               {
+                       /* get audio info */
+                       double audio_size = __setting_storage_main_audio_status_get();
+                       SETTING_TRACE("audio_size = %f", audio_size);
+
+                       Update_Info audio_info;
+                       memset(&audio_info, 0, sizeof(Update_Info));
+                       audio_info.type = SETTING_STORAGE_AUDIO;
+                       audio_info.total_size = audio_size;
+
+                       ecore_pipe_write(pipe, &audio_info, sizeof(audio_info));
+               }
+               break;
+               case SETTING_STORAGE_MISCELLANEOUS:
+               {
+                       /* get miscellaneous files info */
+                       double misc_size = __setting_storage_main_miscellaneous_size_get();
+                       SETTING_TRACE("misc_size = %f", misc_size);
+
+                       Update_Info misc_info;
+                       memset(&misc_info, 0, sizeof(Update_Info));
+                       misc_info.type = SETTING_STORAGE_MISCELLANEOUS;
+                       misc_info.total_size = misc_size;
+
+                       ecore_pipe_write(pipe, &misc_info, sizeof(misc_info));
+               }
+               break;
+               case SETTING_STORAGE_APPLICATIONS:
+               {
+                       /* get apps info */
+                       double apps_size = __setting_storage_main_applications_status_get(ad);
+                       SETTING_TRACE("apps_size = %f", apps_size);
+
+                       Update_Info apps_info;
+                       memset(&apps_info, 0, sizeof(Update_Info));
+                       apps_info.type = SETTING_STORAGE_APPLICATIONS;
+                       apps_info.total_size = apps_size;
+
+                       ecore_pipe_write(pipe, &apps_info, sizeof(apps_info));
+               }
+               break;
+               default:
+               {
+                       SETTING_TRACE("type = %d", type);
+                       break;
+               }
+               }
+
+               pthread_mutex_lock(&ad->update_mutex);
+               ad->type++;
+               SETTING_TRACE("ad->type = %d", ad->type);
+               pthread_mutex_unlock(&ad->update_mutex);
+       }
+       SETTING_TRACE_END;
+       pthread_exit((void *) 0);
+}
+
+static void __setting_storage_main_init(void *data)
+{
+       SETTING_TRACE_BEGIN;
+       setting_retm_if(data == NULL, "Data parameter is NULL");
+       SettingStorageUG *ad = (SettingStorageUG *)data;
+
+       pthread_mutex_init(&ad->exit_mutex, NULL);
+       pthread_mutex_init(&ad->update_mutex, NULL);
+       pthread_cond_init(&ad->wait_cond, NULL);
+
+       ad->exit_flag = EINA_FALSE;
+       ad->type = SETTING_STORAGE_PICTURES_VIDEO;
+
+       ad->internal_status.dAvail = 0.0;
+       ad->internal_status.dTotal= 0.0;
+
+       ad->apps_status.dAvail = 0.0;
+       ad->apps_status.dTotal= 0.0;
+
+       ad->pics_videos_status.dAvail = 0.0;
+       ad->pics_videos_status.dTotal= 0.0;
+
+       ad->downloads_status.dAvail = 0.0;
+       ad->downloads_status.dTotal= 0.0;
+
+       ad->audio_status.dAvail = 0.0;
+       ad->audio_status.dTotal= 0.0;
+
+       ad->others_status.dAvail = 0.0;
+       ad->others_status.dTotal= 0.0;
+}
+
 /* ***************************************************
  *
  *basic func
@@ -1382,15 +1537,9 @@ static int setting_storage_main_create(void *cb)
 
        SettingStorageUG *ad = (SettingStorageUG *) cb;
 
-       int ret = SETTING_RETURN_SUCCESS;
+       __setting_storage_main_init(ad);
 
-       ret = media_content_connect();
-       if(ret == MEDIA_CONTENT_ERROR_NONE) {
-               SETTING_TRACE("media_content_connect is success");
-       } else {
-               SETTING_TRACE_ERROR("media_content_connect is failed");
-               return SETTING_RETURN_FAIL;
-       }
+       int ret = SETTING_RETURN_SUCCESS;
 
        retvm_if(ad->win_main_layout == NULL, SETTING_DRAW_ERR_FAIL_LOAD_EDJ,
                 "win_main_layout is NULL");
@@ -1413,14 +1562,6 @@ static int setting_storage_main_create(void *cb)
 
        __setting_storage_main_internal_storage_status_get(ad);
 
-       __setting_storage_main_pictures_videos_status_get(ad);
-
-       __setting_storage_main_downloads_status_get(ad);
-
-       __setting_storage_main_audio_status_get(ad);
-
-       __setting_storage_main_miscellaneous_size_get(ad);
-
        Elm_Object_Item *item = NULL;
 
        bool is_emulator = isEmulBin();
@@ -1463,16 +1604,11 @@ static int setting_storage_main_create(void *cb)
        }
 
        /* Applications */
-       ad->apps_status.dTotal = 0; /* initial value */
-       char apps_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
-       ret = __setting_storage_status_size_transition(ad->apps_status.dTotal, apps_desc);
-       setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
-
        ad->apps = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3),
                                             __setting_storage_main_Gendial_mouse_up_cb,
                                             ad, SWALLOW_Type_INVALID, SETTING_STORAGE_APPS_ICON_PATH,
                                             NULL, 0, "IDS_ST_BODY_APPLICATIONS",
-                                            apps_desc, NULL);
+                                            _("IDS_ST_HEADER_PLEASE_WAIT"), NULL);
        if (ad->apps) {
                ad->apps->userdata = ad;
                if (is_emulator) {
@@ -1484,14 +1620,11 @@ static int setting_storage_main_create(void *cb)
        }
 
        /* Pictures, Videos */
-       char pics_videos_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
-       ret = __setting_storage_status_size_transition(ad->pics_videos_status.dTotal, pics_videos_desc);
-       setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
        ad->pics_videos = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3),
                                             __setting_storage_main_Gendial_mouse_up_cb,
                                             ad, SWALLOW_Type_INVALID, SETTING_STORAGE_PICS_ICON_PATH,
                                             NULL, 0, SETTING_STORAGE_PICS_STR,
-                                            pics_videos_desc, NULL);
+                                            _("IDS_ST_HEADER_PLEASE_WAIT"), NULL);
        if (ad->pics_videos) {
                ad->pics_videos->userdata = ad;
                if (is_emulator) {
@@ -1503,15 +1636,11 @@ static int setting_storage_main_create(void *cb)
        }
 
        /* Downloads */
-       char downloads_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
-       ret = __setting_storage_status_size_transition(ad->downloads_status.dTotal, downloads_desc);
-       setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
        ad->downloads = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3),
                                             __setting_storage_main_Gendial_mouse_up_cb,
                                             ad, SWALLOW_Type_INVALID, SETTING_STORAGE_DOWNS_ICON_PATH,
                                             NULL, 0, SETTING_STORAGE_DOWNS_STR,
-                                            downloads_desc,
-                                            NULL);
+                                            _("IDS_ST_HEADER_PLEASE_WAIT"), NULL);
        if (ad->downloads) {
                ad->downloads->userdata = ad;
                if (is_emulator) {
@@ -1523,15 +1652,11 @@ static int setting_storage_main_create(void *cb)
        }
 
        /* Audio */
-       char audio_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
-       ret = __setting_storage_status_size_transition(ad->audio_status.dTotal, audio_desc);
-       setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
        ad->audio = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3),
                                             __setting_storage_main_Gendial_mouse_up_cb,
                                             ad, SWALLOW_Type_INVALID, SETTING_STORAGE_AUDIO_ICON_PATH,
                                             NULL, 0, SETTING_STORAGE_AUDIO_STR,
-                                            audio_desc,
-                                            NULL);
+                                            _("IDS_ST_HEADER_PLEASE_WAIT"), NULL);
        if (ad->audio) {
                ad->audio->userdata = ad;
 
@@ -1544,15 +1669,11 @@ static int setting_storage_main_create(void *cb)
        }
 
        /* Miscellaneous files */
-       char others_desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
-       ret = __setting_storage_status_size_transition(ad->others_status.dTotal, others_desc);
-       setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
-
        ad->others = setting_create_Gendial_field_def(ad->genlist, &(ad->itc_2text_1icon_3),
                                             __setting_storage_main_Gendial_mouse_up_cb,
                                             ad, SWALLOW_Type_INVALID, SETTING_STORAGE_MISCES_ICON_PATH,
                                             NULL, 0, SETTING_STORAGE_MISCES_STR,
-                                            others_desc, NULL);
+                                            _("IDS_ST_HEADER_PLEASE_WAIT"), NULL);
        if (ad->others) {
                ad->others->userdata = ad;
        } else {
@@ -1594,7 +1715,7 @@ static int setting_storage_main_create(void *cb)
 
                /* SD card info */
                setting_create_Gendial_field_titleItem(ad->genlist, &(ad->itc_group_item),
-                                              "IDS_ST_BODY_SD_CARD", NULL);            
+                                              "IDS_ST_BODY_SD_CARD", NULL);
                __setting_storage_main_sd_card_info_append(ad);
 
                ret = vconf_notify_key_changed(VCONFKEY_SYSMAN_MMC_STATUS,
@@ -1608,13 +1729,19 @@ static int setting_storage_main_create(void *cb)
                elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
        }
 
-       if(ad->timer) {
-               ecore_timer_del(ad->timer);
-               ad->timer = NULL;
+       setting_view_storage_main.is_create = 1;
+
+       if (ad->pipe) {
+               ecore_pipe_del(ad->pipe);
+               ad->pipe = NULL;
+       }
+       ad->pipe = ecore_pipe_add(__setting_storage_main_pipe_cb, ad);
+       ret = pthread_create(&ad->tid, NULL, __setting_storage_main_thread_start_routine, ad);
+       if (ret != 0) {
+               SETTING_TRACE_ERROR("fail to create thread");
        }
-       ad->timer = ecore_timer_add(2, (Ecore_Task_Cb)__setting_storage_main_timer_cb, ad);
+       SETTING_TRACE("thread id = %d", ad->tid);
 
-       setting_view_storage_main.is_create = 1;
        return SETTING_RETURN_SUCCESS;
 }
 
@@ -1625,24 +1752,33 @@ static int setting_storage_main_destroy(void *cb)
 
        SettingStorageUG *ad = (SettingStorageUG *) cb;
 
-       int ret = media_content_disconnect();
-       if (ret == MEDIA_CONTENT_ERROR_NONE) {
-               SETTING_TRACE("media_content_disconnect is success");
-       } else {
-               SETTING_TRACE_ERROR("media_content_disconnect is failed");
-       }
+       int ret = 0;
 
-       if (ad->pop_progress) {
-               evas_object_del(ad->pop_progress);
-               ad->pop_progress = NULL;
-       }
+       pthread_mutex_lock(&ad->exit_mutex);
+       ad->exit_flag = 1;
+       pthread_mutex_unlock(&ad->exit_mutex);
+
+       /* wake up thread */
+       pthread_mutex_lock(&ad->update_mutex);
+       ad->type = SETTING_STORAGE_REUPDATE;
+       pthread_cond_signal(&ad->wait_cond);
+       pthread_mutex_unlock(&ad->update_mutex);
 
-       if(ad->timer) {
-               ecore_timer_del(ad->timer);
-               ad->timer = NULL;
+       void *thread_ret = NULL;
+       ret = pthread_join(ad->tid, &thread_ret);
+       if(ret != 0) {
+               SETTING_TRACE_ERROR("fail to join with thread");
        }
+       SETTING_TRACE("thread exit code %d", (int)thread_ret);
 
-       __setting_storage_main_apps_list_free(ad);
+       pthread_mutex_destroy(&ad->exit_mutex);
+       pthread_mutex_destroy(&ad->update_mutex);
+       pthread_cond_destroy(&ad->wait_cond);
+
+       if (ad->pipe) {
+               ecore_pipe_del(ad->pipe);
+               ad->pipe = NULL;
+       }
 
        if (!isEmulBin()) {
                ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_MMC_STATUS,
@@ -1673,35 +1809,11 @@ static int setting_storage_main_update(void *cb)
 
        SettingStorageUG *ad = (SettingStorageUG *) cb;
 
-       /* update internal */
-       __setting_storage_main_internal_storage_status_get(ad);
-       __setting_storage_main_genlist_update(ad->internal, ad->internal_status);
-
-       /* update pictures videos */
-       __setting_storage_main_pictures_videos_status_get(ad);
-       __setting_storage_main_genlist_update(ad->pics_videos, ad->pics_videos_status);
-
-       /* update download */
-       __setting_storage_main_downloads_status_get(ad);
-       __setting_storage_main_genlist_update(ad->downloads, ad->downloads_status);
-
-       /* update audio */
-       __setting_storage_main_audio_status_get(ad);
-       __setting_storage_main_genlist_update(ad->audio, ad->audio_status);
-
-       /* update miscellaneous */
-       __setting_storage_main_miscellaneous_size_get(ad);
-       __setting_storage_main_genlist_update(ad->others, ad->others_status);
-
-       /* update available */
-       char desc[SETTING_STORAGE_MAX_STR_LEN + 1] = {0,};
-       int ret = __setting_storage_status_size_transition(ad->internal_status.dAvail, desc);
-       setting_retvm_if(ret == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "failed to transform")
-
-       G_FREE(ad->avail->sub_desc);
-       ad->avail->sub_desc = (char *)g_strdup(desc);
-       elm_object_item_data_set(ad->avail->item, ad->avail);
-       elm_genlist_item_update(ad->avail->item);
+       /* wake up thread */
+       pthread_mutex_lock(&ad->update_mutex);
+       ad->type = SETTING_STORAGE_REUPDATE;
+       pthread_cond_signal(&ad->wait_cond);
+       pthread_mutex_unlock(&ad->update_mutex);
 
        if (ad->ly_main != NULL) {
                evas_object_show(ad->ly_main);
index c67931c..5611e9f 100755 (executable)
@@ -25,7 +25,7 @@
 
 int setting_storage_file_list_get(char *path, Eina_List **dir_list, Eina_List **file_list)
 {
-       SETTING_TRACE_BEGIN;
+       //SETTING_TRACE_BEGIN;
        setting_retvm_if(NULL == path, SETTING_RETURN_FAIL, "path is NULL");
 
        DIR *pDir = NULL;
@@ -118,6 +118,14 @@ static void *setting_storage_ug_on_create(ui_gadget_h ug, enum ug_mode mode,
 {
        setting_retvm_if((!ug || !priv), NULL, "!ug || !priv");
 
+       int ret = media_content_connect();
+       if(ret == MEDIA_CONTENT_ERROR_NONE) {
+               SETTING_TRACE("media_content_connect is success");
+       } else {
+               SETTING_TRACE_ERROR("media_content_connect is failed");
+               return NULL;
+       }
+
        SettingStorageUG *storageUG = priv;
        storageUG->ug = ug;
        storageUG->win_main_layout = (Evas_Object *) ug_get_parent_layout(ug);
@@ -186,6 +194,13 @@ static void setting_storage_ug_on_destroy(ui_gadget_h ug, service_h service,
        setting_retm_if((!ug || !priv), "!ug || !priv");
        SettingStorageUG *storageUG = priv;
 
+       int ret = media_content_disconnect();
+       if (ret == MEDIA_CONTENT_ERROR_NONE) {
+               SETTING_TRACE("media_content_disconnect is success");
+       } else {
+               SETTING_TRACE_ERROR("media_content_disconnect is failed");
+       }
+
        evas_object_event_callback_del(storageUG->win_main_layout, EVAS_CALLBACK_RESIZE, setting_storage_ug_cb_resize); /* fix flash issue for gallery */
        storageUG->ug = ug;