Thanks again, for now, setCallback() is only being called once...
but it still panics on the second callback, whether to the same callback as the first successful one, or a different one being called for the first time?
That it works the first time and fails the second, still makes me think I am messing up the stack somehow?
As you'll see below, I've had various attempts at ensuring that the stack is cleaned up. I've tried both the Inline_* macros and the XS macros to no avail?
#! perl -slw
use strict;
use Inline 'NoClean', 'FORCE', 'INFO' ;
use Inline Config => WARNINGS => 4;
use Inline 'C' => 'DATA', NAME =>'test';
use Devel::Peek;
sub recorder{ print "record: @_"; }
sub player{ print "player: @_"; }
print Dump \&recorder;
printf "r:%x p:%x\n", \&recorder, \&player;
setCallbacks( \&recorder, \&player );
record( 'test' );
play( 'test' );
__DATA__
__C__
SV *g_rec = (SV*)NULL;
SV *g_play = (SV*)NULL;
int setCallbacks( SV *rec, SV *play ) {
printf( "r:%x p:%x\n", rec, play );
g_rec = SvREFCNT_inc( SvRV( rec ) );
g_play = SvREFCNT_inc( SvRV( play ) );
return 0;
}
int record( SV *m ) {
// ENTER;
// SAVETMPS;
call_sv( g_rec, G_VOID );
// FREETMPS;
// LEAVE;
return 0;
}
int play( SV *m ) {
// ENTER;
// SAVETMPS;
call_sv( g_play, G_VOID );
// FREETMPS;
// LEAVE;
return 0;
}
__END__
<-----------------------End of Information Section--------------------
+-------->
SV = RV(0x18404b4) at 0x1949a74
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x226004
SV = PVCV(0x1824094) at 0x226004
REFCNT = 2
FLAGS = ()
IV = 0
NV = 0
COMP_STASH = 0x2251d0 "main"
START = 0x1958cd4 ===> 11609
ROOT = 0x1958c90
XSUB = 0x0
XSUBANY = 0
GVGV::GV = 0x1959b98 "main" :: "recorder"
FILE = "P:\test\test.pl"
DEPTH = 0
FLAGS = 0x0
OUTSIDE_SEQ = 951
PADLIST = 0x226010
PADNAME = 0x22601c(0x1826a5c) PAD = 0x22604c(0x182ebb4)
OUTSIDE = 0x2253c8 (MAIN)
r:226004 p:1959c04
r:1949a74 p:2252a8
record: test
panic: memory wrap at P:\test\test.pl line 18.
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
|