[Tarantool-patches] [PATCH 3/7] fiber: apply fix patch
eelchinov at tarantool.org
eelchinov at tarantool.org
Thu Jul 1 23:24:41 MSK 2021
From: Egor Elchinov <eelchinov at tarantool.org>
From: Egor Elchinov <elchinov.es at gmail.com>
Some mistakes fixed.
More consistent naming provided.
Based on review and patch from
Cyrill Gorcunov <gorcunov at gmail.com>
Needed for: #4002
---
src/lib/core/backtrace.cc | 47 +++++++++++++++++++++------------------
src/lib/core/backtrace.h | 8 ++++---
src/lib/core/fiber.c | 2 +-
src/lib/core/fiber.h | 2 +-
src/lua/fiber.c | 5 +++--
5 files changed, 35 insertions(+), 29 deletions(-)
diff --git a/src/lib/core/backtrace.cc b/src/lib/core/backtrace.cc
index a1727374c..f97c4c0a9 100644
--- a/src/lib/core/backtrace.cc
+++ b/src/lib/core/backtrace.cc
@@ -443,8 +443,8 @@ out:
* Must be by far faster than usual backtrace according to the
* libunwind doc for unw_backtrace().
*/
-void
-fast_trace_collect(void **ip_buf, int limit)
+void NOINLINE
+backtrace_collect_ip(void **ip_buf, int limit)
{
memset(ip_buf, 0, limit * sizeof(*ip_buf));
#ifndef TARGET_OS_DARWIN
@@ -466,54 +466,57 @@ fast_trace_collect(void **ip_buf, int limit)
* TODO: to add cache and demangling support
*/
void
-fast_trace_foreach(backtrace_cb cb, void **ip_buf, int limit, void *cb_ctx)
+backtrace_foreach_ip(backtrace_cb cb, void **ip_buf, int limit,
+ void *cb_ctx)
{
#ifndef TARGET_OS_DARWIN
- static __thread char proc_name[BACKTRACE_NAME_MAX];
- char* proc = NULL;
- int frame_no = 0, ret = 0;
+ char proc_name[BACKTRACE_NAME_MAX];
unw_word_t ip = 0, offset = 0;
unw_proc_info_t pi;
-
- unw_accessors_t* acc = unw_get_accessors(unw_local_addr_space);
- assert(acc);
-
- for (frame_no = 0; frame_no < limit && ip_buf[frame_no] != NULL;
- ++frame_no) {
+ int frame_no, ret = 0;
+ char *proc = NULL;
+
+ unw_accessors_t *acc = unw_get_accessors(unw_local_addr_space);
+
+ /*
+ * RIPs collecting comes from inside a helper routine
+ * so we skip the collector function address itself thus
+ * start fetching functions with frame number = 1.
+ */
+ for (frame_no = 1; frame_no < limit && ip_buf[frame_no] != NULL;
+ frame_no++) {
ip = (unw_word_t)ip_buf[frame_no];
+
if (acc->get_proc_name == NULL) {
ret = unw_get_proc_info_by_ip(unw_local_addr_space,
ip, &pi, NULL);
offset = ip - pi.start_ip;
} else {
ret = acc->get_proc_name(unw_local_addr_space, ip,
- proc_name, sizeof(proc_name),
- &offset, NULL);
+ proc_name, sizeof(proc_name),
+ &offset, NULL);
proc = proc_name;
}
-
- if (ret != 0 || (frame_no > 0 &&
- cb(frame_no - 1, (void *)ip, proc,
- (size_t)offset, cb_ctx) != 0))
+ if (ret != 0 || cb(frame_no - 1, (void *)ip, proc,
+ (size_t)offset, cb_ctx) != 0)
break;
}
if (ret != 0)
say_debug("unwinding error: %s", unw_strerror(ret));
#else
- int frame_no = 0, ret = 1;
+ int frame_no, ret = 1;
void *ip = NULL;
size_t offset = 0;
Dl_info dli;
- for (frame_no = 0; frame_no < limit && ip_buf[frame_no] != NULL;
+ for (frame_no = 1; frame_no < limit && ip_buf[frame_no] != NULL;
++frame_no) {
ip = ip_buf[frame_no];
ret = dladdr(ip, &dli);
offset = (char *)ip - (char *)dli.dli_saddr;
- if (frame_no > 0 &&
- cb(frame_no - 1, ip, dli.dli_sname, offset, cb_ctx) != 0)
+ if (cb(frame_no - 1, ip, dli.dli_sname, offset, cb_ctx) != 0)
break;
}
diff --git a/src/lib/core/backtrace.h b/src/lib/core/backtrace.h
index 8bb668366..4552c14e1 100644
--- a/src/lib/core/backtrace.h
+++ b/src/lib/core/backtrace.h
@@ -31,6 +31,7 @@
* SUCH DAMAGE.
*/
#include "trivia/config.h"
+#include "trivia/util.h"
#include <stddef.h>
#if defined(__cplusplus)
@@ -55,11 +56,12 @@ backtrace_foreach(backtrace_cb cb, coro_context *coro_ctx, void *cb_ctx);
void
backtrace_proc_cache_clear(void);
-void
-fast_trace_collect(void **ip_buf, int limit);
+void NOINLINE
+backtrace_collect_ip(void **ip_buf, int limit);
void
-fast_trace_foreach(backtrace_cb cb, void **ip_buf, int limit, void *cb_ctx);
+backtrace_foreach_ip(backtrace_cb cb, void **ip_buf, int limit,
+ void *cb_ctx);
#endif /* ENABLE_BACKTRACE */
diff --git a/src/lib/core/fiber.c b/src/lib/core/fiber.c
index 73500e043..924ff3c82 100644
--- a/src/lib/core/fiber.c
+++ b/src/lib/core/fiber.c
@@ -1265,7 +1265,7 @@ fiber_new_ex(const char *name, const struct fiber_attr *fiber_attr,
fiber->fid = cord->next_fid;
fiber_set_name(fiber, name);
#if ENABLE_BACKTRACE
- fast_trace_collect(fiber->parent_bt_ip_buf, FIBER_PARENT_BT_MAX);
+ backtrace_collect_ip(fiber->parent_bt_ip_buf, FIBER_PARENT_BT_MAX);
#endif /* ENABLE_BACKTRACE */
register_fid(fiber);
fiber->csw = 0;
diff --git a/src/lib/core/fiber.h b/src/lib/core/fiber.h
index 6a155c0fe..beed58866 100644
--- a/src/lib/core/fiber.h
+++ b/src/lib/core/fiber.h
@@ -654,7 +654,7 @@ struct fiber {
char inline_name[FIBER_NAME_INLINE];
#if ENABLE_BACKTRACE
/** Fiber creation backtrace chunk. */
- void* parent_bt_ip_buf[FIBER_PARENT_BT_MAX];
+ void *parent_bt_ip_buf[FIBER_PARENT_BT_MAX];
#endif /* ENABLE_BACKTRACE */
};
diff --git a/src/lua/fiber.c b/src/lua/fiber.c
index dc7051edd..7b21361d4 100644
--- a/src/lua/fiber.c
+++ b/src/lua/fiber.c
@@ -314,8 +314,9 @@ lbox_fiber_statof_map(struct fiber *f, void *cb_ctx, bool backtrace)
tb_ctx.R = NULL;
lua_pushstring(L, "backtrace_parent");
lua_newtable(L);
- fast_trace_foreach(fiber_backtrace_cb, f->parent_bt_ip_buf,
- FIBER_PARENT_BT_MAX, &tb_ctx);
+ backtrace_foreach_ip(fiber_backtrace_cb,
+ f->parent_bt_ip_buf,
+ FIBER_PARENT_BT_MAX, &tb_ctx);
lua_settable(L, -3);
#endif /* ENABLE_BACKTRACE */
}
--
2.31.1
More information about the Tarantool-patches
mailing list