pandora-build v0.75. Also fixed visibility which had accidentally been turned off.
[awesomized/libmemcached] / clients / ms_sigsegv.c
index a37914ebaaf3ede4dd38451f522c8d40011c95a7..2cdd3017d8ec49c272ca019e59437943cbe1adce 100644 (file)
@@ -8,6 +8,9 @@
  * http://www.schoonerinfotech.com/
  *
  */
+
+#include "config.h"
+
 #include <memory.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include "ms_memslap.h"
 #include "ms_setting.h"
 
-#define NO_CPP_DEMANGLE
-#ifndef NO_CPP_DEMANGLE
-#include <cxxabi.h>
+#if defined(__cplusplus) && defined(HAVE_ABI_CXA_DEMANGLE)
+# include <cxxabi.h>
 #endif
 
 #undef REG_RIP
 
 #if defined(REG_RIP)
-    #define SIGSEGV_STACK_IA64
-    #define REGFORMAT "%016lx"
+define SIGSEGV_STACK_IA64
+# define REGFORMAT    "%016lx"
 #elif defined(REG_EIP)
-    #define SIGSEGV_STACK_X86
-    #define REGFORMAT "%08x"
+define SIGSEGV_STACK_X86
+# define REGFORMAT    "%08x"
 #else
-    #define SIGSEGV_STACK_GENERIC
-    #define REGFORMAT "%x"
+define SIGSEGV_STACK_GENERIC
+# define REGFORMAT    "%x"
 #endif
 
 /* prototypes */
@@ -43,127 +45,140 @@ int ms_setup_sigsegv(void);
 int ms_setup_sigpipe(void);
 int ms_setup_sigint(void);
 
+
 /* signal seg reaches, this function will run */
-static void ms_signal_segv(int signum, siginfo_t * info, void * ptr) {
-    int i;
+static void ms_signal_segv(int signum, siginfo_t *info, void *ptr)
+{
+  int i;
 
-    UNUSED_ARGUMENT(signum);
-    UNUSED_ARGUMENT(info);
-    UNUSED_ARGUMENT(ptr);
+  UNUSED_ARGUMENT(signum);
+  UNUSED_ARGUMENT(info);
+  UNUSED_ARGUMENT(ptr);
 
-    pthread_mutex_lock(&ms_global.quit_mutex);
-    fprintf(stderr, "Segmentation fault occurred.\n");
+  pthread_mutex_lock(&ms_global.quit_mutex);
+  fprintf(stderr, "Segmentation fault occurred.\n");
 
 #if defined(SIGSEGV_STACK_X86) || defined(SIGSEGV_STACK_IA64)
-    int f = 0;
-    Dl_info dlinfo;
-    void **bp = 0;
-    void *ip = 0;
+  int f= 0;
+  Dl_info dlinfo;
+  void **bp= 0;
+  void *ip= 0;
 #else
-    void *bt[20];
-    char **strings;
-    int sz;
+  void *bt[20];
+  char **strings;
+  int  sz;
 #endif
 
 #if defined(SIGSEGV_STACK_X86) || defined(SIGSEGV_STACK_IA64)
-#if defined(SIGSEGV_STACK_IA64)
-    ip = (void*)ucontext->uc_mcontext.gregs[REG_RIP];
-    bp = (void**)ucontext->uc_mcontext.gregs[REG_RBP];
-#elif defined(SIGSEGV_STACK_X86)
-    ip = (void*)ucontext->uc_mcontext.gregs[REG_EIP];
-    bp = (void**)ucontext->uc_mcontext.gregs[REG_EBP];
-#endif
-
-    fprintf(stderr, "Stack trace:\n");
-    while(bp && ip) {
-        if(!dladdr(ip, &dlinfo))
-          break;
-
-        const char *symname = dlinfo.dli_sname;
-#ifndef NO_CPP_DEMANGLE
-        int status;
-        char *tmp = __cxa_demangle(symname, NULL, 0, &status);
-
-        if(status == 0 && tmp)
-          symname = tmp;
-#endif
-
-        fprintf(stderr, "% 2d: %p <%s+%u> (%s)\n",
-                ++f,
-                ip,
-                symname,
-                (unsigned)(ip - dlinfo.dli_saddr),
-                dlinfo.dli_fname);
-
-#ifndef NO_CPP_DEMANGLE
-        if(tmp)
-          free(tmp);
-#endif
-
-        if(dlinfo.dli_sname && !strcmp(dlinfo.dli_sname, "main"))
-          break;
-
-        ip = bp[1];
-        bp = (void**)bp[0];
-    }
+# if defined(SIGSEGV_STACK_IA64)
+  ip= (void *)ucontext->uc_mcontext.gregs[REG_RIP];
+  bp= (void **)ucontext->uc_mcontext.gregs[REG_RBP];
+# elif defined(SIGSEGV_STACK_X86)
+  ip= (void *)ucontext->uc_mcontext.gregs[REG_EIP];
+  bp= (void **)ucontext->uc_mcontext.gregs[REG_EBP];
+# endif
+
+  fprintf(stderr, "Stack trace:\n");
+  while (bp && ip)
+  {
+    if (! dladdr(ip, &dlinfo))
+      break;
+
+    const char *symname= dlinfo.dli_sname;
+# if defined(HAVE_ABI_CXA_DEMANGLE) && defined(__cplusplus)
+    int status;
+    char *tmp= __cxa_demangle(symname, NULL, 0, &status);
+
+    if ((status == 0) && tmp)
+      symname= tmp;
+# endif
+
+    fprintf(stderr, "% 2d: %p <%s+%u> (%s)\n",
+            ++f,
+            ip,
+            symname,
+            (unsigned)(ip - dlinfo.dli_saddr),
+            dlinfo.dli_fname);
+
+# if defined(HAVE_ABI_CXA_DEMANGLE) && defined(__cplusplus)
+    if (tmp)
+      free(tmp);
+# endif
+
+    if (dlinfo.dli_sname && ! strcmp(dlinfo.dli_sname, "main"))
+      break;
+
+    ip= bp[1];
+    bp= (void **)bp[0];
+  }
 #else
-    fprintf(stderr, "Stack trace:\n");
-    sz = backtrace(bt, 20);
-    strings = backtrace_symbols(bt, sz);
-
-    for(i = 0; i < sz; ++i)
-        fprintf(stderr, "%s\n", strings[i]);
+  fprintf(stderr, "Stack trace:\n");
+  sz= backtrace(bt, 20);
+  strings= backtrace_symbols(bt, sz);
+
+  for (i= 0; i < sz; ++i)
+  {
+    fprintf(stderr, "%s\n", strings[i]);
+  }
 #endif
-    fprintf(stderr, "End of stack trace\n");
-    pthread_mutex_unlock(&ms_global.quit_mutex);
-    exit (1);
-}
+  fprintf(stderr, "End of stack trace\n");
+  pthread_mutex_unlock(&ms_global.quit_mutex);
+  exit(1);
+} /* ms_signal_segv */
+
 
 /* signal pipe reaches, this function will run */
-static void ms_signal_pipe(int signum, siginfo_t* info, void*ptr)
+static void ms_signal_pipe(int signum, siginfo_t *info, void *ptr)
 {
-    UNUSED_ARGUMENT(signum);
-    UNUSED_ARGUMENT(info);
-    UNUSED_ARGUMENT(ptr);
-
-    pthread_mutex_lock(&ms_global.quit_mutex);
-    fprintf(stderr, "\tMemslap encountered a server error. Quitting...\n");
-    fprintf(stderr, "\tError info: SIGPIPE captured (from write?)\n");
-    fprintf(stderr, "\tProbably a socket I/O error when the server is down.\n");
-    pthread_mutex_unlock(&ms_global.quit_mutex);
-    exit(1);
-}
+  UNUSED_ARGUMENT(signum);
+  UNUSED_ARGUMENT(info);
+  UNUSED_ARGUMENT(ptr);
+
+  pthread_mutex_lock(&ms_global.quit_mutex);
+  fprintf(stderr, "\tMemslap encountered a server error. Quitting...\n");
+  fprintf(stderr, "\tError info: SIGPIPE captured (from write?)\n");
+  fprintf(stderr,
+          "\tProbably a socket I/O error when the server is down.\n");
+  pthread_mutex_unlock(&ms_global.quit_mutex);
+  exit(1);
+} /* ms_signal_pipe */
+
 
 /* signal int reaches, this function will run */
-static void ms_signal_int(int signum, siginfo_t* info, void*ptr)
+static void ms_signal_int(int signum, siginfo_t *info, void *ptr)
 {
-    UNUSED_ARGUMENT(signum);
-    UNUSED_ARGUMENT(info);
-    UNUSED_ARGUMENT(ptr);
-
-    pthread_mutex_lock(&ms_global.quit_mutex);
-    fprintf(stderr, "SIGINT handled.\n");
-    pthread_mutex_unlock(&ms_global.quit_mutex);
-    exit(1);
-}
+  UNUSED_ARGUMENT(signum);
+  UNUSED_ARGUMENT(info);
+  UNUSED_ARGUMENT(ptr);
+
+  pthread_mutex_lock(&ms_global.quit_mutex);
+  fprintf(stderr, "SIGINT handled.\n");
+  pthread_mutex_unlock(&ms_global.quit_mutex);
+  exit(1);
+} /* ms_signal_int */
+
 
 /**
  * redirect signal seg
  *
  * @return if success, return 0, else return -1
  */
-int ms_setup_sigsegv(void) {
-    struct sigaction action;
-    memset(&action, 0, sizeof(action));
-    action.sa_sigaction = ms_signal_segv;
-    action.sa_flags = SA_SIGINFO;
-    if(sigaction(SIGSEGV, &action, NULL) < 0) {
-        perror("sigaction");
-        return 0;
-    }
-
-    return -1;
-}
+int ms_setup_sigsegv(void)
+{
+  struct sigaction action;
+
+  memset(&action, 0, sizeof(action));
+  action.sa_sigaction= ms_signal_segv;
+  action.sa_flags= SA_SIGINFO;
+  if (sigaction(SIGSEGV, &action, NULL) < 0)
+  {
+    perror("sigaction");
+    return 0;
+  }
+
+  return -1;
+} /* ms_setup_sigsegv */
+
 
 /**
  * redirect signal pipe
@@ -172,17 +187,20 @@ int ms_setup_sigsegv(void) {
  */
 int ms_setup_sigpipe(void)
 {
-    struct sigaction action_2;
-    memset(&action_2, 0, sizeof(action_2));
-    action_2.sa_sigaction = ms_signal_pipe;
-    action_2.sa_flags = SA_SIGINFO;
-    if(sigaction(SIGPIPE, &action_2, NULL) < 0) {
-        perror("sigaction");
-        return 0;
-    }
-
-    return -1;
-}
+  struct sigaction action_2;
+
+  memset(&action_2, 0, sizeof(action_2));
+  action_2.sa_sigaction= ms_signal_pipe;
+  action_2.sa_flags= SA_SIGINFO;
+  if (sigaction(SIGPIPE, &action_2, NULL) < 0)
+  {
+    perror("sigaction");
+    return 0;
+  }
+
+  return -1;
+} /* ms_setup_sigpipe */
+
 
 /**
  * redirect signal int
@@ -191,22 +209,26 @@ int ms_setup_sigpipe(void)
  */
 int ms_setup_sigint(void)
 {
-    struct sigaction action_3;
-    memset(&action_3, 0, sizeof(action_3));
-    action_3.sa_sigaction = ms_signal_int;
-    action_3.sa_flags = SA_SIGINFO;
-    if(sigaction(SIGINT, &action_3, NULL) < 0) {
-        perror("sigaction");
-        return 0;
-    }
-
-    return -1;
-}
+  struct sigaction action_3;
+
+  memset(&action_3, 0, sizeof(action_3));
+  action_3.sa_sigaction= ms_signal_int;
+  action_3.sa_flags= SA_SIGINFO;
+  if (sigaction(SIGINT, &action_3, NULL) < 0)
+  {
+    perror("sigaction");
+    return 0;
+  }
+
+  return -1;
+} /* ms_setup_sigint */
+
 
 #ifndef SIGSEGV_NO_AUTO_INIT
-static void __attribute((constructor)) ms_init(void) {
-    ms_setup_sigsegv();
-    ms_setup_sigpipe();
-    ms_setup_sigint();
+static void __attribute((constructor)) ms_init(void)
+{
+  ms_setup_sigsegv();
+  ms_setup_sigpipe();
+  ms_setup_sigint();
 }
 #endif