From 5d2439657f7f81f1dcdc45e960c91ce4196ae118 Mon Sep 17 00:00:00 2001 From: Emmanuel Dreyfus Date: Sun, 17 Nov 2013 15:05:42 +0100 Subject: NetBSD missing backtrace(3) portability fix Implement backtrace(3) and backtrace_symbols(3) which do not exist in NetBSD While there, remove duplicate #include BUG: 764655 Change-Id: Iccd695765906e085c3f8fcb670506d4fea68fa39 Signed-off-by: Emmanuel Dreyfus Reviewed-on: http://review.gluster.org/6285 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- libglusterfs/src/common-utils.c | 55 +++++++++++++++++++++++++++++- libglusterfs/src/common-utils.h | 4 +++ xlators/features/protect/src/prot_client.c | 2 ++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 827475282..2b700af4e 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -31,7 +31,7 @@ #include #include #include -#include +#include #if defined GF_BSD_HOST_OS || defined GF_DARWIN_HOST_OS #include @@ -2906,3 +2906,56 @@ gf_thread_create (pthread_t *thread, const pthread_attr_t *attr, 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) +{ + const struct frameinfo *frame = __builtin_frame_address(0); + void *stack = &stack; + size_t i; + + for (i = 0; i < len; i++) { + if ((void *)frame BELOW stack) + return i; + trace[i] = frame->return_address; + frame = frame->next; + } + + return len; +} + +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; + + if (ptr == NULL) + return NULL; + + char *str = (void *)(ptr + len); + size_t cur = 0, left = len * slen; + + 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; +} +#undef BELOW +#endif /* __NetBSD__ */ diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index 3c99a4212..e762a86ea 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -590,5 +590,9 @@ void md5_wrapper(const unsigned char *data, size_t len, char *md5); int gf_thread_create (pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); +#ifdef __NetBSD__ +size_t backtrace(void **, size_t); +char **backtrace_symbols(void *const *, size_t); +#endif #endif /* _COMMON_UTILS_H */ diff --git a/xlators/features/protect/src/prot_client.c b/xlators/features/protect/src/prot_client.c index a27216d0a..d09715067 100644 --- a/xlators/features/protect/src/prot_client.c +++ b/xlators/features/protect/src/prot_client.c @@ -15,7 +15,9 @@ #include "xlator.h" #include "defaults.h" +#ifndef __NetBSD__ #include +#endif #define NUM_FRAMES 20 -- cgit