Terminate the log with one last message.

Instead of just closing the log when everything is done, put one more
message in stating that we're actually terminating. Users or scripts that
look at the Xorg.log will then know that a) the server has terminated
properly and b) why the server terminated (to some degree, given that most
real-world errors will be caused by AbortServer()).

Acked-by: Gaetan Nadon <memsize@videotron.ca>
Reviewed-by: Daniel Stone <daniel@fooishbar.org>
Tested-by: Jeremy Huddleston <jeremyhu@apple.com>
Reviewed-by: Jeremy Huddleston <jeremyhu@apple.com>
Tested-by: Jon TURNEY <jon.turney@dronecode.org.uk>
Reviewed-by: Jon TURNEY <jon.turney@dronecode.org.uk>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2011-07-20 13:09:05 +10:00
parent 01de08c7d2
commit f51e42f583
16 changed files with 47 additions and 38 deletions

View File

@ -347,7 +347,7 @@ int main(int argc, char *argv[], char *envp[])
if (dispatchException & DE_TERMINATE)
{
ddxGiveUp();
ddxGiveUp(EXIT_NO_ERROR);
break;
}

View File

@ -4680,8 +4680,8 @@ An Example implementation is miPushPixels() in Xserver/mi/mipushpxl.c.</para>
<title>Shutdown Procedures</title>
<para>
<blockquote><programlisting>
void AbortDDX()
void ddxGiveUp()
void AbortDDX(enum ExitCode error)
void ddxGiveUp(enum ExitCode error)
</programlisting></blockquote>
Some hardware may require special work to be done before the server
exits so that it is not left in an intermediate state. As explained

View File

@ -821,7 +821,7 @@ static void dmxSetDefaultFontPath(char *fp)
/** This function is called in Xserver/os/utils.c from \a AbortServer().
* We must ensure that backend and console state is restored in the
* event the server shutdown wasn't clean. */
void AbortDDX(void)
void AbortDDX(enum ExitCode error)
{
int i;
@ -842,9 +842,9 @@ void ddxBeforeReset(void)
/** This function is called in Xserver/dix/main.c from \a main() when
* dispatchException & DE_TERMINATE (which is the only way to exit the
* main loop without an interruption. */
void ddxGiveUp(void)
void ddxGiveUp(enum ExitCode error)
{
AbortDDX();
AbortDDX(error);
}
/** This function is called in Xserver/os/osinit.c from \a OsInit(). */

View File

@ -232,7 +232,7 @@ KdProcessSwitch (void)
}
void
AbortDDX(void)
AbortDDX(enum ExitCode error)
{
KdDisableScreens ();
if (kdOsFuncs)
@ -249,9 +249,9 @@ AbortDDX(void)
}
void
ddxGiveUp (void)
ddxGiveUp (enum ExitCode error)
{
AbortDDX ();
AbortDDX (error);
}
Bool kdDumbDriver;

View File

@ -150,7 +150,7 @@ vfbBitsPerPixel(int depth)
}
void
ddxGiveUp(void)
ddxGiveUp(enum ExitCode error)
{
int i;
@ -201,9 +201,9 @@ ddxGiveUp(void)
}
void
AbortDDX(void)
AbortDDX(enum ExitCode error)
{
ddxGiveUp();
ddxGiveUp(error);
}
#ifdef __APPLE__

View File

@ -749,7 +749,7 @@ DoConfigure(void)
bail:
OsCleanup(TRUE);
AbortDDX();
AbortDDX(EXIT_ERR_CONFIGURE);
fflush(stderr);
exit(0);
}

View File

@ -1198,9 +1198,9 @@ xf86LogInit(void)
}
void
xf86CloseLog(void)
xf86CloseLog(enum ExitCode error)
{
LogClose();
LogClose(error);
}

View File

@ -902,7 +902,7 @@ OsVendorInit(void)
*/
void
ddxGiveUp(void)
ddxGiveUp(enum ExitCode error)
{
int i;
@ -929,7 +929,7 @@ ddxGiveUp(void)
if (xorgHWOpenConsole)
xf86CloseConsole();
xf86CloseLog();
xf86CloseLog(error);
/* If an unexpected signal was caught, dump a core for debugging */
if (xf86Info.caughtSignal)
@ -946,7 +946,7 @@ ddxGiveUp(void)
*/
void
AbortDDX(void)
AbortDDX(enum ExitCode error)
{
int i;
@ -979,7 +979,7 @@ AbortDDX(void)
* This is needed for an abnormal server exit, since the normal exit stuff
* MUST also be performed (i.e. the vt must be left in a defined state)
*/
ddxGiveUp();
ddxGiveUp(error);
}
void

View File

@ -140,7 +140,7 @@ extern _X_EXPORT pmWait (*xf86PMConfirmEventToOs)(int fd,pmEvent event);
/* xf86Helper.c */
extern _X_EXPORT void xf86LogInit(void);
extern _X_EXPORT void xf86CloseLog(void);
extern _X_EXPORT void xf86CloseLog(enum ExitCode error);
/* xf86Init.c */
extern _X_EXPORT Bool xf86LoadModules(char **list, pointer *optlist);

View File

@ -124,7 +124,7 @@ void DoShowOptions (void) {
}
bail:
OsCleanup (TRUE);
AbortDDX ();
AbortDDX (EXIT_ERR_DRIVERS);
fflush (stderr);
exit (0);
}

View File

@ -114,16 +114,16 @@ CloseInput(void)
/*
* DDX - specific abort routine. Called by AbortServer().
*/
void AbortDDX(void)
void AbortDDX(enum ExitCode error)
{
xnestDoFullGeneration = True;
xnestCloseDisplay();
}
/* Called by GiveUp(). */
void ddxGiveUp(void)
void ddxGiveUp(enum ExitCode error)
{
AbortDDX();
AbortDDX(error);
}
#ifdef __APPLE__

View File

@ -766,9 +766,9 @@ void ddxUseMsg( void )
* ddxGiveUp --
* Device dependent cleanup. Called by dix before normal server death.
*/
void ddxGiveUp( void )
void ddxGiveUp( enum ExitCode error )
{
ErrorF( "Quitting Xquartz\n" );
LogClose(error);
}
@ -779,7 +779,7 @@ void ddxGiveUp( void )
* are closed.
*/
_X_NORETURN
void AbortDDX( void ) {
void AbortDDX( enum ExitCode error ) {
ErrorF( " AbortDDX\n" );
OsAbort();
}

View File

@ -191,7 +191,7 @@ ddxBeforeReset (void)
/* See Porting Layer Definition - p. 57 */
void
ddxGiveUp (void)
ddxGiveUp (enum ExitCode error)
{
int i;
@ -228,7 +228,7 @@ ddxGiveUp (void)
g_pszLogFile = LogInit (g_pszLogFile, NULL);
g_fLogInited = TRUE;
}
LogClose ();
LogClose (error);
/*
* At this point we aren't creating any new screens, so
@ -258,12 +258,12 @@ ddxGiveUp (void)
/* See Porting Layer Definition - p. 57 */
void
AbortDDX (void)
AbortDDX (enum ExitCode error)
{
#if CYGDEBUG
winDebug ("AbortDDX\n");
#endif
ddxGiveUp ();
ddxGiveUp (error);
}
#ifdef __CYGWIN__
@ -901,7 +901,7 @@ ddxUseMsg(void)
g_pszLogFile = LogInit (g_pszLogFile, NULL);
g_fLogInited = TRUE;
}
LogClose ();
LogClose (EXIT_NO_ERROR);
/* Notify user where UseMsg text can be found.*/
if (!g_fNoHelpMessageBox)

View File

@ -81,7 +81,7 @@ OsVendorFatalError (void)
g_fLogInited = TRUE;
g_pszLogFile = LogInit (g_pszLogFile, NULL);
}
LogClose ();
LogClose (EXIT_ERR_ABORT);
winMessageBoxF (
"A fatal error has occurred and " PROJECT_NAME " will now exit.\n" \

View File

@ -459,8 +459,15 @@ typedef struct {
/* stuff for FlushCallback */
extern _X_EXPORT CallbackListPtr FlushCallback;
extern _X_EXPORT void AbortDDX(void);
extern _X_EXPORT void ddxGiveUp(void);
enum ExitCode {
EXIT_NO_ERROR = 0,
EXIT_ERR_ABORT = 1,
EXIT_ERR_CONFIGURE = 2,
EXIT_ERR_DRIVERS = 3,
};
extern _X_EXPORT void AbortDDX(enum ExitCode error);
extern _X_EXPORT void ddxGiveUp(enum ExitCode error);
extern _X_EXPORT int TimeSinceLastInputEvent(void);
/* strcasecmp.c */
@ -508,7 +515,7 @@ typedef enum {
} MessageType;
extern _X_EXPORT const char *LogInit(const char *fname, const char *backup);
extern _X_EXPORT void LogClose(void);
extern _X_EXPORT void LogClose(enum ExitCode error);
extern _X_EXPORT Bool LogSetParameter(LogParameter param, int value);
extern _X_EXPORT void LogVWrite(int verb, const char *f, va_list args) _X_ATTRIBUTE_PRINTF(2,0);
extern _X_EXPORT void LogWrite(int verb, const char *f, ...) _X_ATTRIBUTE_PRINTF(2,3);

View File

@ -231,9 +231,11 @@ LogInit(const char *fname, const char *backup)
}
void
LogClose(void)
LogClose(enum ExitCode error)
{
if (logFile) {
ErrorF("Server terminated %s (%d). Closing log file.\n",
(error == EXIT_NO_ERROR) ? "successfully" : "with error", error);
fclose(logFile);
logFile = NULL;
}
@ -411,7 +413,7 @@ AbortServer(void)
CloseWellKnownConnections();
OsCleanup(TRUE);
CloseDownDevices();
AbortDDX();
AbortDDX(EXIT_ERR_ABORT);
fflush(stderr);
if (CoreDump)
OsAbort();