On Wednesday 26 September 2007 14:26:20 [EMAIL PROTECTED] wrote:
> Author: coke
> Date: Wed Sep 26 14:26:19 2007
> New Revision: 21613
>
> Modified:
> trunk/lib/Parrot/Configure/Messages.pm
> trunk/tools/build/c2str.pl
>
> Log:
> [build]
>
> Update c2str.pl so that multiple copies running simultaneously no longer
> step on each other's toes drunkenly with a jackhammer.
>
> With this fix (Courtesy of jhorwitz++), 'make -j 2' now works, tested
> on a variety of platforms.
It even works for make -j 9 for me (two cores, but I like to keep them busy).
However...
> Modified: trunk/tools/build/c2str.pl
> ===========================================================================
>=== --- trunk/tools/build/c2str.pl (original)
> +++ trunk/tools/build/c2str.pl Wed Sep 26 14:26:19 2007
> @@ -19,6 +19,21 @@
>
> my $outfile = 'all_cstring.str';
> my $string_private_h = 'src/string_private_cstring.h';
> +my $lockfile = "$outfile.lck";
> +my $max_lock_wait = 120;
> +
> +my $start_time = time;
> +while ( -e $lockfile ) {
> + sleep 1;
> + if ( time - $start_time > $max_lock_wait ) {
> + die "Lock still held after $max_lock_wait seconds -- something is
> wrong!"; + }
> +}
... isn't there a race condition right here?
> +open my $lock, '>', $lockfile or die "Can't write '$lockfile': $!";
> +print $lock "$$\n";
> +close $lock;
> +
> +$SIG{'__DIE__'} = sub { unlink $lockfile };
For what it's worth, I think this patch is safer. I did have some trouble
with -j 3 and higher, but it's working for me on 32-bit x86 Linux now up
to -j 9.
-- c
=== tools/build/c2str.pl
==================================================================
--- tools/build/c2str.pl (revision 6130)
+++ tools/build/c2str.pl (local)
@@ -13,6 +13,7 @@
use strict;
use lib 'lib';
+use Fcntl qw( :DEFAULT :flock );
use Text::Balanced qw(extract_delimited);
use Math::BigInt;
use Getopt::Long;
@@ -20,21 +21,13 @@
my $outfile = 'all_cstring.str';
my $string_private_h = 'src/string_private_cstring.h';
my $lockfile = "$outfile.lck";
-my $max_lock_wait = 120;
-my $start_time = time;
-while ( -e $lockfile ) {
- sleep 1;
- if ( time - $start_time > $max_lock_wait ) {
- die "Lock still held after $max_lock_wait seconds -- something is wrong!";
- }
-}
-open my $lock, '>', $lockfile or die "Can't write '$lockfile': $!";
-print $lock "$$\n";
-close $lock;
+sysopen( my $lock, $lockfile, O_CREAT ) or die "Can't write '$lockfile': $!\n";
-$SIG{'__DIE__'} = sub { unlink $lockfile };
+flock($lock, LOCK_EX) or die "Can't lock '$lockfile': $!\n";
+END { close $lock; unlink $lockfile; }
+
my ( $result, $do_all, $do_init, $file );
$result = GetOptions(
"all" => \$do_all,
@@ -42,14 +35,12 @@
);
$do_all and do {
- &read_all;
- &create_c_include;
- unlink $lockfile;
+ read_all();
+ create_c_include();
exit;
};
$do_init and do {
unlink $outfile;
- unlink $lockfile;
exit;
};
@@ -61,13 +52,11 @@
my %known_strings = ();
my @all_strings;
-&read_all;
+read_all();
open my $ALL, '>>', $outfile or die "Can't write '$outfile': $!";
process_cfile();
close $ALL;
-unlink $lockfile;
-
sub hash_val {
my $h = Math::BigInt->new('+0');
my $s = shift;