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().