Fix an error, spotted by Tim Bunce.
[p5sagit/p5-mst-13.2.git] / vmesa / vmesa.c
index 0e9baf3..7e3635f 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++ = "";
        }
@@ -142,7 +142,7 @@ do_aspawn(SV* really, SV **mark, SV **sp)
        /*-----------------------------------------------------*/
        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;)
@@ -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,10 +408,13 @@ 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);
@@ -421,7 +425,9 @@ my_popen(char *cmd, char *mode)
       }
       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);
@@ -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.                                      */