[tarantool-patches] Re: [PATCH 1/3] fiber: do not inline coro unwind function

  • From: Vladimir Davydov <vdavydov.dev@xxxxxxxxx>
  • To: Georgy Kirichenko <georgy@xxxxxxxxxxxxx>
  • Date: Thu, 25 Oct 2018 12:28:29 +0300

On Wed, Oct 10, 2018 at 07:39:24PM +0300, Georgy Kirichenko wrote:

Call coro_unwcontext via function pointer to protect the
function from inlining.
---
 src/backtrace.cc | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/backtrace.cc b/src/backtrace.cc
index 2512bc045..66dcc0047 100644
--- a/src/backtrace.cc
+++ b/src/backtrace.cc
@@ -363,12 +363,17 @@ __asm__ volatile(
 #endif
 }
 
+typedef void (*coro_unwcontext_indirect_f)(unw_context_t *unw_context,
+                                        struct coro_context *coro_ctx);
+/* Variable to process coro_unwcontext indirect call to avoid inlining. */
+static volatile coro_unwcontext_indirect_f coro_unwcontext_indirect = 
coro_unwcontext;
+

Why must not it be inlined? I think it deserves an explanation in
the comment.

Also, may be we'd better use NOINLINE attribute instead of function
pointer?

 void
 backtrace_foreach(backtrace_cb cb, coro_context *coro_ctx, void *cb_ctx)
 {
      unw_cursor_t unw_cur;
      unw_context_t unw_ctx;
-     coro_unwcontext(&unw_ctx, coro_ctx);
+     coro_unwcontext_indirect(&unw_ctx, coro_ctx);
      unw_init_local(&unw_cur, &unw_ctx);
      int frame_no = 0;
      unw_word_t sp = 0, old_sp = 0, ip, offset;

Other related posts: