fork&Perl BUG
Thomas Moestl
t.moestl at tu-bs.de
Wed Jul 30 09:36:42 PDT 2003
On Wed, 2003/07/30 at 17:25:42 +0400, Andrew Belashov wrote:
> I modified Perl by adding sleep(10) in parent after fork():
> ---------------------------------------------------------------------
> --- pp_sys.c.orig Fri Apr 6 08:38:46 2001
> +++ pp_sys.c Wed Jul 30 17:17:50 2003
> @@ -3703,6 +3703,9 @@
> if ((tmpgv = gv_fetchpv("$", TRUE, SVt_PV)))
> sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
> hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
> + } else {
> + /* PARENT */
> + sleep(10);
> }
> PUSHi(childpid);
> RETURN;
> ---------------------------------------------------------------------
>
> and my test script working OK!!!
> ---------------------------------------------------------------------
> (gdb) run perlbug.pl 80000
> Starting program: /usr/ports/lang/perl5.debug/work/perl-5.6.1/perl
> perlbug.pl 80000
> ................................................................................
> Main: sum = 39977.1619376211, cnt = 80000
> Child working...
> Child: sum = 39977.1619376211, cnt = 80000
> Child exiting...
> Child pid = 92042
> Parent working...
> Parent: sum = 39977.1619376211, cnt = 80000
> Parent waiting a child...
> Parent exiting...
> ---------------------------------------------------------------------
>
> IMHO, it is bug in fork(2).
This was indeed caused by a kernel bug in the sparc64 pmap, which
affected fork() among other things. I've just committed a fix
(attached); can you please test it to make sure that it really
resolves this problem?
Thanks for the report and analysis!
- Thomas
--
Thomas Moestl <t.moestl at tu-bs.de> http://www.tu-bs.de/~y0015675/
<tmm at FreeBSD.org> http://people.FreeBSD.org/~tmm/
PGP fingerprint: 1C97 A604 2BD0 E492 51D0 9C0F 1FE6 4F1D 419C 776C
-------------- next part --------------
Index: sys/sparc64/sparc64/pmap.c
===================================================================
RCS file: /vol/ncvs/src/sys/sparc64/sparc64/pmap.c,v
retrieving revision 1.118
diff -u -r1.118 pmap.c
--- sys/sparc64/sparc64/pmap.c 6 Jul 2003 20:32:42 -0000 1.118
+++ sys/sparc64/sparc64/pmap.c 30 Jul 2003 16:08:09 -0000
@@ -1161,7 +1161,7 @@
if ((data & TD_W) != 0 && pmap_track_modified(pm, va))
vm_page_dirty(m);
}
- return (0);
+ return (1);
}
/*
More information about the freebsd-sparc64
mailing list