develooper Front page | perl.ithreads | Postings from August 2008

Re: XS callbacks from different threads.

Thread Previous | Thread Next
Josef Wolf
August 6, 2008 12:00
Re: XS callbacks from different threads.
Message ID:
Thanks for your help and your passience, Shmuel!

On Tue, Aug 05, 2008 at 11:03:58PM +0300, Shmuel Fomberg wrote:

> Well, maybe, but there is already one thread that is passing through 
> perl, so calling PERL_SET_CONTEXT for this perl on other thread is 
> pulling the rug under the first thread's legs. it can't be good.

I've got it working now.  The solution is to PERL_SET_CONTEXT()
_before_ declaring the context with dTHX.  The code looks like this now:

static PerlInterpreter *orig_perl;
static SV *callback_ref = (SV*)NULL;

static int do_call_perl (size_t argc, char *argv[])
    I32 ax;
 /* ... snipped here ... */

static int call_perl_argv (size_t argc, char *argv[])
    int ret;
    static pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;


    ret = do_call_perl (argc, argv);


    return ret;

void register_callback (SV *callback)

    if (callback_ref == (SV*)NULL) {
        callback_ref = newSVsv (callback); /* first time, create new SV */
    } else {
        SvSetSV (callback_ref, callback);  /* been here, overwrite */

    orig_perl = my_perl;

    do {
        sleep (3);
    } while (call_perl (1, "check"));

    shutdown_threads ();

> Maybe you should use two threads: one of the calling perl, and one slave 
> perl. because as said two paragraphs ago, I don't think that using one 
> perl interpreter will work.

Now I have multiple C-threads calling one perl interpreter.  Multiple
entries into the interpreter are protected by a mutex.  That's exactly
what I've tried to achieve (at least for now).

> >static SV *callback_ref = (SV*)NULL;
> Reality check: you do know that "static" means here, right?

I think so: I have exactly one instance of this variable.  Do you see
any problems with this?

> >int call_perl (int cnt, ...)
> >{
> >    dTHX;
> >    PERL_SET_CONTEXT(my_perl);
> I hate the "my_perl" parameter. Who defined it? what is it set to? 

AFAIK, this is created by dTHX.

> Especially if you have more then one perl interpreter in you code. I used:
> 	dTHXa(ph->perl);
> 	PERL_SET_CONTEXT(ph->perl);
> where ph was some struct that held the perl interpreter for me...

Ah, I did not know about dTHXa().

Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About