edje_cc - limit embryo_cc instances in bg to something sensible

so compiling current efl theme seems to spawn 178 instances of
embryo_cc in the background (then collect results). this is a bit
excessive and may be a source of issues. this may be causing T3874
perhaps due to embryo_cc's not launching (fork failing or something
else) and we don't check if fork fails. so try limit to 8 embryo_cc's
in the bg which is more reasonable than the currently "unlimited"
which leads to 178 currently...

i hope this fixes T3874

@fix
This commit is contained in:
Carsten Haitzler 2016-06-13 14:11:20 +09:00
parent c5fc0dae0c
commit 2845f5eff0
1 changed files with 64 additions and 4 deletions

View File

@ -2023,6 +2023,19 @@ data_thread_script(void *data, Ecore_Thread *thread EINA_UNUSED)
// close(sc->tmpo_fd);
}
typedef struct
{
char *exe;
Script_Write *sc;
} Pending_Script_Write;
#define PENDING_COMMANDS_MAX 8
static int pending_write_commands = 0;
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)
{
@ -2045,6 +2058,20 @@ data_scripts_exe_del_cb(void *data EINA_UNUSED, int evtype EINA_UNUSED, void *ev
if (!ev->exe) return ECORE_CALLBACK_RENEW;
if (ecore_exe_data_get(ev->exe) != sc) return ECORE_CALLBACK_RENEW;
pending_write_commands--;
if (pending_write_commands < PENDING_COMMANDS_MAX)
{
if (pending_script_writes)
{
Pending_Script_Write *pend = pending_script_writes->data;
pending_script_writes = eina_list_remove_list
(pending_script_writes, pending_script_writes);
data_write_script_queue(pend->sc, pend->exe);
free(pend->exe);
free(pend);
}
}
if (ev->exit_code != 0)
{
error_and_abort(sc->ef, "Compiling script code not clean.");
@ -2063,6 +2090,41 @@ data_scripts_exe_del_cb(void *data EINA_UNUSED, int evtype EINA_UNUSED, void *ev
return ECORE_CALLBACK_CANCEL;
}
static void
data_write_script_queue(Script_Write *sc, const char *exeline)
{
if (pending_write_commands >= PENDING_COMMANDS_MAX)
{
Pending_Script_Write *pend = malloc(sizeof(Pending_Script_Write));
if (pend)
{
pend->sc = sc;
pend->exe = strdup(exeline);
if (!pend->exe)
{
error_and_abort(sc->ef,
"Unable to allocate mem pending string.");
free(pend);
return;
}
pending_script_writes = eina_list_append(pending_script_writes,
pend);
}
else
error_and_abort(sc->ef,
"Unable to allocate mem for pending script.");
}
else
{
pending_threads++;
sc->exe = ecore_exe_run(exeline, sc);
if (!sc->exe) error_and_abort(sc->ef, "Unable to fork off embryo_cc.");
ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
data_scripts_exe_del_cb, sc);
pending_write_commands++;
}
}
static void
data_write_scripts(Eet_File *ef)
{
@ -2098,6 +2160,7 @@ data_write_scripts(Eet_File *ef)
}
#undef BIN_EXT
fprintf(stderr, ".................... SCRIPT\n");
for (i = 0, l = codes; l; l = eina_list_next(l), i++)
{
Code *cd = eina_list_data_get(l);
@ -2128,10 +2191,7 @@ data_write_scripts(Eet_File *ef)
snprintf(buf, sizeof(buf),
"%s -i %s -o %s %s", embryo_cc_path, inc_path,
sc->tmpo, sc->tmpn);
pending_threads++;
sc->exe = ecore_exe_run(buf, sc);
ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
data_scripts_exe_del_cb, sc);
data_write_script_queue(sc, buf);
}
}