in reply to Intercept any changes to the sv_refcnt/SvREFCNT of an object

vernonlyon:

Have you looked at Devel::Monitor, Devel::WeakRef or Hash::NoRef? A brief CPAN search turned them up, and they may give you some clues as how you can monitor reference counts, or perhaps suggest an alternative to what you're trying to do.

...roboticus

When your only tool is a hammer, all problems look like your thumb.

  • Comment on Re: Intercept any changes to the sv_refcnt/SvREFCNT of an object

Replies are listed 'Best First'.
Re^2: Intercept any changes to the sv_refcnt/SvREFCNT of an object
by vernonlyon (Novice) on Sep 13, 2011 at 14:50 UTC

    I've looked at those modules and a few others, but they don't touch on what I'm trying to achieve.
    I'd like to "hook" into when an object's REFCNT goes up or down anywhere in the program.

    The closest I could find was Variable::Magic, but it hooks into a variable not the thing it's referencing and it doesn't have hooks for REFCNTs.

    Thanx, though.

      As incrementing/decrementing the reference count happens (very) often, these are implemented as C macros and not hookable function calls in sv.c:

      #if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) # define SvREFCNT_inc(sv) \ ({ \ SV * const _sv = MUTABLE_SV(sv); \ if (_sv) \ (SvREFCNT(_sv))++; \ _sv; \ }) # define SvREFCNT_inc_simple(sv) \ ({ \ if (sv) \ (SvREFCNT(sv))++; \ MUTABLE_SV(sv); \ }) # define SvREFCNT_inc_NN(sv) \ ({ \ SV * const _sv = MUTABLE_SV(sv); \ SvREFCNT(_sv)++; \ _sv; \ }) # define SvREFCNT_inc_void(sv) \ ({ \ SV * const _sv = MUTABLE_SV(sv); \ if (_sv) \ (void)(SvREFCNT(_sv)++); \ }) #else # define SvREFCNT_inc(sv) \ ((PL_Sv=MUTABLE_SV(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) # define SvREFCNT_inc_simple(sv) \ ((sv) ? (SvREFCNT(sv)++,MUTABLE_SV(sv)) : NULL) # define SvREFCNT_inc_NN(sv) \ (PL_Sv=MUTABLE_SV(sv),++(SvREFCNT(PL_Sv)),PL_Sv) # define SvREFCNT_inc_void(sv) \ (void)((PL_Sv=MUTABLE_SV(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) #endif

      The "easy" way is to just redefine these macros and recompile Perl. You should be aware that invoking Perl code from within such a hook would be very unwise, as Perl code inevitably will allocate values whose refcount needs to be incremented, which would invoke your hook, recursively.

      This is also the hard way.

        Yep, recompiling perl could make anything possible.
        Unfortunately it's not possible to recompile perl in this case. :-(

      Clone::Fast has programatic hooks that could be integrated into B. Give that a try.

        Unfortuantely this requires code to call the clone method, so won't work for me.