From 789c2892a3e6e3ef4c9661b90236f62b0c55d341 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 26 Jan 2018 14:08:29 -0500 Subject: [PATCH] edje_cc: make -thread option this option was broken due to immediately triggering EMFILE errors during thread initialization and then attempting to exit while threads were still ongoing some work is still needed to make this an improvement over the current default of not using threads @fix --- src/bin/edje/edje_cc.c | 12 ++ src/bin/edje/edje_cc.h | 2 + src/bin/edje/edje_cc_out.c | 255 +++++++++++++++++++++---------------- 3 files changed, 162 insertions(+), 107 deletions(-) diff --git a/src/bin/edje/edje_cc.c b/src/bin/edje/edje_cc.c index 64c1e6df18..9a67a55e45 100644 --- a/src/bin/edje/edje_cc.c +++ b/src/bin/edje/edje_cc.c @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include "edje_cc.h" int _edje_cc_log_dom = -1; @@ -44,6 +46,8 @@ int no_etc1 = 0; int no_etc2 = 0; int beta = 0; +unsigned int max_open_files; + static void _edje_cc_log_cb(const Eina_Log_Domain *d, Eina_Log_Level level, @@ -409,6 +413,14 @@ main(int argc, char **argv) edje_file->efl_version.minor = 18; edje_file->base_scale = FROM_INT(1); + { + struct rlimit lim; + if (getrlimit(RLIMIT_NOFILE, &lim)) + fprintf(stderr, "error getting max open file limit: %s\n", strerror(errno)); + max_open_files = lim.rlim_cur; + } + ecore_evas_init(); + source_edd(); source_fetch(); diff --git a/src/bin/edje/edje_cc.h b/src/bin/edje/edje_cc.h index 55c151b02a..3bcea20871 100644 --- a/src/bin/edje/edje_cc.h +++ b/src/bin/edje/edje_cc.h @@ -354,4 +354,6 @@ extern int beta; extern int had_quote; +extern unsigned int max_open_files; + #endif diff --git a/src/bin/edje/edje_cc_out.c b/src/bin/edje/edje_cc_out.c index 63d5a61dd8..52d9e238fa 100644 --- a/src/bin/edje/edje_cc_out.c +++ b/src/bin/edje/edje_cc_out.c @@ -208,6 +208,8 @@ struct _Image_Unused_Ids typedef struct _Image_Unused_Ids Image_Unused_Ids; static int pending_threads = 0; +static int pending_image_threads = 0; +static Eina_List *running_threads; static void data_process_string(Edje_Part_Collection *pc, const char *prefix, char *s, void (*func)(Edje_Part_Collection *pc, char *name, char* ptr, int len)); @@ -235,6 +237,13 @@ static Eina_List *model_lookups = NULL; static Eina_Hash *part_dest_lookup = NULL; static Eina_Hash *part_pc_dest_lookup = NULL; +static Eet_File *cur_ef; +static int image_num; +static Ecore_Evas *buffer_ee; +static int cur_image_entry; + +static void data_write_images(void); + void error_and_abort(Eet_File *ef EINA_UNUSED, const char *fmt, ...) { @@ -249,6 +258,21 @@ error_and_abort(Eet_File *ef EINA_UNUSED, const char *fmt, ...) exit(-1); } +static void +thread_end(Eina_Bool img) +{ + if (img) + pending_image_threads--; + else + pending_threads--; + if (threads) + { + if ((pending_image_threads + pending_threads) < (int)max_open_files - 2) + data_write_images(); + } + if (pending_threads + pending_image_threads <= 0) ecore_main_loop_quit(); +} + static unsigned int _part_lookup_key_length(const void *key EINA_UNUSED) { @@ -739,18 +763,18 @@ data_thread_head(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_head_end(void *data, Ecore_Thread *thread EINA_UNUSED) +data_thread_head_end(void *data, Ecore_Thread *thread) { Head_Write *hw = data; - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); if (hw->errstr) { error_and_abort(hw->ef, hw->errstr); free(hw->errstr); } free(hw); + thread_end(0); } static void @@ -762,7 +786,7 @@ data_write_header(Eet_File *ef) hw->ef = ef; pending_threads++; if (threads) - ecore_thread_run(data_thread_head, data_thread_head_end, NULL, hw); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_head, data_thread_head_end, NULL, hw)); else { data_thread_head(hw, NULL); @@ -840,17 +864,18 @@ data_thread_fonts(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_fonts_end(void *data, Ecore_Thread *thread EINA_UNUSED) +data_thread_fonts_end(void *data, Ecore_Thread *thread) { Fonts_Write *fc = data; - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + + running_threads = eina_list_remove(running_threads, thread); if (fc->errstr) { error_and_abort(fc->ef, fc->errstr); free(fc->errstr); } free(fc); + thread_end(0); } static void @@ -872,7 +897,7 @@ data_write_fonts(Eet_File *ef, int *font_num) fc->fn = fn; pending_threads++; if (threads) - ecore_thread_run(data_thread_fonts, data_thread_fonts_end, NULL, fc); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_fonts, data_thread_fonts_end, NULL, fc)); else { data_thread_fonts(fc, NULL); @@ -1106,12 +1131,11 @@ data_thread_image(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_image_end(void *data, Ecore_Thread *thread EINA_UNUSED) +data_thread_image_end(void *data, Ecore_Thread *thread) { Image_Write *iw = data; - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); if (iw->errstr) { error_and_abort(iw->ef, iw->errstr); @@ -1120,6 +1144,7 @@ data_thread_image_end(void *data, Ecore_Thread *thread EINA_UNUSED) free(iw->path); evas_object_del(iw->im); free(iw); + thread_end(1); } static void @@ -1131,7 +1156,7 @@ data_image_preload_done(void *data, Evas *e EINA_UNUSED, Evas_Object *o, void *e iw->alpha = evas_object_image_alpha_get(o); iw->data = evas_object_image_data_get(o, 0); if (threads) - ecore_thread_run(data_thread_image, data_thread_image_end, NULL, iw); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_image, data_thread_image_end, NULL, iw)); else { data_thread_image(iw, NULL); @@ -1153,12 +1178,11 @@ tgv_file_thread(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -tgv_file_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED) +tgv_file_thread_end(void *data, Ecore_Thread *thread) { Image_Write *iw = data; - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); if (iw->errstr) { error_and_abort(iw->ef, iw->errstr); @@ -1169,10 +1193,11 @@ tgv_file_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED) eina_file_map_free(iw->f, iw->data); eina_file_close(iw->f); free(iw); + thread_end(1); } static Eina_Bool -tgv_file_check_and_add(Eet_File *ef, Edje_Image_Directory_Entry *img, int *image_num) +tgv_file_check_and_add(Eet_File *ef, Edje_Image_Directory_Entry *img) { Emile_Image_Load_Error err; Emile_Image *emi = NULL; @@ -1238,12 +1263,12 @@ tgv_file_check_and_add(Eet_File *ef, Edje_Image_Directory_Entry *img, int *image goto on_error; } - *image_num += 1; + image_num += 1; iw->path = strdup(img->entry); - pending_threads++; + pending_image_threads++; if (threads) - ecore_thread_run(tgv_file_thread, tgv_file_thread_end, NULL, iw); + running_threads = eina_list_append(running_threads, ecore_thread_run(tgv_file_thread, tgv_file_thread_end, NULL, iw)); else { tgv_file_thread(iw, NULL); @@ -1270,17 +1295,16 @@ data_write_vectors(Eet_File *ef, int *vector_num) Edje_Vector_Directory_Entry *vector; Eina_Strbuf *buf; Eina_Bool found = EINA_FALSE; - Ecore_Evas *ee; Evas *evas; Evas_Object *vg; if (!((edje_file) && (edje_file->image_dir))) return; - ecore_evas_init(); - ee = ecore_evas_buffer_new(1, 1); - if (!ee) + if (!buffer_ee) + buffer_ee = ecore_evas_buffer_new(1, 1); + if (!buffer_ee) error_and_abort(ef, "Cannot create buffer engine canvas for image load."); - evas = ecore_evas_get(ee); + evas = ecore_evas_get(buffer_ee); vg = evas_object_vg_add(evas); buf = eina_strbuf_new(); for (i = 0; i < edje_file->image_dir->vectors_count; i++) @@ -1317,22 +1341,43 @@ data_write_vectors(Eet_File *ef, int *vector_num) } static void -data_write_images(Eet_File *ef, int *image_num) +data_image_sets_init(void) { int i; - Ecore_Evas *ee; + + if (!((edje_file) && (edje_file->image_dir))) return; + for (i = 0; i < (int)edje_file->image_dir->sets_count; i++) + { + Edje_Image_Directory_Set *set; + Edje_Image_Directory_Set_Entry *set_entry; + Edje_Image_Directory_Entry *img; + Eina_List *ll = NULL; + + set = edje_file->image_dir->sets + i; + if (!set->entries) continue; + EINA_LIST_FOREACH(set->entries, ll, set_entry) + { + img = &edje_file->image_dir->entries[set_entry->id]; + set_entry->name = img->entry; + } + } +} + +static void +data_write_images(void) +{ Evas *evas; const char *ext = NULL; if (!((edje_file) && (edje_file->image_dir))) return; - ecore_evas_init(); - ee = ecore_evas_buffer_new(1, 1); - if (!ee) - error_and_abort(ef, "Cannot create buffer engine canvas for image load."); - evas = ecore_evas_get(ee); + if (!buffer_ee) + buffer_ee = ecore_evas_buffer_new(1, 1); + if (!buffer_ee) + error_and_abort(cur_ef, "Cannot create buffer engine canvas for image load."); + evas = ecore_evas_get(buffer_ee); - for (i = 0; i < (int)edje_file->image_dir->entries_count; i++) + for (; cur_image_entry < (int)edje_file->image_dir->entries_count; cur_image_entry++) { Edje_Image_Directory_Entry *img; Evas_Object *im; @@ -1341,7 +1386,7 @@ data_write_images(Eet_File *ef, int *image_num) int load_err = EVAS_LOAD_ERROR_NONE; Image_Write *iw; - img = &edje_file->image_dir->entries[i]; + img = &edje_file->image_dir->entries[cur_image_entry]; if ((img->source_type == EDJE_IMAGE_SOURCE_TYPE_EXTERNAL) || !img->entry) continue; @@ -1351,7 +1396,7 @@ data_write_images(Eet_File *ef, int *image_num) ext = strrchr(img->entry, '.'); if (ext && !strcasecmp(ext, ".tgv")) { - if (tgv_file_check_and_add(ef, img, image_num)) + if (tgv_file_check_and_add(cur_ef, img)) { DBG("Directly copying data from TGV file into EDJ"); continue; @@ -1362,7 +1407,7 @@ data_write_images(Eet_File *ef, int *image_num) } iw = calloc(1, sizeof(Image_Write)); - iw->ef = ef; + iw->ef = cur_ef; iw->img = img; iw->im = im = evas_object_image_add(evas); if (threads) @@ -1379,9 +1424,9 @@ data_write_images(Eet_File *ef, int *image_num) load_err = evas_object_image_load_error_get(im); if (load_err == EVAS_LOAD_ERROR_NONE) { - *image_num += 1; + image_num += 1; iw->path = strdup(buf); - pending_threads++; + pending_image_threads++; if (threads) evas_object_image_preload(im, 0); using_file(buf, 'I'); @@ -1396,9 +1441,9 @@ data_write_images(Eet_File *ef, int *image_num) load_err = evas_object_image_load_error_get(im); if (load_err == EVAS_LOAD_ERROR_NONE) { - *image_num += 1; + image_num += 1; iw->path = strdup(img->entry); - pending_threads++; + pending_image_threads++; if (threads) evas_object_image_preload(im, 0); using_file(img->entry, 'I'); @@ -1408,10 +1453,11 @@ data_write_images(Eet_File *ef, int *image_num) else { free(iw); - error_and_abort_image_load_error(ef, img->entry, load_err); + error_and_abort_image_load_error(cur_ef, img->entry, load_err); exit(1); // ensure static analysis tools know we exit } } + if (img->source_type != EDJE_IMAGE_SOURCE_TYPE_EXTERNAL) { ext = strrchr(img->entry, '.'); @@ -1425,21 +1471,9 @@ data_write_images(Eet_File *ef, int *image_num) img->entry = tmp; } } - } - - for (i = 0; i < (int)edje_file->image_dir->sets_count; i++) - { - Edje_Image_Directory_Set *set; - Edje_Image_Directory_Set_Entry *set_entry; - Edje_Image_Directory_Entry *img; - Eina_List *ll = NULL; - - set = edje_file->image_dir->sets + i; - if (!set->entries) continue; - EINA_LIST_FOREACH(set->entries, ll, set_entry) + if (threads) { - img = &edje_file->image_dir->entries[set_entry->id]; - set_entry->name = img->entry; + if (pending_threads + pending_image_threads > (int)max_open_files - 2) break; } } } @@ -1561,12 +1595,12 @@ data_thread_sounds(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_sounds_end(void *data, Ecore_Thread *thread EINA_UNUSED) +data_thread_sounds_end(void *data, Ecore_Thread *thread) { Sound_Write *sw = data; - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); free(sw); + thread_end(0); } static void @@ -1588,7 +1622,7 @@ data_write_sounds(Eet_File *ef, int *sound_num) *sound_num += 1; pending_threads++; if (threads) - ecore_thread_run(data_thread_sounds, data_thread_sounds_end, NULL, sw); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_sounds, data_thread_sounds_end, NULL, sw)); else { data_thread_sounds(sw, NULL); @@ -1661,11 +1695,10 @@ data_thread_mo(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_mo_end(void *data, Ecore_Thread *thread EINA_UNUSED) +data_thread_mo_end(void *data, Ecore_Thread *thread) { Mo_Write *mw = data; - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); if (mw->errstr) { error_and_abort(mw->ef, mw->errstr); @@ -1674,6 +1707,7 @@ data_thread_mo_end(void *data, Ecore_Thread *thread EINA_UNUSED) if (mw->mo_path) free(mw->mo_path); free(mw); + thread_end(0); } Eina_Bool @@ -1691,7 +1725,7 @@ _exe_del_cb(void *data EINA_UNUSED, int evtype EINA_UNUSED, void *evinfo) if (ecore_file_exists(mw->mo_path)) { if (threads) - ecore_thread_run(data_thread_mo, data_thread_mo_end, NULL, mw); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_mo, data_thread_mo_end, NULL, mw)); else { data_thread_mo(mw, NULL); @@ -1700,7 +1734,7 @@ _exe_del_cb(void *data EINA_UNUSED, int evtype EINA_UNUSED, void *evinfo) } else return ECORE_CALLBACK_RENEW; - if (pending_threads <= 0) ecore_main_loop_quit(); + if (pending_threads + pending_image_threads <= 0) ecore_main_loop_quit(); return ECORE_CALLBACK_CANCEL; } @@ -1759,7 +1793,7 @@ data_write_mo(Eet_File *ef, int *mo_num) else { if (threads) - ecore_thread_run(data_thread_mo, data_thread_mo_end, NULL, mw); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_mo, data_thread_mo_end, NULL, mw)); else { data_thread_mo(mw, NULL); @@ -1825,12 +1859,12 @@ data_thread_vibrations(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_vibrations_end(void *data, Ecore_Thread *thread EINA_UNUSED) +data_thread_vibrations_end(void *data, Ecore_Thread *thread) { Vibration_Write *sw = data; - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); free(sw); + thread_end(0); } static void @@ -1852,7 +1886,7 @@ data_write_vibrations(Eet_File *ef, int *num) *num += 1; pending_threads++; if (threads) - ecore_thread_run(data_thread_vibrations, data_thread_vibrations_end, NULL, vw); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_vibrations, data_thread_vibrations_end, NULL, vw)); else { data_thread_vibrations(vw, NULL); @@ -1900,17 +1934,17 @@ data_thread_group(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_group_end(void *data, Ecore_Thread *thread EINA_UNUSED) +data_thread_group_end(void *data, Ecore_Thread *thread) { Group_Write *gw = data; - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); if (gw->errstr) { error_and_abort(gw->ef, gw->errstr); free(gw->errstr); } free(gw); + thread_end(0); } static void @@ -1933,7 +1967,7 @@ data_write_groups(Eet_File *ef, int *collection_num) gw->pc = pc; pending_threads++; if (threads) - ecore_thread_run(data_thread_group, data_thread_group_end, NULL, gw); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_group, data_thread_group_end, NULL, gw)); else { data_thread_group(gw, NULL); @@ -2122,17 +2156,17 @@ static Eina_List *pending_script_writes = NULL; static void data_write_script_queue(Script_Write *sc, const char *exeline); static void -data_thread_script_end(void *data, Ecore_Thread *thread EINA_UNUSED) +data_thread_script_end(void *data, Ecore_Thread *thread) { Script_Write *sc = data; - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); if (sc->errstr) { error_and_abort(sc->ef, sc->errstr); free(sc->errstr); } free(sc); + thread_end(0); } static Eina_Bool @@ -2164,14 +2198,14 @@ data_scripts_exe_del_cb(void *data EINA_UNUSED, int evtype EINA_UNUSED, void *ev } if (threads) { - ecore_thread_run(data_thread_script, data_thread_script_end, NULL, sc); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_script, data_thread_script_end, NULL, sc)); } else { data_thread_script(sc, NULL); data_thread_script_end(sc, NULL); } - if (pending_threads <= 0) ecore_main_loop_quit(); + if (pending_threads + pending_image_threads <= 0) ecore_main_loop_quit(); return ECORE_CALLBACK_CANCEL; } @@ -2433,17 +2467,17 @@ data_thread_lua_script(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_lua_script_end(void *data, Ecore_Thread *thread EINA_UNUSED) +data_thread_lua_script_end(void *data, Ecore_Thread *thread) { Script_Write *sc = data; - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); if (sc->errstr) { error_and_abort(sc->ef, sc->errstr); free(sc->errstr); } free(sc); + thread_end(0); } static void @@ -2469,7 +2503,7 @@ data_write_lua_scripts(Eet_File *ef) sc->i = i; pending_threads++; if (threads) - ecore_thread_run(data_thread_lua_script, data_thread_lua_script_end, NULL, sc); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_lua_script, data_thread_lua_script_end, NULL, sc)); else { data_thread_lua_script(sc, NULL); @@ -2486,10 +2520,10 @@ data_thread_source(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_source_end(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED) +data_thread_source_end(void *data EINA_UNUSED, Ecore_Thread *thread) { - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); + thread_end(0); } static void @@ -2542,11 +2576,11 @@ data_thread_license(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_license_end(void *data, Ecore_Thread *thread EINA_UNUSED) +data_thread_license_end(void *data, Ecore_Thread *thread) { - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); free(data); + running_threads = eina_list_remove(running_threads, thread); + thread_end(0); } static void @@ -2567,7 +2601,7 @@ data_write_license(Eet_File *ef) pending_threads++; if (threads) - ecore_thread_run(data_thread_license, data_thread_license_end, NULL, lw); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_license, data_thread_license_end, NULL, lw)); else { data_thread_license(lw, NULL); @@ -2585,7 +2619,7 @@ data_write_license(Eet_File *ef) pending_threads++; if (threads) - ecore_thread_run(data_thread_license, data_thread_license_end, NULL, lw); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_license, data_thread_license_end, NULL, lw)); else { data_thread_license(lw, NULL); @@ -2630,10 +2664,10 @@ data_thread_authors(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_authors_end(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED) +data_thread_authors_end(void *data EINA_UNUSED, Ecore_Thread *thread) { - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); + thread_end(0); } static void @@ -2644,10 +2678,10 @@ data_thread_fontmap(void *data, Ecore_Thread *thread EINA_UNUSED) } static void -data_thread_fontmap_end(void *data EINA_UNUSED, Ecore_Thread *thread EINA_UNUSED) +data_thread_fontmap_end(void *data EINA_UNUSED, Ecore_Thread *thread) { - pending_threads--; - if (pending_threads <= 0) ecore_main_loop_quit(); + running_threads = eina_list_remove(running_threads, thread); + thread_end(0); } void @@ -2655,7 +2689,6 @@ data_write(void) { Eet_File *ef; Eet_Error err; - int image_num = 0; int model_num = 0; int sound_num = 0; int mo_num = 0; @@ -2671,7 +2704,7 @@ data_write(void) exit(-1); } - ef = eet_open(file_out, EET_FILE_MODE_WRITE); + cur_ef = ef = eet_open(file_out, EET_FILE_MODE_WRITE); if (!ef) { ERR("Unable to open \"%s\" for writing output", file_out); @@ -2710,7 +2743,7 @@ data_write(void) { pending_threads++; if (threads) - ecore_thread_run(data_thread_source, data_thread_source_end, NULL, ef); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_source, data_thread_source_end, NULL, ef)); else { data_thread_source(ef, NULL); @@ -2720,15 +2753,13 @@ data_write(void) INF("source: %3.5f", ecore_time_get() - t); t = ecore_time_get(); pending_threads++; if (threads) - ecore_thread_run(data_thread_fontmap, data_thread_fontmap_end, NULL, ef); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_fontmap, data_thread_fontmap_end, NULL, ef)); else { data_thread_fontmap(ef, NULL); data_thread_fontmap_end(ef, NULL); } INF("fontmap: %3.5f", ecore_time_get() - t); t = ecore_time_get(); - data_write_images(ef, &image_num); - INF("images: %3.5f", ecore_time_get() - t); t = ecore_time_get(); data_write_vectors(ef, &vector_num); INF("vectors: %3.5f", ecore_time_get() - t); t = ecore_time_get(); data_check_models(ef, &model_num); @@ -2747,17 +2778,28 @@ data_write(void) { pending_threads++; if (threads) - ecore_thread_run(data_thread_authors, data_thread_authors_end, NULL, ef); + running_threads = eina_list_append(running_threads, ecore_thread_run(data_thread_authors, data_thread_authors_end, NULL, ef)); else { data_thread_authors(ef, NULL); data_thread_authors_end(ef, NULL); } } + data_write_images(); + data_image_sets_init(); + INF("images: %3.5f", ecore_time_get() - t); t = ecore_time_get(); pending_threads--; if (pending_threads > 0) ecore_main_loop_begin(); INF("THREADS: %3.5f", ecore_time_get() - t); data_write_header(ef); + if (pending_threads > 0) ecore_main_loop_begin(); + INF("THREADS: %3.5f", ecore_time_get() - t); + + if (threads) + { + /* probably caught signal, exit immediately to avoid crash */ + if (running_threads) exit(-1); + } err = eet_close(ef); if (err) @@ -3413,20 +3455,19 @@ static void _data_image_sets_size_set() { Evas *evas; - Ecore_Evas *ee; Edje_Image_Directory_Set *set; Edje_Image_Directory_Set_Entry *simg, *preimg; Eina_List *l, *entries; unsigned int i; - ecore_evas_init(); - ee = ecore_evas_buffer_new(1, 1); - if (!ee) + if (!buffer_ee) + buffer_ee = ecore_evas_buffer_new(1, 1); + if (!buffer_ee) { ERR("Cannot create buffer engine canvas for image load."); exit(-1); } - evas = ecore_evas_get(ee); + evas = ecore_evas_get(buffer_ee); for (i = 0; i < edje_file->image_dir->sets_count; i++) {