From: Stephen D. <sd...@us...> - 2005-08-02 03:51:32
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7362/nsd Modified Files: log.c unix.c Log Message: * include/ns.h: * nsd/log.c: Make Tcl send panic messages to the server log. Add some CONST declarations and GCC attributes. * nsd/unix.c: Call Tcl Panic directly from fatal signal handler. Remove unneeded call to pthread_kill_other_threads_np. Index: unix.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/unix.c,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** unix.c 11 Jun 2005 18:40:32 -0000 1.9 --- unix.c 2 Aug 2005 03:51:23 -0000 1.10 *************** *** 46,50 **** static int Pipe(int *fds, int sockpair); ! static void FatalSignalHandler(int signal); /* --- 46,50 ---- static int Pipe(int *fds, int sockpair); ! static void Abort(int signal); /* *************** *** 104,112 **** */ ! ns_signal(SIGILL, FatalSignalHandler); ! ns_signal(SIGTRAP, FatalSignalHandler); ! ns_signal(SIGBUS, FatalSignalHandler); ! ns_signal(SIGSEGV, FatalSignalHandler); ! ns_signal(SIGFPE, FatalSignalHandler); } --- 104,112 ---- */ ! ns_signal(SIGILL, Abort); ! ns_signal(SIGTRAP, Abort); ! ns_signal(SIGBUS, Abort); ! ns_signal(SIGSEGV, Abort); ! ns_signal(SIGFPE, Abort); } *************** *** 625,629 **** *---------------------------------------------------------------------- * ! * FatalSignalHandler -- * * Ensure that we drop core on fatal signals like SIGBUS and --- 625,629 ---- *---------------------------------------------------------------------- * ! * Abort -- * * Ensure that we drop core on fatal signals like SIGBUS and *************** *** 640,655 **** static void ! FatalSignalHandler(int signal) { ! #ifdef __linux ! /* ! * LinuxThreads thread manager needs to kill all child threads ! * on fatal signals, else they get left behind as dead threads. ! * As of glibc 2.3 with NPTL, this should be a no-op. ! */ ! pthread_kill_other_threads_np(); ! #endif ! ! Ns_Log(Fatal, "received fatal signal %d", signal); ! abort(); } --- 640,645 ---- static void ! Abort(int signal) { ! Tcl_Panic("received fatal signal %d", signal); } Index: log.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/log.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** log.c 2 Aug 2005 00:29:20 -0000 1.4 --- log.c 2 Aug 2005 03:51:22 -0000 1.5 *************** *** 58,62 **** */ ! static void Log(Ns_LogSeverity severity, char *fmt, va_list ap); static int LogStart(LogCache *cachePtr, Ns_LogSeverity severity); static void LogEnd(LogCache *cachePtr); --- 58,62 ---- */ ! static void Log(Ns_LogSeverity severity, CONST char *fmt, va_list ap); static int LogStart(LogCache *cachePtr, Ns_LogSeverity severity); static void LogEnd(LogCache *cachePtr); *************** *** 66,69 **** --- 66,70 ---- static LogCache *LogGetCache(void); static Ns_TlsCleanup LogFreeCache; + static Tcl_PanicProc Panic; /* *************** *** 98,101 **** --- 99,103 ---- Ns_MutexSetName(&lock, "ns:log"); Ns_TlsAlloc(&tls, LogFreeCache); + Tcl_SetPanicProc(Panic); } *************** *** 174,178 **** void ! Ns_Log(Ns_LogSeverity severity, char *fmt, ...) { va_list ap; --- 176,180 ---- void ! Ns_Log(Ns_LogSeverity severity, CONST char *fmt, ...) { va_list ap; *************** *** 196,200 **** * * Side effects: ! * WILL CAUSE THE SERVER TO EXIT! * *---------------------------------------------------------------------- --- 198,202 ---- * * Side effects: ! * The process will exit. * *---------------------------------------------------------------------- *************** *** 202,206 **** void ! Ns_Fatal(char *fmt, ...) { va_list ap; --- 204,208 ---- void ! Ns_Fatal(CONST char *fmt, ...) { va_list ap; *************** *** 532,536 **** static void ! Log(Ns_LogSeverity severity, char *fmt, va_list ap) { LogCache *cachePtr; --- 534,538 ---- static void ! Log(Ns_LogSeverity severity, CONST char *fmt, va_list ap) { LogCache *cachePtr; *************** *** 888,889 **** --- 890,921 ---- ns_free(cachePtr); } + + + /* + *---------------------------------------------------------------------- + * + * Panic -- + * + * Tcl_PanicProc callback which sends a message to the server log + * with severity level Fatal, and then kills the process immediately. + * + * Results: + * None. + * + * Side effects: + * The process dies, possibly entering the debugger. + * + *---------------------------------------------------------------------- + */ + + static void + Panic(CONST char *fmt, ...) + { + va_list ap; + + va_start(ap, fmt); + Log(Fatal, fmt, ap); + va_end(ap); + + abort(); + } |