Josef Wolf wrote:
For this one you need a real expert. It is possible to call into Perl
from an XS sub. but to call into Perl from other threads while it is
inside a XS call? I have no idea.
As far as I understand the corresponding section in perlguts, it should
be possible _if_ PERL_SET_CONTEXT() is called before. But for some
reason it keeps crashing :-(
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.
2. I need to create a second perl interpreter (or clone the first one).
Can somebody point me to example code how to do that?
That's actually no big deal. look at perldoc page perlembed, there are
examples.
What I am missing from those examples is the explanation how the
different interpreters would communicate.
There are two ways to communicate between two thread: using Perl's
mechanizem, or using C. either possible. just stick to one and don't mix.
For example, if you choose to use C communication, then after initizing
the lib, the master perl should call some C function that waits until
the lib finished working / need restart / etc. The lib will use the same
system to release the master from it's sleep, either directly or even an
XS sub that the perl code will call. (C calling Perl calling C...)
And there's one more complication: the low-level library don't even
state how many threads will call my callback. Therefore I would
prefer to have only _one_ interpreter and use a mutex to keep the
threads from entering the interpreter simultaneously.
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.
static SV *callback_ref = (SV*)NULL;
Reality check: you do know that "static" means here, right?
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?
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...
Good luck, anyway.
Shmuel.