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
-
[PATCH 5.6.0]subprocess fixup for threads
by Dan Sugalski