in reply to Re: perl->c->perl
in thread perl->c->perl

I don't think that would be possible. As I understand, Inline::C is useful for calling C functions from perl, but how would you call a function that requires a function pointer as an argument? For instance, how would I write a callback function using Inline::C? The libraries register_callback routine needs a (*)(void *, void*, unsigned long, Timestamp, void *). What function pointer could I then pass it?

Replies are listed 'Best First'.
Re^3: perl->c->perl (Inline::C)
by tye (Sage) on Dec 12, 2005 at 18:48 UTC

    Inline::C lets you write plain C functions too, and to callback from C to Perl you need a plain C function that calls one of the "call into Perl" subroutines. So callbacks from C to Perl are just as possible (and easier to write) with Inline::C instead of XS.

    The trick is getting at context. If you are lucky, then the callback interface allows you to have a context indicator passed to the callback. If not, then things get ratherr complicated...

    Unfortunately, I've run out of time for now...

    - tye        

      Thanks for the advice.

      I tried using Inline::C, but it's still not quite working. The wrappers around a few of the library routines (initialization, for example) do appear to be working correctly, however, it crashes whenever running the C callback function. In the C callback function, what it should be doing is copying the necessary data to perl variables, doing a "perl_call_sv" to call the user specified perl callback function, then copying the data back from perl variables. What's happening though is that the program crashes whenever I try to do anything in the C language callback function.

      No matter what code I put in the C callback, I get ``unhandled exception...: access violation reading location...''

      I can confirm that the callback function is actually being called because I've made a counter variable that increments each time its run. Upon close, I have the program print the contents, and it looks like its being run the right number of times. However, anything more complicated than that and it crashes.

      Any thoughts?

        Any thoughts?

        Show your code? You can also use a C debugger to try to determine where the problem is. You could also look at FFI in case its source code is of some help.

        - tye