Clear blocked signals at startup and exit.

Set EDBUG_COREDUMP to get core dump in stead of GSOD.


SVN revision: 10106
This commit is contained in:
Kim Woelders 2004-05-07 15:18:07 +00:00
parent b8507d8bac
commit 307e769187
10 changed files with 110 additions and 70 deletions

View File

@ -1261,13 +1261,16 @@ typedef struct
char single; /* No slaves */
pid_t master_pid;
int master_screen;
char startup;
char xselect;
char exiting;
char save_ok;
char coredump;
} wm;
int debug;
int mode;
char place;
char flipp;
char startup;
char xselect;
int next_move_x_plus, next_move_y_plus;
Button *button;
int resize_detail;
@ -1307,7 +1310,6 @@ typedef struct
int last_button;
Time last_time;
char queue_up;
char save_ok;
}
EMode;

View File

@ -689,7 +689,7 @@ runApp(const char *exe, const char *params)
exit(0);
}
if (!Mode.startup)
if (!Mode.wm.startup)
{
path = pathtofile(exe);
if (!path)

View File

@ -441,7 +441,7 @@ AddToFamily(Window win)
}
if ((!ewin->client.transient) && (Conf.manual_placement)
&& (!ewin->client.already_placed) && (!Mode.startup) && (!Mode.place))
&& (!ewin->client.already_placed) && (!Mode.wm.startup) && (!Mode.place))
{
cangrab = GrabThePointer(VRoot.win);
if ((cangrab == GrabNotViewable) || (cangrab == AlreadyGrabbed)
@ -1132,7 +1132,8 @@ Adopt(Window win)
SessionGetInfo(ewin, 0);
MatchEwinToSM(ewin);
MatchEwinToSnapInfo(ewin);
ICCCM_GetEInfo(ewin);
if (Mode.wm.startup)
ICCCM_GetEInfo(ewin);
if (!ewin->border)
EwinSetBorderInit(ewin);
@ -1226,7 +1227,7 @@ EwinCreate(Window win)
ewin = Emalloc(sizeof(EWin));
memset(ewin, 0, sizeof(EWin));
ewin->state = (Mode.startup) ? EWIN_STATE_STARTUP : EWIN_STATE_NEW;
ewin->state = (Mode.wm.startup) ? EWIN_STATE_STARTUP : EWIN_STATE_NEW;
ewin->x = -1;
ewin->y = -1;
ewin->w = -1;

View File

@ -121,27 +121,53 @@ SignalHandler(int sig)
EDBUG_RETURN_;
}
static void
doSignalsSetup(int setup)
{
static const int signals[] = {
SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGPIPE,
SIGALRM, SIGTERM, SIGUSR1, SIGUSR2, SIGCHLD, SIGBUS
};
unsigned int i, sig;
struct sigaction sa;
/*
* We may be here after a fork/exec within in a signal handler.
* Therefore, lets just clear the blocked signals.
*/
sigemptyset(&sa.sa_mask);
sigprocmask(SIG_SETMASK, &sa.sa_mask, (sigset_t *) NULL);
for (i = 0; i < sizeof(signals) / sizeof(int); i++)
{
sig = signals[i];
if (Mode.wm.coredump &&
(sig == SIGILL || sig == SIGFPE || sig == SIGSEGV || sig == SIGBUS))
continue;
if (setup)
{
sa.sa_handler = SignalHandler;
sa.sa_flags = (sig == SIGCHLD) ? SA_RESTART : 0;
}
else
{
sa.sa_handler = SIG_DFL;
sa.sa_flags = 0;
}
sigemptyset(&sa.sa_mask);
sigaction(sig, &sa, (struct sigaction *)0);
}
}
void
SignalsSetup(void)
{
/* This function will set up all the signal handlers for E */
static const int signals[] = {
SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV, SIGPIPE,
SIGALRM, SIGTERM, SIGUSR1, SIGUSR2, SIGCHLD, SIGBUS
};
unsigned int i;
struct sigaction sa;
EDBUG(6, "SignalsSetup");
for (i = 0; i < sizeof(signals) / sizeof(int); i++)
{
sa.sa_handler = SignalHandler;
sa.sa_flags = (signals[i] == SIGCHLD) ? SA_RESTART : 0;
sigemptyset(&sa.sa_mask);
sigaction(signals[i], &sa, (struct sigaction *)0);
}
doSignalsSetup(1);
EDBUG_RETURN_;
}
@ -153,6 +179,7 @@ SignalsRestore(void)
EDBUG(6, "SignalsRestore");
#if 0
signal(SIGHUP, SIG_DFL);
signal(SIGINT, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
@ -170,6 +197,9 @@ SignalsRestore(void)
signal(SIGTSTP, SIG_DFL);
#endif
signal(SIGBUS, SIG_IGN);
#else
doSignalsSetup(0);
#endif
EDBUG_RETURN_;
}
@ -183,7 +213,7 @@ EHandleXError(Display * d, XErrorEvent * ev)
if ((ev->request_code == X_ChangeWindowAttributes)
&& (ev->error_code == BadAccess))
{
if ((!no_overwrite) && (Mode.xselect))
if ((!no_overwrite) && (Mode.wm.xselect))
{
AlertX(_("Another Window Manager is already running"),
_("OK (edit file)"), "", _("Cancel (do NOT edit)"),

View File

@ -1173,39 +1173,35 @@ ICCCM_GetEInfo(EWin * ewin)
num = (int)lnum;
if ((num >= 8) && (c))
{
if (Mode.startup)
ewin->desktop = c[0];
ewin->sticky = c[1];
ewin->client.x = c[2];
ewin->client.y = c[3];
ewin->iconified = c[4];
ewin->shaded = c[5];
if (ewin->sticky)
ewin->desktop = -1;
if (ewin->iconified)
{
ewin->desktop = c[0];
ewin->sticky = c[1];
ewin->client.x = c[2];
ewin->client.y = c[3];
ewin->iconified = c[4];
ewin->shaded = c[5];
if (ewin->sticky)
ewin->desktop = -1;
if (ewin->iconified)
{
ewin->client.start_iconified = 1;
ewin->iconified = 0;
}
ewin->client.already_placed = 1;
if (num >= 9)
{
ewin->client.w = c[6];
ewin->client.h = c[7];
}
XFree(c);
puc = NULL;
XGetWindowProperty(disp, ewin->client.win, aa, 0, 0xffff, True,
XA_STRING, &a2, &dummy, &lnum, &ldummy, &puc);
str = (char *)puc;
num = (int)lnum;
if ((num > 0) && (str))
EwinSetBorderByName(ewin, str, 0);
XFree(str);
ewin->client.start_iconified = 1;
ewin->iconified = 0;
}
EDBUG_RETURN(1);
ewin->client.already_placed = 1;
if (num >= 9)
{
ewin->client.w = c[6];
ewin->client.h = c[7];
}
XFree(c);
puc = NULL;
XGetWindowProperty(disp, ewin->client.win, aa, 0, 0xffff, True,
XA_STRING, &a2, &dummy, &lnum, &ldummy, &puc);
str = (char *)puc;
num = (int)lnum;
if ((num > 0) && (str))
EwinSetBorderByName(ewin, str, 0);
XFree(str);
}
EDBUG_RETURN(0);
}

View File

@ -40,8 +40,9 @@ IB_Animate(char iconify, EWin * from, EWin * to)
GC gc;
XGCValues gcv;
if (Mode.startup)
if (Mode.wm.startup)
return;
GrabX();
spd = 0.00001;
gcv.subwindow_mode = IncludeInferiors;

View File

@ -64,7 +64,7 @@ main(int argc, char **argv)
/* Init state variable struct */
memset(&Mode, 0, sizeof(EMode));
Mode.mode = MODE_NONE;
Mode.startup = 1;
Mode.wm.startup = 1;
/* unsetenv("LD_PRELOAD"); */
@ -77,6 +77,9 @@ main(int argc, char **argv)
str = getenv("EDBUG_FLAGS");
if (str)
EventDebugInit(str);
str = getenv("EDBUG_COREDUMP");
if (str)
Mode.wm.coredump = 1;
EDBUG(1, "main");
@ -313,8 +316,8 @@ main(int argc, char **argv)
ec->inroot = 1;
}
Mode.startup = 0;
Mode.save_ok = Mode.wm.master;
Mode.wm.startup = 0;
Mode.wm.save_ok = Mode.wm.master;
/* ok - paranoia - save current settings to disk */
if (VRoot.scr == 0)
autosave();
@ -368,9 +371,9 @@ main(int argc, char **argv)
if (Mode.firsttime)
runDocBrowser();
Mode.startup = 1;
Mode.wm.startup = 1;
SpawnSnappedCmds();
Mode.startup = 0;
Mode.wm.startup = 0;
ThemeBadDialog();

View File

@ -212,7 +212,7 @@ SaveWindowStates(void)
FILE *f;
char s[4096], ss[4096];
if (!Mode.save_ok)
if (!Mode.wm.save_ok)
return;
Etmp(s);
@ -426,7 +426,7 @@ MatchEwinToSM(EWin * ewin)
void
autosave(void)
{
if (!Mode.save_ok)
if (!Mode.wm.save_ok)
return;
if (Conf.autosave)
@ -919,9 +919,8 @@ SetSMID(const char *smid)
#endif /* HAVE_X11_SM_SMLIB_H */
}
static void doSMExit(const void *params);
static void
LogoutCB(int val, void *data)
LogoutCB(int val __UNUSED__, void *data __UNUSED__)
{
#ifdef HAVE_X11_SM_SMLIB_H
if (sm_conn)
@ -932,11 +931,8 @@ LogoutCB(int val, void *data)
else
#endif /* HAVE_X11_SM_SMLIB_H */
{
doSMExit(NULL);
SessionExit(NULL);
}
return;
val = 0;
data = NULL;
}
void
@ -988,6 +984,10 @@ doSMExit(const void *params)
SaveSession(1);
if ((disp) && ((!params) || ((params) && strcmp((char *)params, "logout"))))
SetEInfoOnAll();
if (disp)
XSelectInput(disp, VRoot.win, 0);
if ((!params) || (!strcmp((char *)s, "exit")))
{
callback_die(sm_conn, NULL);
@ -1231,6 +1231,13 @@ doSMExit(const void *params)
int
SessionExit(const void *param)
{
if (Mode.wm.exiting++)
{
/* This may be possible during nested signal handling */
Eprintf("SessionExit already in progress ... now exiting\n");
exit(1);
}
doSMExit(param);
return 0;
}

View File

@ -278,7 +278,7 @@ SetupX(void)
XSetIOErrorHandler((XIOErrorHandler) HandleXIOError);
/* select all the root window events to start managing */
Mode.xselect = 1;
Mode.wm.xselect = 1;
XSelectInput(disp, VRoot.win,
ButtonPressMask | ButtonReleaseMask | EnterWindowMask |
LeaveWindowMask | ButtonMotionMask | PropertyChangeMask |
@ -286,7 +286,7 @@ SetupX(void)
PointerMotionMask | ResizeRedirectMask |
SubstructureNotifyMask);
XSync(disp, False);
Mode.xselect = 0;
Mode.wm.xselect = 0;
/* warn, if necessary about X version problems */
if (ProtocolVersion(disp) != 11)

View File

@ -871,7 +871,7 @@ Real_SaveSnapInfo(int dumval __UNUSED__, void *dumdat __UNUSED__)
char buf[4096], s[4096];
FILE *f;
if (!Mode.save_ok)
if (!Mode.wm.save_ok)
return;
Etmp(s);