From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-3.7 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 801E91F4C5 for ; Sat, 2 Nov 2019 02:03:32 +0000 (UTC) From: Eric Wong To: mwrap-perl@80x24.org Subject: [PATCH 4/7] update_stats_rcu_lock: favor PL_curcop instead of caller_cx Date: Sat, 2 Nov 2019 02:03:28 +0000 Message-Id: <20191102020331.28050-5-e@80x24.org> In-Reply-To: <20191102020331.28050-1-e@80x24.org> References: <20191102020331.28050-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: PL_curcop seems to actually work correctly for resolving the current op, rather than walking up the stack. --- Mwrap.xs | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/Mwrap.xs b/Mwrap.xs index 92fc4de..a89578a 100644 --- a/Mwrap.xs +++ b/Mwrap.xs @@ -4,7 +4,6 @@ * Disclaimer: I don't really know my way around XS or Perl internals well */ #define _LGPL_SOURCE /* allows URCU to inline some stuff */ -#define NEED_caller_cx #include "EXTERN.h" #include "perl.h" #include "XSUB.h" @@ -295,33 +294,28 @@ static void update_stats_rcu_unlock(const struct src_loc *l) static struct src_loc *update_stats_rcu_lock(size_t size, uintptr_t caller) { - const PERL_CONTEXT *cx = NULL; static const size_t xlen = sizeof(caller); struct src_loc *k, *ret = 0; char *dst; + const COP *cop; if (caa_unlikely(!totals)) return 0; if (locating++) goto out; /* do not recurse into another *alloc */ uatomic_add(&total_bytes_inc, size); + cop = PL_curcop; rcu_read_lock(); - cx = caller_cx(0, NULL); - if (cx) { - const char *ptr = OutCopFILE(cx->blk_oldcop); - const COP *lcop; + if (cop) { + const char *ptr = OutCopFILE(cop); unsigned line; size_t len; size_t int_size = INT2STR_MAX; - if (!ptr) goto unknown; + if (!ptr) + goto unknown; - lcop = Perl_closest_cop(aTHX_ cx->blk_oldcop, - OpSIBLING(cx->blk_oldcop), - cx->blk_sub.retop, TRUE); - if (!lcop) - lcop = cx->blk_oldcop; - line = CopLINE(lcop); + line = CopLINE(cop); /* avoid vsnprintf or anything which could call malloc here: */ len = strlen(ptr);