Perl 5.8.4 crashes with shared data structures

[email protected] (Alvar Freude)
Newsgroups perl.ithreads
Message-ID <[email protected]>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Dear list,

while playing with ithreads and shared data structures, perl crashed.

(Perl 5.8.4 and 5.8.2 on FreeBSD 5.2 with ithreads, perl -V in the attached 
example code; also tested with Perl 5.8.4 and 5.8.0 on Linux 2.4.)

Attached is a test script, which crashes when using shared data.
This is the data structure which I want to implement and share between
different threads,so that every thread can access and modify this data:

my $dummy_unshared = 
   {
   arrayref    => 
      [
         { foo => "bar 1" },
         { foo => "bar 2" },
         { foo => "bar 3" },
      ]
   };


When starting a new Thread for each element in the array and adding or 
changing the corresponding hash, perl crashes. The thread must be detached
or joined.

It is not neccessary to pass the hashref to the thread or access the data
inside the thread.

   foreach my $hashref (@{ $dummy->{arrayref} }) 
      {
      # The following line causes perl to crash, when the data structure 
      # is shared
      $hashref->{status} = "some text";
      
      # start and detach thread
      threads->new(\&thread)->detach; 
      
      }

I realised that the address of the hashref in 
direct access is different to hashref access, but the values in the
data structure look like they are correct.

   print "Direct access:     $dummy->{arrayref}[$i]\n";
   print "Access by hashref: $hashref\n";
 
   # The following line let perl crash, when the data structure is shared
   $hashref->{status} = "some text $i";
   
   print "Dump if direct access:",  Dumper($dummy->{arrayref}[$i]);
   print "Dump of hashref access:", Dumper($hashref);
   print "Complete dummy: ",        Dumper($dummy);

The result:

- --- SNIP -----------

Direct access:     HASH(0x80640a8)
Access by hashref: HASH(0x811d390)

Dump if direct access:$VAR1 = {
          'foo' => 'bar 1',
          'status' => 'some text 0'
        };
Dump of hashref access:$VAR1 = {
          'foo' => 'bar 1',
          'status' => 'some text 0'
        };
Complete dummy: $VAR1 = {
          'arrayref' => [
                          {
                            'foo' => 'bar 1',
                            'status' => 'some text 0'
                          },
                          {
                            'foo' => 'bar 2'
                          },
                          {
                            'foo' => 'bar 3'
                          }
                        ]
        };
Direct access:     HASH(0x80640a8)
Access by hashref: HASH(0x811d818)

Bus error (core dumped)

- --- SNAP ----------


Because different timing, the crash occures every time at a different 
position.


Is this a bug in perl or in the script?!? 


Thank you!


Ciao
  Alvar



- -- 
** Alvar C.H. Freude -- http://alvar.a-blast.org/ -- http://odem.org/
** Berufsverbot? http://odem.org/aktuelles/staatsanwalt.de.html
** ODEM.org-Tour: http://tour.odem.org/
** 5 Jahre Blaster: http://www.a-blast.de/ | http://www.a-blast.de/statistik/

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (FreeBSD)

iD8DBQFAq4aaOndlH63J86wRAu2JAJ9d950vaOIG6xjqoB82YRlf2PnhRgCgzMU8
94LA2rzsc1Ky4i771tmcyqc=
=MKaH
-----END PGP SIGNATURE-----
crash_threads_shared-test.pl (application/octet-stream, 6.7 KB)
#!/usr/bin/perl

use strict;
use warnings;

use Carp qw(verbose);

use threads;
use threads::shared;


=begin email

Dear list,

while playing with ithreads and shared data structures, perl crashed.

(Perl 5.8.4 and 5.8.2 on FreeBSD 5.2 with ithreads, perl -V in the attached 
example code; also tested with Perl 5.8.4 and 5.8.0 on Linux 2.4.)


Attached is a test script, which crashes when using shared data.
This is the data structure which I want to implement and share between
different threads,so that every thread can access and modify this data:

my $dummy_unshared = 
   {
   arrayref    => 
      [
         { foo => "bar 1" },
         { foo => "bar 2" },
         { foo => "bar 3" },
      ]
   };


When starting a new Thread for each element in the array and adding or 
changing the corresponding hash, perl crashes. The thread must be detached
or joined.

It is not neccessary to pass the hashref to the thread or access the data
inside the thread.

   foreach my $hashref (@{ $dummy->{arrayref} }) 
      {
      # The following line causes perl to crash, when the data structure 
      # is shared
      $hashref->{status} = "some text";
      
      # start and detach thread
      threads->new(\&thread)->detach; 
      
      }

I realised that the address of the hashref in 
direct access is different to hashref access, but the values in the
data structure look like they are correct.

   print "Direct access:     $dummy->{arrayref}[$i]\n";
   print "Access by hashref: $hashref\n";
 
   # The following line let perl crash, when the data structure is shared
   $hashref->{status} = "some text $i";
   
   print "Dump if direct access:",  Dumper($dummy->{arrayref}[$i]);
   print "Dump of hashref access:", Dumper($hashref);
   print "Complete dummy: ",        Dumper($dummy);

The result:

--- SNIP -----------

Direct access:     HASH(0x80640a8)
Access by hashref: HASH(0x811d390)

Dump if direct access:$VAR1 = {
          'foo' => 'bar 1',
          'status' => 'some text 0'
        };
Dump of hashref access:$VAR1 = {
          'foo' => 'bar 1',
          'status' => 'some text 0'
        };
Complete dummy: $VAR1 = {
          'arrayref' => [
                          {
                            'foo' => 'bar 1',
                            'status' => 'some text 0'
                          },
                          {
                            'foo' => 'bar 2'
                          },
                          {
                            'foo' => 'bar 3'
                          }
                        ]
        };
Direct access:     HASH(0x80640a8)
Access by hashref: HASH(0x811d818)

Bus error (core dumped)

--- SNAP ----------


Because different timing, the crash occures every time at a different 
position.


Is this a bug in perl or in the script?!?


Thank you!


Ciao
  Alvar


=cut


# build a dummy data structure

# at first some unshared data:

my $dummy_2 =                 # unshared dummy; change it for other test
   {
   arrayref    => 
      [
         { foo => "bar 1" },
         { foo => "bar 2" },
         { foo => "bar 3" },
      ]
   };


# The same as shared:

my %hash1 : shared = (foo => "bar 1");
my %hash2 : shared = (foo => "bar 2");
my %hash3 : shared = (foo => "bar 3");

my @array : shared = (\%hash1, \%hash2, \%hash3 );

my $dummy  = { arrayref => \@array };


use Data::Dumper;

print "shared Data: ", Dumper($dummy);
print "reference data: ", Dumper($dummy_2);

#
# OK, now let's crash perl :-(
#

my $i=0;
foreach my $hashref (@{ $dummy->{arrayref} }) 
   {
   # When the data structure is shared, the following two references
   # have different addresses.
   # If not shared, then the addresses are the same
   print "Direct access:     $dummy->{arrayref}[$i]\n";
   print "Access by hashref: $hashref\n\n";
   
   # The following line let perl crash, when the data structure is shared
   $hashref->{status} = "some text $i";
   
   # print "Dump if direct access:",  Dumper($dummy->{arrayref}[$i]);
   # print "Dump of hashref access:", Dumper($hashref);
   # print "Complete dummy: ",        Dumper($dummy);
   
   # The following doesn't crash, but gives the same result
   # $dummy->{arrayref}[$i]{status} = "some text";              
   
   # start and detach thread
   threads->new(\&thread)->detach; 
   
   $i++;
   }

threads->yield while 1;


sub thread
   {
   
   # even if the thread does nothing at all, perl crashes
   
   # print "I am in the thread!";
   # threads->yield while 1;
   
   }   

 
 
 __END__
 
 =head1 perl -V
 
 /perl -V
Summary of my perl5 (revision 5 version 8 subversion 4) configuration:
  Platform:
    osname=freebsd, osvers=5.2-current, archname=i386-freebsd-thread-multi
    uname='freebsd kenny.intern.delirium-arts.de 5.2-current freebsd 5.2-current #1: wed apr 21 01:43:45 cest 2004 [email protected]:usrobjusrsrcsyskenny i386 '
    config_args='-de -Dusethreads -Dprefix=/usr/local/vrnet/perl -Doptimize=-O3 -march=pentium3'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -I/usr/local/include',
    optimize='-O3 -march=pentium3',
    cppflags='-DHAS_FPSETMASK -DHAS_FLOATINGPOINT_H -fno-strict-aliasing -I/usr/local/include'
    ccversion='', gccversion='3.3.3 [FreeBSD] 20031106', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='cc', ldflags ='-Wl,-E  -L/usr/local/lib'
    libpth=/usr/lib /usr/local/lib
    libs=-lgdbm -lm -lcrypt -lutil -lc_r
    perllibs=-lm -lcrypt -lutil -lc_r
    libc=, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags=' '
    cccdlflags='-DPIC -fPIC', lddlflags='-shared  -L/usr/local/lib'


Characteristics of this binary (from libperl): 
  Compile-time options: MULTIPLICITY USE_ITHREADS USE_LARGE_FILES PERL_IMPLICIT_CONTEXT
  Built under freebsd
  Compiled at May 16 2004 22:39:56
  %ENV:
    PERLLIB="/home/alvar/workspace/Server/"
  @INC:
    /home/alvar/workspace/Server/
    /usr/local/vrnet/perl/lib/5.8.4/i386-freebsd-thread-multi
    /usr/local/vrnet/perl/lib/5.8.4
    /usr/local/vrnet/perl/lib/site_perl/5.8.4/i386-freebsd-thread-multi
    /usr/local/vrnet/perl/lib/site_perl/5.8.4
    /usr/local/vrnet/perl/lib/site_perl
    .
 =cut
signature.asc (application/pgp-signature, 187 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (FreeBSD)

iD8DBQBAq4acOndlH63J86wRAtykAKCneF84eadTJ1atPpLdwTHL4jEOygCeJ+PA
EdKGttNJFfpmfotPXc+lndA=
=tc3p
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.