nikawhite pushed a commit to branch master.

http://git.enlightenment.org/tools/eflete.git/commit/?id=976352bf8a34870f9bd25774352fe97ae052e316

commit 976352bf8a34870f9bd25774352fe97ae052e316
Author: Mykyta Biliavskyi <m.biliavs...@samsung.com>
Date:   Tue Aug 9 20:20:18 2016 +0300

    Project manager: move save routine into Ecore_Thread.
---
 src/bin/Makefile.am                               |  1 +
 src/bin/project_manager/project_manager.c         | 50 +++----------
 src/bin/project_manager/project_manager_private.h |  6 ++
 src/bin/project_manager/project_manager_save.c    | 85 +++++++++++++++++++++++
 4 files changed, 103 insertions(+), 39 deletions(-)

diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
index bd884f6..c51c9f1 100644
--- a/src/bin/Makefile.am
+++ b/src/bin/Makefile.am
@@ -66,6 +66,7 @@ libete_a_SOURCES = \
 ../../src/bin/project_manager/group_manager.c \
 ../../src/bin/project_manager/project_manager.c \
 ../../src/bin/project_manager/project_manager_open.c \
+../../src/bin/project_manager/project_manager_save.c \
 ../../src/bin/project_manager/project_manager_import_edj.c \
 ../../src/bin/project_manager/project_manager_import_edc.c \
 ../../src/bin/project_manager/project_manager_export_resources.c \
diff --git a/src/bin/project_manager/project_manager.c 
b/src/bin/project_manager/project_manager.c
index 443b3c8..1163ac3 100644
--- a/src/bin/project_manager/project_manager.c
+++ b/src/bin/project_manager/project_manager.c
@@ -158,19 +158,6 @@ _pm_project_descriptor_shutdown(Project_Thread *ptd)
    ptd->eed_project = NULL;
 }
 
-static void
-_progress_send(void *data)
-{
-   Progress_Message *message;
-
-   message = (Progress_Message *)data;
-   assert(message != NULL);
-
-   message->func_print(message->data, message->str);
-   eina_stringshare_del(message->str);
-   free(message);
-}
-
 void
 _end_send(void *data)
 {
@@ -618,24 +605,6 @@ pm_dev_file_reload(Project *pr)
    edje_object_mmap_set(pr->global_object, pr->mmap_file, 
EFLETE_INTERNAL_GROUP_NAME);
 }
 
-static void *
-_project_save(void *data __UNUSED__,
-              Eina_Thread *thread __UNUSED__)
-{
-   THREAD_CONTEXT_SWITCH_BEGIN;
-   PROGRESS_SEND(_("Save project '%s'"), worker.project->name);
-   CRIT_ON_FAIL(editor_save_all(worker.project->global_object));
-
-   ecore_file_cp(worker.project->dev, worker.project->saved_edj);
-
-   PROGRESS_SEND("Save done");
-
-   THREAD_CONTEXT_SWITCH_END;
-
-   END_SEND(PM_PROJECT_SUCCESS);
-   return NULL;
-}
-
 void
 pm_project_save(Project *project,
                 PM_Project_Progress_Cb func_progress,
@@ -644,15 +613,18 @@ pm_project_save(Project *project,
 {
    assert(project != NULL);
 
-   WORKER_CREATE(func_progress, func_end, data, project,
-                 NULL, NULL, NULL, NULL, NULL, NULL);
+   Project_Thread *ptd;
+   ptd = mem_calloc(1, sizeof(Project_Thread));
+   ptd->func_progress = func_progress;
+   ptd->func_end = func_end;
+   ptd->data = (void *)data;
+   ptd->project = project;
+   eina_lock_new(&ptd->mutex);
 
-   if (!eina_thread_create(&worker.thread, EINA_THREAD_URGENT, -1,
-                           (void *)_project_save, NULL))
-     {
-        ERR("System error: can't create thread");
-        abort();
-     }
+   /* Launch save project routine inside thread with feedback */
+   ecore_thread_feedback_run(_project_save_feedback_job, 
_project_save_feedback_cb,
+                             _project_save_end_cb, _project_save_cancel_cb, 
ptd,
+                             true);
 }
 
 Eina_Bool
diff --git a/src/bin/project_manager/project_manager_private.h 
b/src/bin/project_manager/project_manager_private.h
index 23bfad6..d6ee158 100644
--- a/src/bin/project_manager/project_manager_private.h
+++ b/src/bin/project_manager/project_manager_private.h
@@ -199,6 +199,12 @@ void _project_open_end_cb(void *data, Ecore_Thread *th);
 void _project_open_feedback_cb(void *data, Ecore_Thread *th, void *msg_data);
 void _project_open_feedback_job(void *data, Ecore_Thread *th);
 
+/*------- Open Project functions --------*/
+void _project_save_cancel_cb(void *data, Ecore_Thread *th);
+void _project_save_end_cb(void *data, Ecore_Thread *th);
+void _project_save_feedback_cb(void *data, Ecore_Thread *th, void *msg_data);
+void _project_save_feedback_job(void *data, Ecore_Thread *th);
+
 /*------- Import form edj functions -----*/
 void _project_import_edj(void *data);
 
diff --git a/src/bin/project_manager/project_manager_save.c 
b/src/bin/project_manager/project_manager_save.c
new file mode 100644
index 0000000..9cf71e7
--- /dev/null
+++ b/src/bin/project_manager/project_manager_save.c
@@ -0,0 +1,85 @@
+/*
+ * Efl Edje Theme Editor
+ * Copyright (C) 2013-2016 Samsung Electronics.
+ *
+ * This file is part of Edje Theme Editor.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; If not, see www.gnu.org/licenses/lgpl.html.
+ */
+#include "project_manager.h"
+#include "project_manager_private.h"
+
+void
+_project_save_cancel_cb(void *data, Ecore_Thread *th __UNUSED__)
+{
+   Project_Thread *ptd = (Project_Thread *)data;
+   ERR("Project saving process canceled");
+
+   ptd->result = PM_PROJECT_ERROR;
+   _end_send(ptd);
+}
+
+void
+_project_save_end_cb(void *data, Ecore_Thread *th __UNUSED__)
+{
+   Project_Thread *ptd = (Project_Thread *)data;
+   ptd->result = PM_PROJECT_ERROR;
+   _end_send(ptd);
+}
+
+void
+_project_save_feedback_cb(void *data,
+                          Ecore_Thread *th __UNUSED__,
+                          void *msg_data)
+{
+   Project_Thread *ptd = (Project_Thread *)data;
+   Eina_Stringshare *message = (Eina_Stringshare *)msg_data;
+   assert(message != NULL);
+   assert(ptd != NULL);
+
+   ptd->func_progress(NULL, message);
+   eina_stringshare_del(message);
+}
+
+void
+_project_save_feedback_job(void *data, Ecore_Thread *th)
+{
+   Project_Thread *ptd = (Project_Thread *)data;
+   if (!eina_lock_take(&ptd->mutex))
+     {
+       ERR("Failed access to the thread data");
+       eina_lock_release(&ptd->mutex);
+       ecore_thread_cancel(th);
+       return;
+     }
+
+   assert(ptd->project != NULL);
+   Eina_Stringshare *message = eina_stringshare_printf(_("Save project '%s'"), 
ptd->project->name);
+   ecore_thread_feedback(th, message);
+
+   if (!editor_save_all(ptd->project->global_object))
+     {
+        ERR("Failed to save project.");
+        eina_lock_release(&ptd->mutex);
+        ecore_thread_cancel(th);
+        return;
+     }
+
+   ecore_file_cp(ptd->project->dev, ptd->project->saved_edj);
+
+   message = eina_stringshare_printf(_("Save done."));
+   ecore_thread_feedback(th, message);
+
+   eina_lock_release(&ptd->mutex);
+   return;
+}

-- 


Reply via email to