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:
parent
69c0472999
commit
9f949f9d82
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user