summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/common-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs/src/common-utils.c')
-rw-r--r--libglusterfs/src/common-utils.c89
1 files changed, 18 insertions, 71 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c
index 6ba5223da0b..124b312f4a1 100644
--- a/libglusterfs/src/common-utils.c
+++ b/libglusterfs/src/common-utils.c
@@ -15,6 +15,8 @@
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
+#else
+#include "execinfo_compat.h"
#endif
#include <stdio.h>
@@ -33,7 +35,7 @@
#include <signal.h>
#include <assert.h>
-#if defined GF_BSD_HOST_OS || defined GF_DARWIN_HOST_OS
+#if defined(GF_BSD_HOST_OS) || defined(GF_DARWIN_HOST_OS)
#include <sys/sysctl.h>
#endif
@@ -531,11 +533,9 @@ gf_print_trace (int32_t signum, glusterfs_ctx_t *ctx)
}
gf_dump_config_flags ();
-#if HAVE_BACKTRACE
gf_msg_backtrace_nomem (GF_LOG_ALERT, 200);
sprintf (msg, "---------");
gf_msg_plain_nomem (GF_LOG_ALERT, msg);
-#endif /* HAVE_BACKTRACE */
/* Send a signal to terminate the process */
signal (signum, SIG_DFL);
@@ -3062,82 +3062,29 @@ gf_set_log_ident (cmd_args_t *cmd_args)
int
gf_thread_create (pthread_t *thread, const pthread_attr_t *attr,
- void *(*start_routine)(void *), void *arg)
-{
- sigset_t set, old;
- int ret;
-
- sigemptyset (&set);
-
- sigfillset (&set);
- sigdelset (&set, SIGSEGV);
- sigdelset (&set, SIGBUS);
- sigdelset (&set, SIGILL);
- sigdelset (&set, SIGSYS);
- sigdelset (&set, SIGFPE);
- sigdelset (&set, SIGABRT);
-
- pthread_sigmask (SIG_BLOCK, &set, &old);
-
- ret = pthread_create (thread, attr, start_routine, arg);
-
- pthread_sigmask (SIG_SETMASK, &old, NULL);
-
- return ret;
-}
-
-#ifdef __NetBSD__
-#ifdef __MACHINE_STACK_GROWS_UP
-#define BELOW >
-#else
-#define BELOW <
-#endif
-
-struct frameinfo {
- struct frameinfo *next;
- void *return_address;
-};
-
-size_t
-backtrace(void **trace, size_t len)
+ void *(*start_routine)(void *), void *arg)
{
- const struct frameinfo *frame = __builtin_frame_address(0);
- void *stack = &stack;
- size_t i;
+ sigset_t set, old;
+ int ret;
- for (i = 0; i < len; i++) {
- if ((void *)frame BELOW stack)
- return i;
- trace[i] = frame->return_address;
- frame = frame->next;
- }
+ sigemptyset (&set);
- return len;
-}
+ sigfillset (&set);
+ sigdelset (&set, SIGSEGV);
+ sigdelset (&set, SIGBUS);
+ sigdelset (&set, SIGILL);
+ sigdelset (&set, SIGSYS);
+ sigdelset (&set, SIGFPE);
+ sigdelset (&set, SIGABRT);
-char **
-backtrace_symbols(void *const *trace, size_t len)
-{
- static const size_t slen = sizeof("0x123456789abcdef");
- char **ptr = calloc(len, sizeof(*ptr) + slen);
- size_t i;
+ pthread_sigmask (SIG_BLOCK, &set, &old);
- if (ptr == NULL)
- return NULL;
+ ret = pthread_create (thread, attr, start_routine, arg);
- char *str = (void *)(ptr + len);
- size_t cur = 0, left = len * slen;
+ pthread_sigmask (SIG_SETMASK, &old, NULL);
- for (i = 0; i < len; i++) {
- ptr[i] = str + cur;
- cur += snprintf(str + cur, left - cur, "%p", trace[i]) + 1;
- assert(cur < left);
- }
-
- return ptr;
+ return ret;
}
-#undef BELOW
-#endif /* __NetBSD__ */
int
gf_skip_header_section (int fd, int header_len)