On Fri, Feb 10, 2012 at 04:48:38PM -0800, Jan Dubois wrote:
> On Fri, 10 Feb 2012, Dave Mitchell wrote:
> > On Thu, Feb 09, 2012 at 11:10:17PM +0100, demerphq wrote:
> > > Well perls fork() relies on threaded  perl so it could very easily be
> > > Dave's patch. Dave do you have access to a win32 build environment?
> > 
> > I'm afraid not.
> 
> The problem is due to the getenv() call during interpreter cloning.
> On Windows Perl keeps a virtual host environment for each interpreter,
> with its own cwd, and its own set of environment variables.  I don't
> have time to figure out _why_ this is an issue, but maybe you can check
> the environment variable during the BOOT section and just set a global
> variable instead, to work around this issue?

When called from BOOT dbi_bootinit() gets passed a NULL parent_dbis
parameter, but when called from CLONE it's not null, so this might be a
good fix:

@@ -579,7 +579,10 @@
     gv_fetchpv("DBI::lasth",  GV_ADDMULTI, SVt_PV);
     gv_fetchpv("DBI::rows",   GV_ADDMULTI, SVt_PV);
 
-    if (getenv("PERL_DBI_XSBYPASS"))
+    /* we only need to check the env var on the initial boot
+     * which is handy because it can core dump during CLONE on windows
+     */
+    if (!parent_dbis && getenv("PERL_DBI_XSBYPASS"))
         use_xsbypass = atoi(getenv("PERL_DBI_XSBYPASS"));
 }
 
Martin, could you try that?

> Setting a breakpoint on it confirms it, even though the stack trace
> looks incomplete (I don't see PerlEnvGetenv() calling abort() directly):
> 
> MSVCRT!abort
> perl514!PerlEnvGetenv+0x13 [perlhost.h @ 462]
> DBI!dbi_bootinit+0x276 [DBI.xs @ 468]
> DBI!XS_DBI__clone_dbis+0x71 [DBI.c @ 4280]
> 
> Anyways, I would suggest trying a workaround by moving the getenv()
> call outside the cloning operation.

Hopefully the above will do the trick. Meanwhile, aborting if getenv is
called during a CLONE sure seems like a bug worthy of a ticket for p5p.

Thanks Jan!

Tim.

Reply via email to