Fix the compile for -DPERL_OLD_COPY_ON_WRITE (apart from the tenacious
[p5sagit/p5-mst-13.2.git] / vmesa / vmesa.c
index 0e9baf3..59dd19b 100644 (file)
@@ -116,17 +116,17 @@ do_aspawn(SV* really, SV **mark, SV **sp)
         fdMap[3];
  SV     *sv,
         **p_sv;
+ STRLEN        n_a;
 
     status = FAIL;
     if (sp > mark)
     {
-       dTHR;
-       New(401,PL_Argv, sp - mark + 1, char*);
+       Newx(PL_Argv, sp - mark + 1, char*);
        a = PL_Argv;
        while (++mark <= sp)
        {
            if (*mark)
-              *a++ = SvPVx(*mark, na);
+              *a++ = SvPVx(*mark, n_a);
            else
               *a++ = "";
        }
@@ -136,13 +136,13 @@ do_aspawn(SV* really, SV **mark, SV **sp)
        fdMap[STDOUT_FILENO] = Perl_stdout_fd;
        fdMap[STDERR_FILENO] = STDERR_FILENO;
        nFd                  = 3;
-       *a = Nullch;
+       *a = NULL;
        /*-----------------------------------------------------*/
        /* Will execvp() use PATH?                             */
        /*-----------------------------------------------------*/
        if (*PL_Argv[0] != '/')
            TAINT_ENV();
-       if (really && *(tmps = SvPV(really, na)))
+       if (really && *(tmps = SvPV(really, n_a)))
            pid = spawnp(tmps, nFd, fdMap, &inherit,
                         (const char **) PL_Argv,
                         (const char **) environ);
@@ -181,11 +181,13 @@ do_aspawn(SV* really, SV **mark, SV **sp)
              /* be used by my_pclose                        */
              /*---------------------------------------------*/
              close(fd);
+             MUTEX_LOCK(&PL_fdpid_mutex);
              p_sv  = av_fetch(PL_fdpid,fd,TRUE);
              fd    = (int) SvIVX(*p_sv);
              SvREFCNT_dec(*p_sv);
              *p_sv = &PL_sv_undef;
              sv    = *av_fetch(PL_fdpid,fd,TRUE);
+             MUTEX_UNLOCK(&PL_fdpid_mutex);
              (void) SvUPGRADE(sv, SVt_IV);
              SvIVX(sv) = pid;
              status    = 0;
@@ -258,7 +260,7 @@ do_spawn(char *cmd, int execf)
        }
     }
 
-    New(402,PL_Argv, (s - cmd) / 2 + 2, char*);
+    Newx(PL_Argv, (s - cmd) / 2 + 2, char*);
     PL_Cmd = savepvn(cmd, s-cmd);
     a = PL_Argv;
     for (s = PL_Cmd; *s;)
@@ -270,7 +272,7 @@ do_spawn(char *cmd, int execf)
        if (*s)
            *s++ = '\0';
     }
-    *a                   = Nullch;
+    *a                   = NULL;
     fdMap[STDIN_FILENO]  = Perl_stdin_fd;
     fdMap[STDOUT_FILENO] = Perl_stdout_fd;
     fdMap[STDERR_FILENO] = STDERR_FILENO;
@@ -283,7 +285,6 @@ do_spawn(char *cmd, int execf)
                     (const char **) environ);
        if (pid < 0)
        {
-          dTHR;
           status = FAIL;
           if (ckWARN(WARN_EXEC))
              warner(WARN_EXEC,"Can't exec \"%s\": %s",
@@ -407,28 +408,33 @@ my_popen(char *cmd, char *mode)
          Perl_stdin_fd = pFd[that];
       if (strNE(cmd,"-"))
       {
+         PERL_FLUSHALL_FOR_CHILD;
          pid = spawn_cmd(cmd, Perl_stdin_fd, Perl_stdout_fd);
          if (pid >= 0)
          {
+            MUTEX_LOCK(&PL_fdpid_mutex);
             sv = *av_fetch(PL_fdpid,pFd[this],TRUE);
+            MUTEX_UNLOCK(&PL_fdpid_mutex);
             (void) SvUPGRADE(sv, SVt_IV);
             SvIVX(sv) = pid;
             fd = PerlIO_fdopen(pFd[this], mode);
             close(pFd[that]);
          }
          else
-            fd = Nullfp;
+            fd = NULL;
       }
       else
       {
+         MUTEX_LOCK(&PL_fdpid_mutex);
          sv = *av_fetch(PL_fdpid,pFd[that],TRUE);
+         MUTEX_UNLOCK(&PL_fdpid_mutex);
          (void) SvUPGRADE(sv, SVt_IV);
          SvIVX(sv) = pFd[this];
          fd = PerlIO_fdopen(pFd[this], mode);
       }
    }
    else
-      fd = Nullfp;
+      fd = NULL;
    return (fd);
 }
 
@@ -458,7 +464,9 @@ my_pclose(FILE *fp)
  SV   **sv;
  FILE *other;
 
+   MUTEX_LOCK(&PL_fdpid_mutex);
    sv        = av_fetch(PL_fdpid,PerlIO_fileno(fp),TRUE);
+   MUTEX_UNLOCK(&PL_fdpid_mutex);
    pid       = (int) SvIVX(*sv);
    SvREFCNT_dec(*sv);
    *sv       = &PL_sv_undef;
@@ -477,33 +485,6 @@ my_pclose(FILE *fp)
 
 }
 
-/*===================== End of my_pclose ===================*/
-
-/************************************************************/
-/*                                                          */
-/* Name      - getTHR.                                      */
-/*                                                          */
-/* Function  - Use pclose to terminate a piped command      */
-/*             file stream.                                 */
-/*                                                          */
-/* On Exit   - Thread specific data returned.               */
-/*                                                          */
-/************************************************************/
-
-struct perl_thread *
-getTHR()
-{
- int status;
- struct perl_thread *pThread;
-
-   status = pthread_getspecific(PL_thr_key, (void **) &pThread);
-   if (status != 0)
-      pThread = NULL;
-   return (pThread);
-}
-
-/*===================== End of getTHR ======================*/
-
 /************************************************************/
 /*                                                          */
 /* Name      - dlopen.                                      */