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]