exactness: protect against forked calls

there came up a issue, where a excatness spawned processes were bringing
up a efreetd instance, when the efreetd instance turned off itself, the
files for exactness were written again, which is wrong. This ensures
that forked instances do not take any actions.

Differential Revision: https://phab.enlightenment.org/D11634
This commit is contained in:
Marcel Hollerbach 2020-04-01 14:04:19 +02:00
parent 3598654965
commit b3786aa83a
4 changed files with 47 additions and 11 deletions

View File

@ -4,6 +4,31 @@
#include "common.h"
Eina_Bool
ex_is_original_app(void)
{
const char *original_pid_env = getenv("EXACTNESS_ORIGINAL_PID");
if (original_pid_env)
{
pid_t original_pid = atoi(original_pid_env);
if (original_pid == getpid())
return EINA_TRUE;
}
return EINA_FALSE;
}
void
ex_set_original_envvar(void)
{
const char *original_pid_env = getenv("EXACTNESS_ORIGINAL_PID");
if (!original_pid_env)
{
char pid[30];
snprintf(pid, sizeof(pid), "%d", getpid());
setenv("EXACTNESS_ORIGINAL_PID", pid, 0);
}
}
void
ex_prepare_elm_overloay(void)
{

View File

@ -260,6 +260,9 @@ typedef struct
Evas *(*_evas_new)(void);
const char *_exactness_action_type_to_string_get(Exactness_Action_Type type);
Eina_Bool ex_is_original_app(void);
void ex_set_original_envvar(void);
Eina_Bool exactness_image_compare(Exactness_Image *img1, Exactness_Image *img2, Exactness_Image **diff_img);
Exactness_Unit *exactness_unit_file_read(const char *filename);
Eina_Bool exactness_unit_file_write(Exactness_Unit *unit, const char *filename);

View File

@ -1039,6 +1039,8 @@ eina_init(void)
ORIGINAL_CALL("eina_init");
ex_set_original_envvar();
if (original_return == 1)
{
const char *dest = getenv("EXACTNESS_DEST");
@ -1080,7 +1082,7 @@ ecore_evas_init(void)
ORIGINAL_CALL("ecore_evas_init")
if (original_return == 1)
if (ex_is_original_app() && original_return == 1)
{
_setup_ee_creation();
}
@ -1095,7 +1097,7 @@ elm_init(int argc, char **argv)
int original_return;
ORIGINAL_CALL("elm_init", argc, argv)
if (original_return == 1)
if (ex_is_original_app() && original_return == 1)
ex_prepare_elm_overloay();
return original_return;
@ -1106,7 +1108,8 @@ ecore_main_loop_begin(void)
{
int original_return;
ORIGINAL_CALL("ecore_main_loop_begin")
_write_unit_file();
if (ex_is_original_app())
_write_unit_file();
(void)original_return;
}
@ -1115,7 +1118,8 @@ efl_loop_begin(Eo *obj)
{
Eina_Value *original_return;
ORIGINAL_CALL_T(Eina_Value*, "efl_loop_begin", obj);
_write_unit_file();
if (ex_is_original_app())
_write_unit_file();
return original_return;
}
@ -1125,7 +1129,7 @@ eina_shutdown(void)
int original_return;
static Eina_Bool output_written = EINA_FALSE;
ORIGINAL_CALL("eina_shutdown")
if (original_return == 1 && !output_written)
if (ex_is_original_app() &&original_return == 1 && !output_written)
{
output_written = EINA_TRUE;
_write_unit_file();

View File

@ -314,7 +314,9 @@ eina_init(void)
ORIGINAL_CALL("eina_init");
if (original_return == 1)
ex_set_original_envvar();
if (ex_is_original_app() && original_return == 1)
{
_log_domain = eina_log_domain_register("exactness_recorder", NULL);
@ -336,7 +338,7 @@ ecore_evas_init(void)
ORIGINAL_CALL("ecore_evas_init")
if (original_return == 1)
if (ex_is_original_app() && original_return == 1)
{
_setup_ee_creation();
@ -352,7 +354,7 @@ elm_init(int argc, char **argv)
int original_return;
ORIGINAL_CALL("elm_init", argc, argv)
if (original_return == 1)
if (ex_is_original_app() && original_return == 1)
ex_prepare_elm_overloay();
return original_return;
@ -363,7 +365,8 @@ ecore_main_loop_begin(void)
{
int original_return;
ORIGINAL_CALL("ecore_main_loop_begin")
_output_write();
if (ex_is_original_app())
_output_write();
(void)original_return;
}
@ -372,7 +375,8 @@ efl_loop_begin(Eo *obj)
{
Eina_Value *original_return;
ORIGINAL_CALL_T(Eina_Value*, "efl_loop_begin", obj);
_output_write();
if (ex_is_original_app())
_output_write();
return original_return;
}
@ -382,7 +386,7 @@ eina_shutdown(void)
int original_return;
static Eina_Bool output_written = EINA_FALSE;
ORIGINAL_CALL("eina_shutdown")
if (original_return == 1 && !output_written)
if (ex_is_original_app() && original_return == 1 && !output_written)
{
output_written = EINA_TRUE;
_output_write();