Revert "Add support for libunwind backtrace caching."

This reverts commit adc675c8ef.

The original commit added support for a non-standard libunwind API, so
it was not of general utility.
This commit is contained in:
Jason Evans 2011-03-22 20:44:40 -07:00
parent 69c0472999
commit 9f949f9d82
3 changed files with 16 additions and 94 deletions

View File

@ -29,7 +29,7 @@ dnl JE_COMPILABLE(label, hcode, mcode, rvar)
AC_DEFUN([JE_COMPILABLE], AC_DEFUN([JE_COMPILABLE],
[ [
AC_MSG_CHECKING([whether $1 is compilable]) AC_MSG_CHECKING([whether $1 is compilable])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM( AC_RUN_IFELSE([AC_LANG_PROGRAM(
[$2], [$3])], [$2], [$3])],
AC_MSG_RESULT([yes]) AC_MSG_RESULT([yes])
[$4="yes"], [$4="yes"],
@ -454,17 +454,6 @@ if test "x$backtrace_method" = "x" -a "x$enable_prof_libunwind" = "x1" ; then
if test "x${enable_prof_libunwind}" = "x1" ; then if test "x${enable_prof_libunwind}" = "x1" ; then
backtrace_method="libunwind" backtrace_method="libunwind"
AC_DEFINE([JEMALLOC_PROF_LIBUNWIND], [ ]) AC_DEFINE([JEMALLOC_PROF_LIBUNWIND], [ ])
JE_COMPILABLE([libunwind frame cache], [
#define UNW_LOCAL_ONLY
#include <libunwind.h>
], [
unw_tdep_make_frame_cache(0, 0);
unw_tdep_free_frame_cache(0);
unw_tdep_trace(0, 0, 0, 0);
], [libunwind_cache])
if test "x${libunwind_cache}" = "xyes" ; then
AC_DEFINE([JEMALLOC_PROF_LIBUNWIND_CACHE], [ ])
fi
fi fi
fi fi

View File

@ -62,9 +62,6 @@
/* Use libunwind for profile backtracing if defined. */ /* Use libunwind for profile backtracing if defined. */
#undef JEMALLOC_PROF_LIBUNWIND #undef JEMALLOC_PROF_LIBUNWIND
/* Use libunwind's backtrace caching for profile backtracing if defined. */
#undef JEMALLOC_PROF_LIBUNWIND_CACHE
/* Use libgcc for profile backtracing if defined. */ /* Use libgcc for profile backtracing if defined. */
#undef JEMALLOC_PROF_LIBGCC #undef JEMALLOC_PROF_LIBGCC

View File

@ -44,12 +44,6 @@ pthread_key_t prof_tdata_tsd;
static ckh_t bt2ctx; static ckh_t bt2ctx;
static malloc_mutex_t bt2ctx_mtx; static malloc_mutex_t bt2ctx_mtx;
#ifdef JEMALLOC_PROF_LIBUNWIND_CACHE
static __thread unw_tdep_cache_t *libunwind_cache_tls
JEMALLOC_ATTR(tls_model("initial-exec"));
static pthread_key_t libunwind_cache_tsd;
#endif
static malloc_mutex_t prof_dump_seq_mtx; static malloc_mutex_t prof_dump_seq_mtx;
static uint64_t prof_dump_seq; static uint64_t prof_dump_seq;
static uint64_t prof_dump_iseq; static uint64_t prof_dump_iseq;
@ -101,9 +95,6 @@ static void prof_bt_hash(const void *key, unsigned minbits, size_t *hash1,
size_t *hash2); size_t *hash2);
static bool prof_bt_keycomp(const void *k1, const void *k2); static bool prof_bt_keycomp(const void *k1, const void *k2);
static void prof_tdata_cleanup(void *arg); static void prof_tdata_cleanup(void *arg);
#ifdef JEMALLOC_PROF_LIBUNWIND_CACHE
static void libunwind_cache_thread_cleanup(void *arg);
#endif
/******************************************************************************/ /******************************************************************************/
@ -186,11 +177,6 @@ prof_backtrace(prof_bt_t *bt, unsigned nignore, unsigned max)
unw_cursor_t cursor; unw_cursor_t cursor;
unsigned i; unsigned i;
int err; int err;
#ifdef JEMALLOC_PROF_LIBUNWIND_CACHE
unw_tdep_cache_t *cache;
int len = nignore + 1 + max;
void* vec[len];
#endif
assert(bt->len == 0); assert(bt->len == 0);
assert(bt->vec != NULL); assert(bt->vec != NULL);
@ -199,53 +185,24 @@ prof_backtrace(prof_bt_t *bt, unsigned nignore, unsigned max)
unw_getcontext(&uc); unw_getcontext(&uc);
unw_init_local(&cursor, &uc); unw_init_local(&cursor, &uc);
#ifdef JEMALLOC_PROF_LIBUNWIND_CACHE /* Throw away (nignore+1) stack frames, if that many exist. */
cache = libunwind_cache_tls; for (i = 0; i < nignore + 1; i++) {
if (cache == NULL) { err = unw_step(&cursor);
cache = unw_tdep_make_frame_cache(imalloc, idalloc); if (err <= 0)
if (cache != NULL) { return;
libunwind_cache_tls = cache;
pthread_setspecific(libunwind_cache_tsd, cache);
}
} }
if (cache != NULL && unw_tdep_trace(&cursor, vec, &len, cache) >= 0) {
/*
* The trace cache successfully looked up the backtrace.
* Discard the first (nignore+1) elements when copying the
* result, since there was no way to tell unw_tdep_trace() to
* skip those frames.
*/
assert(len >= nignore + 1);
len -= nignore + 1;
if (len > 0) {
memcpy(bt->vec, &vec[nignore + 1], sizeof(void *) *
len);
bt->len = len;
}
} else {
#endif
/* Throw away (nignore+1) stack frames, if that many exist. */
for (i = 0; i < nignore + 1; i++) {
err = unw_step(&cursor);
if (err <= 0)
return;
}
/* /*
* Iterate over stack frames until there are no more, or until * Iterate over stack frames until there are no more, or until no space
* no space remains in bt. * remains in bt.
*/ */
for (i = 0; i < max; i++) { for (i = 0; i < max; i++) {
unw_get_reg(&cursor, UNW_REG_IP, unw_get_reg(&cursor, UNW_REG_IP, (unw_word_t *)&bt->vec[i]);
(unw_word_t *)&bt->vec[i]); bt->len++;
bt->len++; err = unw_step(&cursor);
err = unw_step(&cursor); if (err <= 0)
if (err <= 0) break;
break;
}
#ifdef JEMALLOC_PROF_LIBUNWIND_CACHE
} }
#endif
} }
#endif #endif
#ifdef JEMALLOC_PROF_LIBGCC #ifdef JEMALLOC_PROF_LIBGCC
@ -1199,19 +1156,6 @@ prof_tdata_cleanup(void *arg)
} }
} }
#ifdef JEMALLOC_PROF_LIBUNWIND_CACHE
static void
libunwind_cache_thread_cleanup(void *arg)
{
unw_tdep_cache_t *cache = libunwind_cache_tls;
if (cache != NULL) {
unw_tdep_free_frame_cache(cache);
libunwind_cache_tls = NULL;
}
}
#endif
void void
prof_boot0(void) prof_boot0(void)
{ {
@ -1264,14 +1208,6 @@ prof_boot2(void)
"<jemalloc>: Error in pthread_key_create()\n"); "<jemalloc>: Error in pthread_key_create()\n");
abort(); abort();
} }
#ifdef JEMALLOC_PROF_LIBUNWIND_CACHE
if (pthread_key_create(&libunwind_cache_tsd,
libunwind_cache_thread_cleanup) != 0) {
malloc_write(
"<jemalloc>: Error in pthread_key_create()\n");
abort();
}
#endif
prof_bt_max = (1U << opt_lg_prof_bt_max); prof_bt_max = (1U << opt_lg_prof_bt_max);
if (malloc_mutex_init(&prof_dump_seq_mtx)) if (malloc_mutex_init(&prof_dump_seq_mtx))