develooper Front page | perl.perl5.porters | Postings from October 2005

[perl #37133] perl crash related to threads and lock()

From:
Steve Peters via RT
Date:
October 29, 2005 22:02
Subject:
[perl #37133] perl crash related to threads and lock()
Message ID:
rt-3.0.11-37133-123495.10.0410227259454@perl.org
> [nicholas - Mon Sep 12 04:07:05 2005]:
> 
> On Sat, Sep 10, 2005 at 01:58:33PM -0700, sgromoll @ grad. physics.
>    sunysb. edu wrote:
> 
> > When perl crashes it gives one of the following errors, depending on
>    the
> > platform:
> >
> > ==
> > panic: destruct destroyed thread 0@a\uffffl0@l0@ during global
> > destruction.
> > Segmentation fault
> 
> I get this. So I an it under valgrind. I got something stranger:
> 
> $ PERL_CORE=1 valgrind --db-attach=yes --db-command='gdb %f %p'
>    --num-callers=20 --tool=memcheck ./perl -Ilib bug37133==22320==
>    Memcheck, a memory error detector for x86-linux.==22320== Copyright
>    (C) 2002-2004, and GNU GPL'd, by Julian Seward.==22320== Using
>    valgrind-2.1.1, a program supervision framework for x86-
>    linux.==22320== Copyright (C) 2000-2004, and GNU GPL'd, by Julian
>    Seward.==22320== For more details, rerun with: -v==22320==
> vg_alloc_ThreadState: no free slots available
> Increase VG_N_THREADS, rebuild and try again.
> 
> valgrind: the `impossible' happened:
>    VG_N_THREADS is too low
> Basic block ctr is approximately 123300000
> ==22320==    at 0xB802A070: vgPlain_core_panic (in
>    /usr/lib/valgrind/stage2)
> ==22320==    by 0xB802A06F: panic (in /usr/lib/valgrind/stage2)
> ==22320==    by 0xB802A084: vgPlain_core_panic (in
>    /usr/lib/valgrind/stage2)
> ==22320==    by 0xB800CB7D: vg_alloc_ThreadState (in
>    /usr/lib/valgrind/stage2)
> ==22320==    by 0xB800F514: do__apply_in_new_thread (in
>    /usr/lib/valgrind/stage2)
> ==22320==    by 0xB8011A03: do_client_request (in
>    /usr/lib/valgrind/stage2)
> ==22320==    by 0xB800DF33: vgPlain_scheduler (in
>    /usr/lib/valgrind/stage2)
> ==22320==    by 0xB802567B: main (in /usr/lib/valgrind/stage2)
> 
> sched status:
> 
> Thread 1: status = Runnable, associated_mx = 0x0, associated_cv = 0x0
> ==22320==    at 0x3C0A3061: pthread_create (vg_libpthread.c:927)
> ==22320==    by 0x3C0260D4: Perl_ithread_create (threads.xs:521)
> ==22320==    by 0x3C0268F3: XS_threads_new (threads.xs:686)
> ==22320==    by 0x80FA247: Perl_pp_entersub (pp_hot.c:2788)
> ==22320==    by 0x80D1C7A: Perl_runops_debug (dump.c:1597)
> ==22320==    by 0x80673A4: S_run_body (perl.c:2274)
> ==22320==    by 0x8066DAA: perl_run (perl.c:2201)
> ==22320==    by 0x806061D: main (perlmain.c:103)
> 
> Thread 2: status = WaitJoiner, associated_mx = 0x0, associated_cv =
>    0x0
> ==22320==    at 0x3C0A2BD0: thread_exit_wrapper (vg_libpthread.c:732)
> ==22320==    by 0x3C0A2D7E: thread_wrapper (vg_libpthread.c:838)
> ==22320==    by 0xB800F4C8: do__quit (in /usr/lib/valgrind/stage2)
> 
> Thread 3: status = WaitMX, associated_mx = 0x3C02946C, associated_cv =
>    0x0
> ==22320==    at 0x3C0A38AB: pthread_mutex_lock (vg_libpthread.c:1160)
> ==22320==    by 0x3C025819: Perl_ithread_run (threads.xs:326)
> ==22320==    by 0x3C0A2D78: thread_wrapper (vg_libpthread.c:837)
> ==22320==    by 0xB800F4C8: do__quit (in /usr/lib/valgrind/stage2)
> 
> Thread 4: status = WaitMX, associated_mx = 0x3C02946C, associated_cv =
>    0x0
> ==22320==    at 0x3C0A38AB: pthread_mutex_lock (vg_libpthread.c:1160)
> ==22320==    by 0x3C025819: Perl_ithread_run (threads.xs:326)
> ==22320==    by 0x3C0A2D78: thread_wrapper (vg_libpthread.c:837)
> ==22320==    by 0xB800F4C8: do__quit (in /usr/lib/valgrind/stage2)
> 
> Thread 5: status = WaitMX, associated_mx = 0x3C02946C, associated_cv =
>    0x0
> ==22320==    at 0x3C0A38AB: pthread_mutex_lock (vg_libpthread.c:1160)
> ==22320==    by 0x3C0249AD: Perl_ithread_destruct (threads.xs:105)
> ==22320==    by 0x3C0257CB: Perl_ithread_run (threads.xs:322)
> ==22320==    by 0x3C0A2D78: thread_wrapper (vg_libpthread.c:837)
> ==22320==    by 0xB800F4C8: do__quit (in /usr/lib/valgrind/stage2)
> 
> [and so on]
> 
> Thread 99: status = WaitMX, associated_mx = 0x3C02946C, associated_cv
>    = 0x0
> ==22320==    at 0x3C0A38AB: pthread_mutex_lock (vg_libpthread.c:1160)
> ==22320==    by 0x3C0249AD: Perl_ithread_destruct (threads.xs:105)
> ==22320==    by 0x3C0257CB: Perl_ithread_run (threads.xs:322)
> ==22320==    by 0x3C0A2D78: thread_wrapper (vg_libpthread.c:837)
> ==22320==    by 0xB800F4C8: do__quit (in /usr/lib/valgrind/stage2)
> 
> 
> Note: see also the FAQ.txt in the source distribution.
> It contains workarounds to several common problems.
> 
> If that doesn't help, please report this bug to: valgrind.kde.org
> 
> In the bug report, send all the above text, the valgrind
> version, and what Linux distro you are using.  Thanks.
> 
> 
> 
> 
> Am I right in thinking that this suggests that the threads
>    implementation has a
> deadlock of some sort here?
> 
> Even taking out the "obvious" deadlock doesn't make the bug go away:
> 
> ==== //depot/perl/ext/threads/threads.xs#86 -
>    /home/nick/p4perl/perl/ext/threads/threads.xs ====
> --- /tmp/tmp.23174.0    2005-09-12 12:07:37.000000000 +0100
> +++ /home/nick/p4perl/perl/ext/threads/threads.xs       2005-09-12
>    12:03:23.000000000 +0100
> @@ -96,6 +96,7 @@ Perl_ithread_destruct (pTHX_ ithread* th
>          PerlInterpreter *freeperl = NULL;
>         MUTEX_LOCK(&thread->mutex);
>         if (!thread->next) {
> +           MUTEX_UNLOCK(&thread->mutex);
>             Perl_croak(aTHX_ "panic: destruct destroyed thread %p
>    (%s)",thread, why);
>         }
>         if (thread->count != 0) {
> 
> 
> The alternative crash mode I can create is:
> 
> (gdb) p thread->prev
> $3 = (struct ithread_s *) 0x0
> 
> which unsurprisingly causes this to SEGV:
> 
> 	    thread->next->prev = thread->prev;
> 
> 
> 
> So, also, somehow it's looking like a thread can get freed up without
> correctly tidying up the linked list.
> 

The patch above was applied as change #25442.



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About