detect crashes at startup or early and enable "safe mode" so if you hit
restart e will not load modules - maybe safe mode should also restore default theme and other things too later... SVN revision: 24321
This commit is contained in:
parent
cbaad3914a
commit
bcce7b2397
|
@ -49,9 +49,11 @@ main(int argc, char **argv)
|
||||||
int i;
|
int i;
|
||||||
int nostartup = 0;
|
int nostartup = 0;
|
||||||
int after_restart = 0;
|
int after_restart = 0;
|
||||||
|
int safe_mode = 0;
|
||||||
char buf[PATH_MAX];
|
char buf[PATH_MAX];
|
||||||
char *s;
|
char *s;
|
||||||
struct sigaction action;
|
struct sigaction action;
|
||||||
|
double t, tstart;
|
||||||
/* trap deadly bug signals and allow some form of sane recovery */
|
/* trap deadly bug signals and allow some form of sane recovery */
|
||||||
/* or ability to gdb attach and debug at this point - better than your */
|
/* or ability to gdb attach and debug at this point - better than your */
|
||||||
/* wm/desktop vanishing and not knowing what happened */
|
/* wm/desktop vanishing and not knowing what happened */
|
||||||
|
@ -92,6 +94,22 @@ main(int argc, char **argv)
|
||||||
sigemptyset(&action.sa_mask);
|
sigemptyset(&action.sa_mask);
|
||||||
sigaction(SIGABRT, &action, NULL);
|
sigaction(SIGABRT, &action, NULL);
|
||||||
|
|
||||||
|
t = ecore_time_get();
|
||||||
|
s = getenv("START_TIME");
|
||||||
|
if ((s) && (getenv("CRASHED")))
|
||||||
|
{
|
||||||
|
tstart = atof(s);
|
||||||
|
if ((t - tstart) < 5.0)
|
||||||
|
{
|
||||||
|
safe_mode = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
e_util_env_set("CRASHED", NULL);
|
||||||
|
|
||||||
|
tstart = t;
|
||||||
|
snprintf(buf, sizeof(buf), "%1.1f", tstart);
|
||||||
|
e_util_env_set("START_TIME", buf);
|
||||||
|
|
||||||
/* FIXME: this is the init code for letting e be relocatable. right now
|
/* FIXME: this is the init code for letting e be relocatable. right now
|
||||||
* its not used - so i want to see if it can reliably determine its exe
|
* its not used - so i want to see if it can reliably determine its exe
|
||||||
* prefix
|
* prefix
|
||||||
|
@ -296,7 +314,7 @@ main(int argc, char **argv)
|
||||||
"Perhaps you are out of memory?"));
|
"Perhaps you are out of memory?"));
|
||||||
_e_main_shutdown(-1);
|
_e_main_shutdown(-1);
|
||||||
}
|
}
|
||||||
if(!ecore_event_handler_add(ECORE_EVENT_SIGNAL_HUP, _e_main_cb_signal_hup, NULL))
|
if (!ecore_event_handler_add(ECORE_EVENT_SIGNAL_HUP, _e_main_cb_signal_hup, NULL))
|
||||||
{
|
{
|
||||||
e_error_message_show(_("Enlightenment cannot set up a HUP signal handler.\n"
|
e_error_message_show(_("Enlightenment cannot set up a HUP signal handler.\n"
|
||||||
"Perhaps you are out of memory?"));
|
"Perhaps you are out of memory?"));
|
||||||
|
@ -314,7 +332,7 @@ main(int argc, char **argv)
|
||||||
_e_main_shutdown(-1);
|
_e_main_shutdown(-1);
|
||||||
}
|
}
|
||||||
_e_main_shutdown_push(_e_main_x_shutdown);
|
_e_main_shutdown_push(_e_main_x_shutdown);
|
||||||
/* init x */
|
/* init white box of death alert */
|
||||||
if (!e_alert_init(NULL))
|
if (!e_alert_init(NULL))
|
||||||
{
|
{
|
||||||
e_error_message_show(_("Enlightenment cannot initialize its emergency alert system.\n"
|
e_error_message_show(_("Enlightenment cannot initialize its emergency alert system.\n"
|
||||||
|
@ -374,6 +392,7 @@ main(int argc, char **argv)
|
||||||
"Ecore and check they support the Software Buffer rendering engine."));
|
"Ecore and check they support the Software Buffer rendering engine."));
|
||||||
_e_main_shutdown(-1);
|
_e_main_shutdown(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
Ecore_Evas *ee;
|
Ecore_Evas *ee;
|
||||||
Evas_Object *im;
|
Evas_Object *im;
|
||||||
|
@ -599,6 +618,21 @@ main(int argc, char **argv)
|
||||||
_e_main_shutdown(-1);
|
_e_main_shutdown(-1);
|
||||||
}
|
}
|
||||||
_e_main_shutdown_push(e_color_class_shutdown);
|
_e_main_shutdown_push(e_color_class_shutdown);
|
||||||
|
/* load modules */
|
||||||
|
if (!safe_mode)
|
||||||
|
e_module_all_load();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
e_int_config_modules(e_container_current_get(e_manager_current_get()));
|
||||||
|
e_error_message_show
|
||||||
|
(_("Enlightenment crashed early on start and has<br>"
|
||||||
|
"been restarted. All modules have been disabled<br>"
|
||||||
|
"and will not be loaded to help remove any problem<br>"
|
||||||
|
"modules from your configuration. The module<br>"
|
||||||
|
"configuration dialog should let you select your<br>"
|
||||||
|
"modules again."));
|
||||||
|
e_config_save_queue();
|
||||||
|
}
|
||||||
/* setup gadcon */
|
/* setup gadcon */
|
||||||
if (!e_gadcon_init())
|
if (!e_gadcon_init())
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,6 +34,33 @@ static Evas_List *_e_modules = NULL;
|
||||||
/* externally accessible functions */
|
/* externally accessible functions */
|
||||||
EAPI int
|
EAPI int
|
||||||
e_module_init(void)
|
e_module_init(void)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI int
|
||||||
|
e_module_shutdown(void)
|
||||||
|
{
|
||||||
|
Evas_List *l, *tmp;
|
||||||
|
|
||||||
|
#ifdef HAVE_VALGRIND
|
||||||
|
/* do a leak check now before we dlclose() all those plugins, cause
|
||||||
|
* that means we won't get a decent backtrace to leaks in there
|
||||||
|
*/
|
||||||
|
VALGRIND_DO_LEAK_CHECK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (l = _e_modules; l;)
|
||||||
|
{
|
||||||
|
tmp = l;
|
||||||
|
l = l->next;
|
||||||
|
e_object_del(E_OBJECT(tmp->data));
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
EAPI void
|
||||||
|
e_module_all_load(void)
|
||||||
{
|
{
|
||||||
Evas_List *pl = NULL, *l;
|
Evas_List *pl = NULL, *l;
|
||||||
|
|
||||||
|
@ -59,29 +86,6 @@ e_module_init(void)
|
||||||
e_config_save_queue();
|
e_config_save_queue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI int
|
|
||||||
e_module_shutdown(void)
|
|
||||||
{
|
|
||||||
Evas_List *l, *tmp;
|
|
||||||
|
|
||||||
#ifdef HAVE_VALGRIND
|
|
||||||
/* do a leak check now before we dlclose() all those plugins, cause
|
|
||||||
* that means we won't get a decent backtrace to leaks in there
|
|
||||||
*/
|
|
||||||
VALGRIND_DO_LEAK_CHECK
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (l = _e_modules; l;)
|
|
||||||
{
|
|
||||||
tmp = l;
|
|
||||||
l = l->next;
|
|
||||||
e_object_del(E_OBJECT(tmp->data));
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI E_Module *
|
EAPI E_Module *
|
||||||
|
|
|
@ -48,6 +48,7 @@ struct _E_Module_Api
|
||||||
EAPI int e_module_init(void);
|
EAPI int e_module_init(void);
|
||||||
EAPI int e_module_shutdown(void);
|
EAPI int e_module_shutdown(void);
|
||||||
|
|
||||||
|
EAPI void e_module_all_load(void);
|
||||||
EAPI E_Module *e_module_new(const char *name);
|
EAPI E_Module *e_module_new(const char *name);
|
||||||
EAPI int e_module_save(E_Module *m);
|
EAPI int e_module_save(E_Module *m);
|
||||||
EAPI const char *e_module_dir_get(E_Module *m);
|
EAPI const char *e_module_dir_get(E_Module *m);
|
||||||
|
|
|
@ -25,6 +25,7 @@ e_sigseg_act(int x, siginfo_t *info, void *data)
|
||||||
ecore_x_keyboard_ungrab();
|
ecore_x_keyboard_ungrab();
|
||||||
ecore_x_ungrab();
|
ecore_x_ungrab();
|
||||||
ecore_x_sync();
|
ecore_x_sync();
|
||||||
|
e_util_env_set("CRASHED", "SEGV");
|
||||||
e_alert_show("This is very bad. Enlightenment has segfaulted.\n"
|
e_alert_show("This is very bad. Enlightenment has segfaulted.\n"
|
||||||
"This is not meant to happen and is likely a sign of a\n"
|
"This is not meant to happen and is likely a sign of a\n"
|
||||||
"bug in Enlightenment or the libraries it relies on.\n"
|
"bug in Enlightenment or the libraries it relies on.\n"
|
||||||
|
@ -50,6 +51,7 @@ e_sigseg_act(int x, siginfo_t *info, void *data)
|
||||||
ecore_x_keyboard_ungrab();
|
ecore_x_keyboard_ungrab();
|
||||||
ecore_x_ungrab();
|
ecore_x_ungrab();
|
||||||
ecore_x_sync();
|
ecore_x_sync();
|
||||||
|
e_util_env_set("CRASHED", "SEGV");
|
||||||
e_alert_show("This is very bad. Enlightenment has segfaulted.\n"
|
e_alert_show("This is very bad. Enlightenment has segfaulted.\n"
|
||||||
"This is not meant to happen and is likely a sign of a\n"
|
"This is not meant to happen and is likely a sign of a\n"
|
||||||
"bug in Enlightenment or the libraries it relies on.\n"
|
"bug in Enlightenment or the libraries it relies on.\n"
|
||||||
|
@ -76,6 +78,7 @@ e_sigill_act(int x, siginfo_t *info, void *data)
|
||||||
ecore_x_keyboard_ungrab();
|
ecore_x_keyboard_ungrab();
|
||||||
ecore_x_ungrab();
|
ecore_x_ungrab();
|
||||||
ecore_x_sync();
|
ecore_x_sync();
|
||||||
|
e_util_env_set("CRASHED", "ILL");
|
||||||
e_alert_show("This is very bad. Enlightenment has executed and illegal\n"
|
e_alert_show("This is very bad. Enlightenment has executed and illegal\n"
|
||||||
"instruction. This is most likely because Enlightenment or\n"
|
"instruction. This is most likely because Enlightenment or\n"
|
||||||
"a library it depends on has been compiled for a CPU type\n"
|
"a library it depends on has been compiled for a CPU type\n"
|
||||||
|
@ -102,6 +105,7 @@ e_sigfpe_act(int x, siginfo_t *info, void *data)
|
||||||
ecore_x_keyboard_ungrab();
|
ecore_x_keyboard_ungrab();
|
||||||
ecore_x_ungrab();
|
ecore_x_ungrab();
|
||||||
ecore_x_sync();
|
ecore_x_sync();
|
||||||
|
e_util_env_set("CRASHED", "FPE");
|
||||||
e_alert_show("This is very bad. Enlightenment has recieved a floating\n"
|
e_alert_show("This is very bad. Enlightenment has recieved a floating\n"
|
||||||
"point exception. This is probably due to a divide by 0\n"
|
"point exception. This is probably due to a divide by 0\n"
|
||||||
"in Enlightenment or a library it depends on.\n"
|
"in Enlightenment or a library it depends on.\n"
|
||||||
|
@ -127,6 +131,7 @@ e_sigbus_act(int x, siginfo_t *info, void *data)
|
||||||
ecore_x_keyboard_ungrab();
|
ecore_x_keyboard_ungrab();
|
||||||
ecore_x_ungrab();
|
ecore_x_ungrab();
|
||||||
ecore_x_sync();
|
ecore_x_sync();
|
||||||
|
e_util_env_set("CRASHED", "BUS");
|
||||||
e_alert_show("This is very bad. Enlightenment has recieved a bus error.\n"
|
e_alert_show("This is very bad. Enlightenment has recieved a bus error.\n"
|
||||||
"This could be for many reasons - accessing memory not in\n"
|
"This could be for many reasons - accessing memory not in\n"
|
||||||
"its available address space or unable to be paged in.\n"
|
"its available address space or unable to be paged in.\n"
|
||||||
|
@ -152,6 +157,7 @@ e_sigabrt_act(int x, siginfo_t *info, void *data)
|
||||||
ecore_x_keyboard_ungrab();
|
ecore_x_keyboard_ungrab();
|
||||||
ecore_x_ungrab();
|
ecore_x_ungrab();
|
||||||
ecore_x_sync();
|
ecore_x_sync();
|
||||||
|
e_util_env_set("CRASHED", "ABRT");
|
||||||
e_alert_show("This is very bad. Enlightenment has recieved an abort.\n"
|
e_alert_show("This is very bad. Enlightenment has recieved an abort.\n"
|
||||||
"This could be for many reasons - accessing memory not in\n"
|
"This could be for many reasons - accessing memory not in\n"
|
||||||
"its available address space or unable to be paged in.\n"
|
"its available address space or unable to be paged in.\n"
|
||||||
|
|
Loading…
Reference in New Issue