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; +} --