Laurent,
Extending the example in perlcall to work for repeated calls to Perl is not
hard, but you have clearly taken the wrong path. In particular, you should
have "dSP;" and "PUSHMARK(SP);" at least once in your code, and I see
you've removed them completely. Sometimes it's just hard to put all the
pieces together, and perhaps the language barrier is causing trouble.
I've included a working solution below that takes a Perl subroutine
(reference, not name) and calls it the requested number of times. It also
prints out some diagnostic output from C so that you can see the flow of
the code. Extending this to take a subroutine name instead of a subref, or
passing arguments, is left as an exercise to the reader. :-)
If you have more questions about XS which perlcall does not explain, you
might consider signing up for
per...@perl.org. It's a very low-volume list
that might be better targeted to your XS questions.
David
use strict;
use warnings;
use Inline 'C';
my $n_times_called = 0;
sub my_perl_func {
$n_times_called++;
print "Called ${n_times_called}th time\n";
}
call_from_c(\&my_perl_func, 10);
__DATA__
__C__
void call_from_c(SV * subref, int n_times) {
int i;
printf("Starting C function\n");
for (i = 0; i < n_times; i++) {
dSP;
PUSHMARK(SP);
printf("Calling Perl function...\n");
call_sv(subref, G_DISCARD|G_NOARGS);
printf("I'm back\n");
}
printf("Done with C function\n");
}