rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=4502f11e7ec1e02ab8e0b22bccd609be8ec8513c
commit 4502f11e7ec1e02ab8e0b22bccd609be8ec8513c Author: Vyacheslav Reutskiy <v.reuts...@samsung.com> Date: Thu Jul 30 10:25:28 2015 +0300 Project manager: remake the print message Delete the member message from Project_Thread and create a internal structure, what allow print the message to user output fully asynchronously. Change-Id: I9738bb9236c7637ec54460fa2f100bba3b1a501b --- src/bin/project_manager/project_manager.c | 38 ++++++++++++++----------------- src/bin/project_manager/project_manager.h | 2 -- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/src/bin/project_manager/project_manager.c b/src/bin/project_manager/project_manager.c index 62fd4a4..ecb14d9 100644 --- a/src/bin/project_manager/project_manager.c +++ b/src/bin/project_manager/project_manager.c @@ -49,6 +49,12 @@ const char *top_levels[] = { "collections", "sounds", "group", NULL}; +typedef struct +{ + Eina_Stringshare *str; + PM_Project_Progress_Cb func_print; + void *data; +} Progress_Message; #define WORKER_CREATE(FUNC_PROGRESS, FUNC_END, DATA, PROJECT, \ NAME, PATH, EDJ, EDC, BUILD_OPTIONS) \ @@ -75,8 +81,6 @@ const char *top_levels[] = { "collections", eina_stringshare_del(worker->edj); \ eina_stringshare_del(worker->edc); \ eina_stringshare_del(worker->build_options); \ - if (worker->message) \ - eina_stringshare_del(worker->message); \ free(worker); \ worker = NULL; \ } @@ -89,10 +93,11 @@ const char *top_levels[] = { "collections", { \ if (worker->func_progress) \ { \ - if (worker->message) \ - eina_stringshare_del(worker->message); \ - worker->message = eina_stringshare_printf(FMT, ## __VA_ARGS__); \ - ecore_main_loop_thread_safe_call_async(_progress_send, worker); \ + Progress_Message *message = mem_malloc(sizeof(Progress_Message)); \ + message->str = eina_stringshare_printf(FMT, ## __VA_ARGS__); \ + message->func_print = worker->func_progress; \ + message->data = worker->data; \ + ecore_main_loop_thread_safe_call_async(_progress_send, message); \ } \ } @@ -179,23 +184,14 @@ _pm_project_descriptor_data_write(const char *path, Project *project) static void _progress_send(void *data) { - Project_Thread *worker; - PM_Project_Progress_Cb func; - Eina_Stringshare *message; - void *udata; - - worker = (Project_Thread *)data; + Progress_Message *message; - assert(worker != NULL); + message = (Progress_Message *)data; + assert(message != NULL); - /** Copy the links to callback and meesage, to fast release worker resource. */ - WORKER_LOCK_TAKE; - func = worker->func_progress; - message = eina_stringshare_ref(worker->message); - udata = worker->data; - WORKER_LOCK_RELEASE; - if (func) func(udata, message); - eina_stringshare_del(message); + message->func_print(message->data, message->str); + eina_stringshare_del(message->str); + free(message); } static void diff --git a/src/bin/project_manager/project_manager.h b/src/bin/project_manager/project_manager.h index 82f15a7..275cd34 100644 --- a/src/bin/project_manager/project_manager.h +++ b/src/bin/project_manager/project_manager.h @@ -227,8 +227,6 @@ struct _Project_Thread const char *edc; /** edje_cc options. Used for 'new project' and 'import from edc'. */ const char *build_options; - /** Message string */ - Eina_Stringshare *message; /** Mutex, I say no more then. */ Eina_Lock mutex; }; --