Regen headers.
[p5sagit/p5-mst-13.2.git] / doio.c
diff --git a/doio.c b/doio.c
index 0121633..6f62144 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -476,11 +476,13 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
            SV *sv;
 
            PerlLIO_dup2(PerlIO_fileno(fp), fd);
+           MUTEX_LOCK(&PL_fdpid_mutex);
            sv = *av_fetch(PL_fdpid,PerlIO_fileno(fp),TRUE);
            (void)SvUPGRADE(sv, SVt_IV);
            pid = SvIVX(sv);
            SvIVX(sv) = 0;
            sv = *av_fetch(PL_fdpid,fd,TRUE);
+           MUTEX_UNLOCK(&PL_fdpid_mutex);
            (void)SvUPGRADE(sv, SVt_IV);
            SvIVX(sv) = pid;
            if (!was_fdopen)
@@ -502,8 +504,8 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
     IoFLAGS(io) &= ~IOf_NOLINE;
     if (writing) {
        dTHR;
-       if (IoTYPE(io) == 's'
-           || (IoTYPE(io) == '>' && S_ISCHR(PL_statbuf.st_mode)) )
+        bool is_reg = IoTYPE(io) == '>' && S_ISCHR(PL_statbuf.st_mode);
+       if (IoTYPE(io) == 's' || is_reg)
        {
            char *mode;
            if (out_raw)
@@ -518,6 +520,10 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
                IoIFP(io) = Nullfp;
                goto say_false;
            }
+            else {
+                if (is_reg)
+                    IoIFP(io) = IoOFP(io); /* avoid double close() */
+            }
        }
        else
            IoOFP(io) = fp;