Stas Bekman wrote:
> It looks like 5.8.1 started to cache ppids in PL_ppid, which wasn't the case 
> in 5.8.0. When ithreads are enabled the new logic updates PL_ppid in pp_fork, 
> which now does:
> 
> PP(pp_fork)
> {
> ...
> #ifdef THREADS_HAVE_PIDS
>       PL_ppid = (IV)getppid();
> #endif

THREADS_HAVE_PIDS is only defined on Linux.
The relevant section of the docs is in perlvar/$$ :

    Note for Linux users: on Linux, the C functions C<getpid()> and
    C<getppid()> return different values from different threads. In order to
    be portable, this behavior is not reflected by C<$$>, whose value remains
    consistent across threads. If you want to call the underlying C<getpid()>,
    you may use the CPAN module C<Linux::Pid>.

> So if an application running embedded perl wasn't forked by perl's pp_fork, 
> it'll have this problem. Under mod_perl 2, we get getppid reporting 1 from the 
> forked process, when pstree clearly shows that this is not the case.

Yes. I didn't thought about this problem.

> I have a workaround for mp2:
> 
> #if PERL_REVISION == 5 && PERL_VERSION == 8 && PERL_SUBVERSION == 1
>      {
> #ifdef THREADS_HAVE_PIDS
> #ifdef USE_ITHREADS
>          MP_dSCFG(s);
>          dTHXa(scfg->mip->parent->perl);
>          PL_ppid = (IV)getppid();
> #endif
> #endif
>      }
> #endif
> 
> which can be run at the child_init phase, immediately after a new process is 
> forked. But may be it's something that need to be fixed in perl, as it worked 
> just fine with 5.8.0, and is probably an inappropriate change in behavior for 
> a maintenance release? If not please let me know, so that I'll change the 
> workaround's ifdef to match 5.8.1+.

Currently PL_ppid is initialized in S_init_postdump_symbols.
I imagine we could initialize or reinitialize it later at a time
more suitable if there is some routine to be called back at fork
time.

Perhaps should I add a note in perlembed.pod about this problem ?

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to