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

Re: XS callbacks from different threads.

Thread Previous | Thread Next
From:
Josef Wolf
Date:
August 6, 2008 12:00
Subject:
Re: XS callbacks from different threads.
Message ID:
20080806185410.GD4446@raven.wolf.lan
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[])
{
    dTHX;
    dSP;
    I32 ax;
 /* ... snipped here ... */
}

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

    pthread_mutex_lock(&mutex);
    PERL_SET_CONTEXT(orig_perl);

    ret = do_call_perl (argc, argv);

    pthread_mutex_unlock(&mutex);

    return ret;
}

void register_callback (SV *callback)
{
    dTHX;

    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


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About