X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fsignalhandler.cc;h=a7aef8b99d294b234c4f5ec74cc054edb28f6124;hb=8e98eb2a5a68fe9d5b710e7ef176126cd8e395ef;hp=8d9ab4b8574c5b35c87825b62d22f1bed7e87238;hpb=8c4e3a9238a433b709c2fe172bc29d80c4f275b3;p=platform%2Fupstream%2Fglog.git diff --git a/src/signalhandler.cc b/src/signalhandler.cc index 8d9ab4b..a7aef8b 100644 --- a/src/signalhandler.cc +++ b/src/signalhandler.cc @@ -41,10 +41,16 @@ #ifdef HAVE_UCONTEXT_H # include #endif +#ifdef HAVE_SYS_UCONTEXT_H +# include +#endif #include _START_GOOGLE_NAMESPACE_ +// TOOD(hamaji): Use signal instead of sigaction? +#ifdef HAVE_SIGACTION + namespace { // We'll install the failure signal handler for these signals. We could @@ -66,7 +72,7 @@ const struct { // Returns the program counter from signal context, NULL if unknown. void* GetPC(void* ucontext_in_void) { -#if defined(HAVE_UCONTEXT_H) && defined(PC_FROM_UCONTEXT) +#if (defined(HAVE_UCONTEXT_H) || defined(HAVE_SYS_UCONTEXT_H)) && defined(PC_FROM_UCONTEXT) if (ucontext_in_void != NULL) { ucontext_t *context = reinterpret_cast(ucontext_in_void); return (void*)context->PC_FROM_UCONTEXT; @@ -139,7 +145,9 @@ class MinimalFormatter { // Writes the given data with the size to the standard error. void WriteToStderr(const char* data, int size) { - write(STDERR_FILENO, data, size); + if (write(STDERR_FILENO, data, size) < 0) { + // Ignore errors. + } } // The writer function can be changed by InstallFailureWriter(). @@ -164,7 +172,7 @@ void DumpTimeInfo() { void DumpSignalInfo(int signal_number, siginfo_t *siginfo) { // Get the signal name. const char* signal_name = NULL; - for (int i = 0; i < ARRAYSIZE(kFailureSignals); ++i) { + for (size_t i = 0; i < ARRAYSIZE(kFailureSignals); ++i) { if (signal_number == kFailureSignals[i].number) { signal_name = kFailureSignals[i].name; } @@ -325,7 +333,26 @@ void FailureSignalHandler(int signal_number, } // namespace +#endif // HAVE_SIGACTION + +namespace glog_internal_namespace_ { + +bool IsFailureSignalHandlerInstalled() { +#ifdef HAVE_SIGACTION + struct sigaction sig_action; + memset(&sig_action, 0, sizeof(sig_action)); + sigemptyset(&sig_action.sa_mask); + sigaction(SIGABRT, NULL, &sig_action); + if (sig_action.sa_sigaction == &FailureSignalHandler) + return true; +#endif // HAVE_SIGACTION + return false; +} + +} // namespace glog_internal_namespace_ + void InstallFailureSignalHandler() { +#ifdef HAVE_SIGACTION // Build the sigaction struct. struct sigaction sig_action; memset(&sig_action, 0, sizeof(sig_action)); @@ -333,13 +360,16 @@ void InstallFailureSignalHandler() { sig_action.sa_flags |= SA_SIGINFO; sig_action.sa_sigaction = &FailureSignalHandler; - for (int i = 0; i < ARRAYSIZE(kFailureSignals); ++i) { + for (size_t i = 0; i < ARRAYSIZE(kFailureSignals); ++i) { CHECK_ERR(sigaction(kFailureSignals[i].number, &sig_action, NULL)); } +#endif // HAVE_SIGACTION } void InstallFailureWriter(void (*writer)(const char* data, int size)) { +#ifdef HAVE_SIGACTION g_failure_writer = writer; +#endif // HAVE_SIGACTION } _END_GOOGLE_NAMESPACE_