develooper Front page | perl.perl5.porters | Postings from April 2000

[PATCH 5.6.0]subprocess fixup for threads

Thread Next
From:
Dan Sugalski
Date:
April 11, 2000 14:05
Subject:
[PATCH 5.6.0]subprocess fixup for threads
Message ID:
4.3.0.20000411170218.01d2f580@24.8.96.48
This patch fixes a potential problem when spawning subprocesses in
multiple threads simultaneously. (Hopefully Eudora won't eat this...)

--- doio.c;1	Sun Mar 19 07:18:00 2000
+++ doio.c	Tue Apr 11 15:04:54 2000
@@ -476,11 +476,17 @@
   	    SV *sv;
   
   	    PerlLIO_dup2(PerlIO_fileno(fp), fd);
+#if defined(USE_THREADS)
+	    MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
   	    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);
+#if defined(USE_THREADS)
+	    MUTEX_UNLOCK(&PL_fdpid_mutex);
+#endif
   	    (void)SvUPGRADE(sv, SVt_IV);
   	    SvIVX(sv) = pid;
   	    if (!was_fdopen)
--- intrpvar.h;1	Mon Feb 28 19:03:01 2000
+++ intrpvar.h	Tue Apr 11 13:55:50 2000
@@ -139,7 +139,9 @@
   
   /* subprocess state */
   PERLVAR(Ifdpid,		AV *)		/* keep fd-to-pid mappings for my_popen */
-
+#ifdef USE_THREADS
+PERLVAR(Ifdpid_mutex,	perl_mutex)	/* mutex for fdpid array */
+#endif
   /* internal state */
   PERLVAR(Itainting,	bool)		/* doing taint checks */
   PERLVARI(Iop_mask,	char *,	NULL)	/* masked operations for safe evals */
--- perl.c;1	Fri Mar 17 22:35:15 2000
+++ perl.c	Tue Apr 11 14:39:32 2000
@@ -181,6 +181,8 @@
   	
   	MUTEX_INIT(&PL_cred_mutex);
   
+	MUTEX_INIT(&PL_fdpid_mutex);
+
   	thr = init_main_thread();
   #endif /* USE_THREADS */
   
@@ -715,6 +717,7 @@
       MUTEX_DESTROY(&PL_sv_mutex);
       MUTEX_DESTROY(&PL_eval_mutex);
       MUTEX_DESTROY(&PL_cred_mutex);
+    MUTEX_DESTROY(&PL_fdpid_mutex);
       COND_DESTROY(&PL_eval_cond);
   #ifdef EMULATE_ATOMIC_REFCOUNTS
       MUTEX_DESTROY(&PL_svref_mutex);
--- util.c;1	Wed Mar 22 15:19:01 2000
+++ util.c	Tue Apr 11 14:44:26 2000
@@ -2379,7 +2379,13 @@
   	PerlLIO_close(p[This]);
   	p[This] = p[that];
       }
+#if defined(USE_THREADS)
+    MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
       sv = *av_fetch(PL_fdpid,p[This],TRUE);
+#if defined(USE_THREADS)
+    MUTEX_UNLOCK(&PL_fdpid_mutex);
+#endif
       (void)SvUPGRADE(sv,SVt_IV);
       SvIVX(sv) = pid;
       PL_forkprocess = pid;
@@ -2596,7 +2602,13 @@
       int saved_win32_errno;
   #endif
   
+#if defined(USE_THREADS)
+    MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
       svp = av_fetch(PL_fdpid,PerlIO_fileno(ptr),TRUE);
+#if defined(USE_THREADS)
+    MUTEX_UNLOCK(&PL_fdpid_mutex);
+#endif
       pid = SvIVX(*svp);
       SvREFCNT_dec(*svp);
       *svp = &PL_sv_undef;
--- vmesa/vmesa.c;1	Tue Jul 20 17:18:16 1999
+++ vmesa/vmesa.c	Tue Apr 11 16:28:32 2000
@@ -182,11 +182,17 @@
                /* be used by my_pclose                        */
                /*---------------------------------------------*/
                close(fd);
+#if defined(USE_THREADS)
+	     MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
                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);
+#if defined(USE_THREADS)
+	     MUTEX_UNLOCK(&PL_fdpid_mutex);
+#endif
                (void) SvUPGRADE(sv, SVt_IV);
                SvIVX(sv) = pid;
                status    = 0;
@@ -412,7 +418,13 @@
            pid = spawn_cmd(cmd, Perl_stdin_fd, Perl_stdout_fd);
            if (pid >= 0)
            {
+#if defined(USE_THREADS)
+	    MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
               sv = *av_fetch(PL_fdpid,pFd[this],TRUE);
+#if defined(USE_THREADS)
+	    MUTEX_UNLOCK(&PL_fdpid_mutex);
+#endif
               (void) SvUPGRADE(sv, SVt_IV);
               SvIVX(sv) = pid;
               fd = PerlIO_fdopen(pFd[this], mode);
@@ -423,7 +435,13 @@
         }
         else
         {
+#if defined(USE_THREADS)
+	MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
            sv = *av_fetch(PL_fdpid,pFd[that],TRUE);
+#if defined(USE_THREADS)
+	MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
            (void) SvUPGRADE(sv, SVt_IV);
            SvIVX(sv) = pFd[this];
            fd = PerlIO_fdopen(pFd[this], mode);
@@ -460,7 +478,13 @@
    SV   **sv;
    FILE *other;
   
+#if defined(USE_THREADS)
+   MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
      sv        = av_fetch(PL_fdpid,PerlIO_fileno(fp),TRUE);
+#if defined(USE_THREADS)
+   MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
      pid       = (int) SvIVX(*sv);
      SvREFCNT_dec(*sv);
      *sv       = &PL_sv_undef;
--- win32/win32.c;1	Thu Mar  9 18:46:57 2000
+++ win32/win32.c	Tue Apr 11 16:29:15 2000
@@ -2391,7 +2391,13 @@
   	/* close saved handle */
   	win32_close(oldfd);
   
+#if defined(USE_THREADS)
+	MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
   	sv_setiv(*av_fetch(w32_fdpid, p[parent], TRUE), childpid);
+#if defined(USE_THREADS)
+	MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
   
   	/* set process id so that it can be returned by perl's open() */
   	PL_forkprocess = childpid;
@@ -2427,7 +2433,13 @@
       int childpid, status;
       SV *sv;
   
+#if defined(USE_THREADS)
+    MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
       sv = *av_fetch(w32_fdpid, win32_fileno(pf), TRUE);
+#if defined(USE_THREADS)
+    MUTEX_LOCK(&PL_fdpid_mutex);
+#endif
       if (SvIOK(sv))
   	childpid = SvIVX(sv);
       else

## End of patch ##


Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About