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

Vladimir Davydov vdavydov.dev at gmail.com
Thu Oct 25 12:28:29 MSK 2018


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;



More information about the Tarantool-patches mailing list