simple threads::shared code causes crash, any ideas?

S

sgromoll

Hi-

I've written a multithreaded sockets server where the main thread
receives a tcp connection, forks a thread to handle it, detaches it,
and waits for the next connection. I'm experiencing a segmentation
fault which i think is related to calling lock() on a shared variable.

I've written a very small test script (see below) which crashes
consistantly in a similar way. It crashes with the following error:

thread failed to start: panic: MUTEX_LOCK (22) [shared.xs:107] at
../job_manager line 1045, <GEN817> line 1.
Segmentation fault

Does anyone have any ideas why the script below crashes?

(I'm running perl v5.8.4 on debian testing. I have included the output
of uname and perl -V below the script)

Thanks-

-stefan


----------
#!/usr/bin/perl -w

use warnings;
use strict;

use threads;
use threads::shared;

my $var : shared = 0;


sub go
{
lock($var);
}

# (my server program crashes (after a fairly long time) when
# only a few threads are running at a time)
while(1) {
my $thr1 = threads->new(\&go);
# if this detach is removed, the script doesn't seem to crash,
# and runs until it uses up all the memory on the machine
$thr1->detach;
}

-----------------
uname -a
Linux venus 2.4.25 #6 SMP Mon Apr 26 19:14:43 EDT 2004 i686 GNU/Linux

-----------------
perl -V:

Summary of my perl5 (revision 5 version 8 subversion 4) configuration:
Platform:
osname=linux, osvers=2.4.27-ti1211,
archname=i386-linux-thread-multi
uname='linux kosh 2.4.27-ti1211 #1 sun sep 19 18:17:45 est 2004
i686 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=i386-linux -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.8.4
-Dsitearch=/usr/local/lib/perl/5.8.4 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm
-Duseshrplib -Dlibperl=libperl.so.5.8.4 -Dd_dosuid -des'
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 ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS
-DDEBIAN -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64',
optimize='-O2',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN
-fno-strict-aliasing -I/usr/local/include'
ccversion='', gccversion='3.3.5 (Debian 1:3.3.5-8)',
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 =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.3.2.so, so=so, useshrplib=true,
libperl=libperl.so.5.8.4
gnulibc_version='2.3.2'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-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 linux
Compiled at Feb 3 2005 00:32:16
%ENV:
PERL5LIB="/usr/local/sw/perl"
@INC:
/usr/local/sw/perl
/etc/perl
/usr/local/lib/perl/5.8.4
/usr/local/share/perl/5.8.4
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.8
/usr/share/perl/5.8
/usr/local/lib/site_perl
 
X

xhoster

sgromoll said:
Does anyone have any ideas why the script below crashes?

(I'm running perl v5.8.4 on debian testing. I have included the output
of uname and perl -V below the script)

For whatever it is worth, I don't get a crash on 5.8.0 on Redhat
2.4.21-15.0.3.ELsmp #1 SMP Tue Jun 29 18:04:47 EDT 2004 i686 unknown
unknown GNU/Linux

Nor on 5.8.3
2.6.5-7.97-smp #1 SMP Fri Jul 2 14:21:59 UTC 2004 x86_64 x86_64 x86_64
GNU/Linux

Xho
 
S

sgromoll

hmmm, i tried this on a few other machines as well, it seems to crash
on work with some setups and not with others.

It does not seem to crash (after 10 minutes or so anyway) on:

(5.8.4) 2.6.10-5-386 #1 i686 GNU/Linux
(5.8.0) 2.4.21-4.ELsmp #1 SMP i686 i686 i386 GNU/Linux
and from Xho in his posting below (Xho, did you let these run for a few
minutes?):
(5.8.3) 2.6.5-7.97-smp #1 SMP x86_64 x86_64 x86_64 GNU/Linux
(5.8.0) 2.4.21-15.0.3.ELsmp #1 SMP i686 unknown unknown GNU/Linux

(I let the 2.6.10 machine run for over 20 minutes)


but crashes quickly or after a few minutes (and sometimes segfaults on
Ctrl-C) on:

(5.8.7) 2.6.8-2-mckinley-smp #1 SMP ia64 GNU/Linux
(5.8.4) 2.6.8.1.20040829 #1 SMP i686 GNU/Linux
(5.8.4) 2.4.25 #6 SMP i686 GNU/Linux
(5.8.4) 2.4.27.20040829 #5 SMP i686 GNU/Linux


it seems to crash with different errors, depending on what machine I
run it on. I've received:

--
panic: destruct destroyed thread 0@a\uffffl0@l0@ during global
destruction.
Segmentation fault
--
(in cleanup) panic: destruct destroyed thread 828c0e8 (no reference) at
../test.pl line 23.
panic: MUTEX_DESTROY (16) [threads.xs:152] during global destruction.
Segmentation fault
--


Does anyone have any ideas, or suggestions for further debugging?


Thanks,

-stefan
 
X

xhoster

sgromoll said:
hmmm, i tried this on a few other machines as well, it seems to crash
on work with some setups and not with others.

It does not seem to crash (after 10 minutes or so anyway) on:

(5.8.4) 2.6.10-5-386 #1 i686 GNU/Linux
(5.8.0) 2.4.21-4.ELsmp #1 SMP i686 i686 i386 GNU/Linux
and from Xho in his posting below (Xho, did you let these run for a few
minutes?):

Yep, over an hour.
(5.8.3) 2.6.5-7.97-smp #1 SMP x86_64 x86_64 x86_64 GNU/Linux
(5.8.0) 2.4.21-15.0.3.ELsmp #1 SMP i686 unknown unknown GNU/Linux



(I let the 2.6.10 machine run for over 20 minutes)

but crashes quickly or after a few minutes (and sometimes segfaults on
Ctrl-C) on:

(5.8.7) 2.6.8-2-mckinley-smp #1 SMP ia64 GNU/Linux
(5.8.4) 2.6.8.1.20040829 #1 SMP i686 GNU/Linux
(5.8.4) 2.4.25 #6 SMP i686 GNU/Linux
(5.8.4) 2.4.27.20040829 #5 SMP i686 GNU/Linux

it seems to crash with different errors, depending on what machine I
run it on. I've received:

--
panic: destruct destroyed thread 0@a\uffffl0@l0@ during global
destruction.
Segmentation fault
--
(in cleanup) panic: destruct destroyed thread 828c0e8 (no reference) at
./test.pl line 23.
panic: MUTEX_DESTROY (16) [threads.xs:152] during global destruction.
Segmentation fault

There is the potential for something like a fork-bomb here. I can see
where some machines, given some vaguary of the scheduler, could be spawning
threads faster than they are ending. Do you know what the maximum number
of threads in existence at once is, on the machines which are crashing?
 
S

sgromoll

I added a print statement with a counter in the main thread, and the
program crashes after as few as 3 threads have been created (sometimes
it makes it up to 50 or so). It seems to be more of a timing issue,
since I originally experienced this problem with my server app, which
had at most around 10 threads going at a time, and which ran fine for a
long time before experiencing this problem. I figured that it must
crash when two threads hit the lock() around the same time, so I wrote
this test program.

any other suggestions?

-stefan
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,962
Messages
2,570,134
Members
46,690
Latest member
MacGyver

Latest Threads

Top