rimmed pushed a commit to branch master.

http://git.enlightenment.org/tools/eflete.git/commit/?id=11fe7bc68d87f3bc1a482d6e4cc33f82b6d295fc

commit 11fe7bc68d87f3bc1a482d6e4cc33f82b6d295fc
Author: Vyacheslav Reutskiy <[email protected]>
Date:   Tue Jul 12 08:44:39 2016 +0300

    project_manager: switch context in import edj process
    
    So EFL is not thread safity :(, sadly but fact. We need to switch
    context to main loop olways when start work with evas_object. Its was
    added in tin this patch, in places where are it needed.
    
    Change-Id: I01f4ce3a04ede52913067bcb27de4f3d91d31280
---
 src/bin/project_manager/project_manager.c | 166 +++++++++++++++++-------------
 1 file changed, 97 insertions(+), 69 deletions(-)

diff --git a/src/bin/project_manager/project_manager.c 
b/src/bin/project_manager/project_manager.c
index ebb4e41..1dc91ce 100644
--- a/src/bin/project_manager/project_manager.c
+++ b/src/bin/project_manager/project_manager.c
@@ -34,6 +34,9 @@
 #define PROJECT_KEY_LICENSE      "edje/license"
 #define PROJECT_KEY_COMMENT      "edje/comment"
 
+#define THREAD_CONTEXT_SWITCH_BEGIN    ecore_thread_main_loop_begin()
+#define THREAD_CONTEXT_SWITCH_END      ecore_thread_main_loop_end()
+
 static Eet_Compression compess_level = EET_COMPRESSION_HI;
 
 typedef struct
@@ -412,7 +415,7 @@ _project_special_group_add(Project *project)
 
    assert(project != NULL);
 
-   ecore_thread_main_loop_begin();
+   THREAD_CONTEXT_SWITCH_BEGIN;
 
    Ecore_Evas *ee = ecore_evas_buffer_new(0, 0);
    e = ecore_evas_get(ee);
@@ -426,7 +429,7 @@ _project_special_group_add(Project *project)
    evas_object_del(edje_edit_obj);
    ecore_evas_free(project->ecore_evas);
 
-   ecore_thread_main_loop_end();
+   THREAD_CONTEXT_SWITCH_END;
 }
 
 static void
@@ -438,7 +441,7 @@ _project_dummy_image_add(Project *project)
 
    assert(project != NULL);
 
-   ecore_thread_main_loop_begin();
+   THREAD_CONTEXT_SWITCH_BEGIN;
 
    Ecore_Evas *ee = ecore_evas_buffer_new(0, 0);
    e = ecore_evas_get(ee);
@@ -451,7 +454,7 @@ _project_dummy_image_add(Project *project)
    evas_object_del(edje_edit_obj);
    ecore_evas_free(project->ecore_evas);
 
-   ecore_thread_main_loop_end();
+   THREAD_CONTEXT_SWITCH_END;
 }
 
 static void *
@@ -530,9 +533,9 @@ _project_import_edj(void *data,
              /* reload file after group add */
              pm_dev_file_reload(worker.project);
              /* add group to project structures */
-             ecore_thread_main_loop_begin();
+             THREAD_CONTEXT_SWITCH_BEGIN;
              gm_group_add(worker.project, arr[2], false);
-             ecore_thread_main_loop_end();
+             THREAD_CONTEXT_SWITCH_END;
 
              free(arr[0]);
              free(arr);
@@ -852,7 +855,7 @@ static void *
 _project_save(void *data __UNUSED__,
               Eina_Thread *thread __UNUSED__)
 {
-   ecore_thread_main_loop_begin();
+   THREAD_CONTEXT_SWITCH_BEGIN;
    PROGRESS_SEND(_("Save project '%s'"), worker.project->name);
    CRIT_ON_FAIL(editor_save_all(worker.project->global_object));
 
@@ -860,7 +863,7 @@ _project_save(void *data __UNUSED__,
 
    PROGRESS_SEND("Save done");
 
-   ecore_thread_main_loop_end();
+   THREAD_CONTEXT_SWITCH_END;
 
    END_SEND(PM_PROJECT_SUCCESS);
    return NULL;
@@ -1115,23 +1118,23 @@ _image_resources_load(Project *project)
              file_dir = ecore_file_dir_get(res->source);
              ecore_file_mkpath(file_dir);
              free(file_dir);
-             ecore_thread_main_loop_begin();
+             THREAD_CONTEXT_SWITCH_BEGIN;
              im = evas_object_image_add(e);
              id = edje_edit_image_id_get(project->global_object, image_name);
              if (id < 0)
                {
                   WARN("Image %s coudn't be exported", image_name);
-                  ecore_thread_main_loop_end();
+                  THREAD_CONTEXT_SWITCH_END;
                   continue;
                }
              source_file = eina_stringshare_printf("edje/images/%i", id);
              evas_object_image_file_set(im, project->dev, source_file);
-             ecore_thread_main_loop_end();
+             THREAD_CONTEXT_SWITCH_END;
              evas_object_image_save(im, res->source, NULL, NULL);
-             ecore_thread_main_loop_begin();
+             THREAD_CONTEXT_SWITCH_BEGIN;
              evas_object_del(im);
              eina_stringshare_del(source_file);
-             ecore_thread_main_loop_end();
+             THREAD_CONTEXT_SWITCH_END;
           }
      }
 
@@ -1454,9 +1457,9 @@ _group_source_code_export(void *data, Eina_Thread *thread 
__UNUSED__)
      }
 
    /* get the full source code of given project */
-   ecore_thread_main_loop_begin();
+   THREAD_CONTEXT_SWITCH_BEGIN;
    code = edje_edit_source_generate(group->edit_object);
-   ecore_thread_main_loop_end();
+   THREAD_CONTEXT_SWITCH_END;
 
    fputs(code, f);
    edje_edit_string_free(code);
@@ -1567,9 +1570,9 @@ _project_src_export(const char *path)
    eina_strbuf_reset(buf);
 
    /* get the full source code of given project */
-   ecore_thread_main_loop_begin();
+   THREAD_CONTEXT_SWITCH_BEGIN;
    code = edje_edit_full_source_generate(worker.project->global_object);
-   ecore_thread_main_loop_end();
+   THREAD_CONTEXT_SWITCH_END;
 
    fputs(code, f);
    free(code);
@@ -2007,10 +2010,11 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
    assert(edj != NULL);
    assert(group != NULL);
 
-   ecore_thread_main_loop_begin();
    e = ecore_evas_get(project->ecore_evas);
+   THREAD_CONTEXT_SWITCH_BEGIN;
    obj = edje_edit_object_add(e);
    edje_object_file_set(obj, edj, group);
+   THREAD_CONTEXT_SWITCH_END;
 
    /* import group dependencies */
    resources = gm_group_used_groups_edj_get(obj);
@@ -2035,20 +2039,19 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
                  ((res->name == data) || (!strcmp(res->name, data))))
                {
                   TODO("implement resource replacing while importing, see 
comment bellow")
-                  /* when efl merge window will be opened need to add logic for
-                   * replace any resource. Now we can do it only for images, 
because
-                   * edje_edit has a API for replace one image to enother, but 
for
-                   * sounds, fonts, color_classes and styles API is missing. So
-                   * be better if replacing functional been implemented for all
-                   * resource type at the same time */
-                  continue;
+                     /* when efl merge window will be opened need to add logic 
for
+                      * replace any resource. Now we can do it only for 
images, because
+                      * edje_edit has a API for replace one image to enother, 
but for
+                      * sounds, fonts, color_classes and styles API is 
missing. So
+                      * be better if replacing functional been implemented for 
all
+                      * resource type at the same time */
+                     continue;
                }
           }
         else
           {
              res_dir = string_cat(project->develop_path, "images");
           }
-        img = evas_object_image_add(e);
         id = edje_edit_image_id_get(obj, data);
         if (id < 0)
           {
@@ -2056,11 +2059,14 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
              continue;
           }
         /* save image, it's need for insert to project dev file */
+        res_file = eina_stringshare_printf("%s/%s", res_dir, data);
         source = eina_stringshare_printf("edje/images/%i", id);
+        THREAD_CONTEXT_SWITCH_BEGIN;
+        img = evas_object_image_add(e);
         evas_object_image_file_set(img, edj, source);
-        res_file = eina_stringshare_printf("%s/%s", res_dir, data);
         evas_object_image_save(img, res_file, NULL, NULL);
         evas_object_del(img);
+        THREAD_CONTEXT_SWITCH_END;
 
         CRIT_ON_FAIL(edje_edit_image_add(project->global_object, res_file));
         res = (External_Resource *)resource_add(data, RESOURCE_TYPE_IMAGE);
@@ -2088,14 +2094,16 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
                  ((res->name == data) || (!strcmp(res->name, data))))
                {
                   TODO("implement resource replacing")
-                  continue;
+                     continue;
                }
           }
         else
           {
              res_dir = string_cat(project->develop_path, "sounds");
           }
+        THREAD_CONTEXT_SWITCH_BEGIN;
         sound_bin = edje_edit_sound_samplebuffer_get(obj, data);
+        THREAD_CONTEXT_SWITCH_END;
         res_file = eina_stringshare_printf("%s/%s", res_dir, data);
         if (!(f = fopen(res_file, "wb")))
           {
@@ -2108,7 +2116,9 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
         if (f) fclose(f);
         eina_binbuf_free(sound_bin);
 
+        THREAD_CONTEXT_SWITCH_BEGIN;
         CRIT_ON_FAIL(edje_edit_sound_sample_add(project->global_object, data, 
res_file));
+        THREAD_CONTEXT_SWITCH_END;
         res = (External_Resource *)resource_add(data, RESOURCE_TYPE_SOUND);
         res->source = eina_stringshare_add(res_file);
         resource_insert(&project->sounds, (Resource *)res);
@@ -2120,51 +2130,58 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
 
    /* import fonts */
    resources = gm_group_used_fonts_edj_get(obj);
-   ef = eet_open(edj, EET_FILE_MODE_READ);
-   EINA_LIST_FOREACH(resources, l, data)
+   if (resources)
      {
-        if (project->fonts)
+        ef = eet_open(edj, EET_FILE_MODE_READ);
+        EINA_LIST_FOREACH(resources, l, data)
           {
-             res = eina_list_data_get(project->fonts);
-             res_dir = ecore_file_dir_get(res->source);
-             request.resource_type = RESOURCE_TYPE_FONT;
-             request.name = data;
-             res = (External_Resource *)resource_get(project->fonts, &request);
-             if ((res) &&
-                 ((res->name == data) || (!strcmp(res->name, data))))
+             if (project->fonts)
                {
-                  TODO("implement resource replacing")
+                  res = eina_list_data_get(project->fonts);
+                  res_dir = ecore_file_dir_get(res->source);
+                  request.resource_type = RESOURCE_TYPE_FONT;
+                  request.name = data;
+                  res = (External_Resource *)resource_get(project->fonts, 
&request);
+                  if ((res) &&
+                      ((res->name == data) || (!strcmp(res->name, data))))
+                    {
+                       TODO("implement resource replacing")
+                          continue;
+                    }
+               }
+             else
+               {
+                  res_dir = string_cat(project->develop_path, "fonts");
+               }
+             source = eina_stringshare_printf("edje/fonts/%s", data);
+             THREAD_CONTEXT_SWITCH_BEGIN;
+             font = eet_read(ef, source, &size);
+             THREAD_CONTEXT_SWITCH_END;
+             res_file = eina_stringshare_printf("%s/%s", res_dir, data);
+             if (!font) continue;
+             if (!(f = fopen(res_file, "wb")))
+               {
+                  ERR("Could not open file: %s", res_file);
                   continue;
                }
-          }
-        else
-          {
-             res_dir = string_cat(project->develop_path, "fonts");
-          }
-        source = eina_stringshare_printf("edje/fonts/%s", data);
-        font = eet_read(ef, source, &size);
-        res_file = eina_stringshare_printf("%s/%s", res_dir, data);
-        if (!font) continue;
-        if (!(f = fopen(res_file, "wb")))
-          {
-             ERR("Could not open file: %s", res_file);
-             continue;
-          }
-        if (fwrite(font, size, 1, f) != 1)
-          ERR("Could not write font: %s", strerror(errno));
-        if (f) fclose(f);
-        free(font);
-        eina_stringshare_del(source);
+             if (fwrite(font, size, 1, f) != 1)
+               ERR("Could not write font: %s", strerror(errno));
+             if (f) fclose(f);
+             free(font);
+             eina_stringshare_del(source);
 
-        edje_edit_font_add(project->global_object, res_file, data);
-        res = (External_Resource *)resource_add(data, RESOURCE_TYPE_FONT);
-        res->source = eina_stringshare_add(res_file);
-        resource_insert(&project->fonts, (Resource *)res);
+             THREAD_CONTEXT_SWITCH_BEGIN;
+             edje_edit_font_add(project->global_object, res_file, data);
+             THREAD_CONTEXT_SWITCH_END;
+             res = (External_Resource *)resource_add(data, RESOURCE_TYPE_FONT);
+             res->source = eina_stringshare_add(res_file);
+             resource_insert(&project->fonts, (Resource *)res);
 
-        eina_stringshare_del(res_file);
-        free(res_dir);
+             eina_stringshare_del(res_file);
+             free(res_dir);
+          }
+        eet_close(ef);
      }
-   eet_close(ef);
    /* fonts imported */
 
    /* import color_classes */
@@ -2178,8 +2195,9 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
             ((res->name == data) || (!strcmp(res->name, data))))
           {
              TODO("implement resource replacing")
-             continue;
+                continue;
           }
+        THREAD_CONTEXT_SWITCH_BEGIN;
         edje_edit_color_class_colors_get(obj, data,
                                          &c1_r, &c1_g, &c1_b, &c1_a,
                                          &c2_r, &c2_g, &c2_b, &c2_a,
@@ -2189,6 +2207,7 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
                                                       c1_r, c1_g, c1_b, c1_a,
                                                       c2_r, c2_g, c2_b, c2_a,
                                                       c3_r, c3_g, c3_b, c3_a));
+        THREAD_CONTEXT_SWITCH_END;
         res = (External_Resource *)resource_add(data, 
RESOURCE_TYPE_COLORCLASS);
         resource_insert(&project->colorclasses, (Resource *)res);
      }
@@ -2205,16 +2224,20 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
             ((res->name == data) || (!strcmp(res->name, data))))
           {
              TODO("implement resource replacing")
-             continue;
+                continue;
           }
         edje_edit_style_add(project->global_object, data);
+        THREAD_CONTEXT_SWITCH_BEGIN;
         resources1 = edje_edit_style_tags_list_get(obj, data);
+        THREAD_CONTEXT_SWITCH_END;
         EINA_LIST_FOREACH(resources1, l1, data1)
           {
+             THREAD_CONTEXT_SWITCH_END;
              source = edje_edit_style_tag_value_get(obj, data, data1);
              CRIT_ON_FAIL(edje_edit_style_tag_add(project->global_object, 
data, data1));
              
CRIT_ON_FAIL(edje_edit_style_tag_value_set(project->global_object, data, data1, 
source));
              eina_stringshare_del(source);
+             THREAD_CONTEXT_SWITCH_END;
           }
         res = (External_Resource *)resource_add(data, RESOURCE_TYPE_STYLE);
         resource_insert(&project->styles, (Resource *)res);
@@ -2225,10 +2248,12 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
 
    /* add fake change for min/max group attributes.
     * Try to set the default values */
+   THREAD_CONTEXT_SWITCH_BEGIN;
    CRIT_ON_FAIL(editor_group_max_h_set(obj, change, true, false, 0));
    CRIT_ON_FAIL(editor_group_max_w_set(obj, change, true, false, 0));
    CRIT_ON_FAIL(editor_group_min_h_set(obj, change, true, false, 0));
    CRIT_ON_FAIL(editor_group_min_w_set(obj, change, true, false, 0));
+   THREAD_CONTEXT_SWITCH_END;
 
    you_shall_not_pass_editor_signals(NULL);
    /* fake changes for imported group
@@ -2238,6 +2263,7 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
    editor_group_reset(obj, change, false);
 
    /* apply group to project */
+   THREAD_CONTEXT_SWITCH_BEGIN;
    CRIT_ON_FAIL(editor_group_add(project->global_object, group));
    CRIT_ON_FAIL(editor_save_all(project->global_object));
    obj = edje_edit_object_add(e);
@@ -2245,15 +2271,17 @@ pm_project_group_import(Project *project, const char 
*edj, const char *group)
 
    change_undo(obj, change);
    CRIT_ON_FAIL(editor_save_all(obj));
+   THREAD_CONTEXT_SWITCH_END;
    /* reload file after group add */
-   pm_dev_file_reload(project);
+   //pm_dev_file_reload(project);
    /* add group to project structures */
+   THREAD_CONTEXT_SWITCH_BEGIN;
    gm_group_add(project, group, false);
+   THREAD_CONTEXT_SWITCH_END;
 
    you_shall_pass_editor_signals(NULL);
 
    change_free(change);
-   ecore_thread_main_loop_end();
 
    return true;
 }

-- 


Reply via email to