On Wed, Jun 2, 2010 at 3:12 AM, Jorge Moraleda <[email protected]> wrote:
>
> On Sun, May 30, 2010 at 12:56 AM, Jorge Moraleda
> <[email protected]> wrote:
> > On Sat, May 29, 2010 at 10:56 PM, Bart Van Assche <[email protected]> 
> > wrote:
> >> On Sat, May 29, 2010 at 7:00 PM, Jorge Moraleda
> >> <[email protected]> wrote:
> >>>
> >>> I submitted a condition variable not initialized detected with
> >>> valgrind drd to the boost mailing list, but they report that it is a
> >>> false alarm:
> >>>
> >>> Date: Sat, 29 May 2010 09:29:23 +0400
> >>> From: Andrey Semashev <[email protected]>
> >>>
> >>> On 05/29/2010 02:06 AM, Jorge Moraleda wrote:
> >>> > When testing boost.log for race conditions using valgrind drd, some
> >>> > non initialized condition variables are reported at initialization
> >>> > time. I am using Valgrind-3.6.0.SVN and gcc version 4.4.4 (Debian
> >>> > 4.4.4-1).
> >>>
> >>> It looks like a false alarm. The condition variable is defined and used
> >>> by boost::once, and it is initialized statically in the Boost.Thread
> >>> library.
> >>>
> >>> > These are the valgrind error messages:
> >>>
> >>> ==27651== condition variable has not been initialized: cond 0x6174420
> >>> ==27651==    at 0x4C267B9: pthread_cond_broadc...@*
> >>> (drd_pthread_intercepts.c:756)
> >>> ==27651==    by 0x66DBCD2: ??? (in /usr/local/lib/libboost_log.so.1.42.0)
> >>> ==27651==    by 0x6719E85: ??? (in /usr/local/lib/libboost_log.so.1.42.0)
> >>> ==27651==    by 0x66C4BD2: ??? (in /usr/local/lib/libboost_log.so.1.42.0)
> >>> ==27651==    by 0x7FF000561: ???
> >>> ==27651==    by 0x722F63762F656771: ???
> >>> ==27651==    by 0x2F6E69622F657068: ???
> >>> ==27651==    by 0x722F726576726572: ???
> >>> ==27651==    by 0x767265732D657068: ???
> >>> ==27651==    by 0x2D2D00772D007264: ???
> >>> ==27651==    by 0x72635F776F6C6C60: ???
> >>> ==27651==    by 0x62645F65746164: ???
> >>> ==27651==
> >>> [ ... ]
> >>
> >> Until version 3.5.0 DRD was complaining about every condition variable
> >> not initialized by calling pthread_cond_init(). Statically initialized
> >> condition variables should be handled properly by trunk r11139. Are
> >> you familiar with building Valgrind from the trunk ? If so, can you
> >> please test this fix ?
> >
> > Those errors were obtained with version 3.6.0 from svn compiled a few
> > weeks ago. I will download the latest one on Tuesday and try it.
>
> After getting the latest valgrind from svn earlier today and rerunning
> my program I get the following error at start time (see below)
> followed by valgrind's termination. (as a sanity check, memcheck has
> no problem running). I have also upgraded boost log (which I run from
> svn) and my kernel (debian sid). I have no problem using drd on other
> programs (see separate message).
>
> ==18783== drd, a thread error detector
> ==18783== Copyright (C) 2006-2010, and GNU GPL'd, by Bart Van Assche.
> ==18783== Using Valgrind-3.6.0.SVN and LibVEX; rerun with -h for copyright 
> info
> ==18783== Command: /home/jorge/vc/ripe/bin/features/compute-features
> ==18783==
>
> drd: drd_cond.c:420 (vgDrd_cond_pre_broadcast): Assertion
> 'DRD_(pthread_cond_initializer)' failed.
> ==18783==    at 0x38018C57: report_and_quit (m_libcassert.c:191)
> ==18783==    by 0x38018E90: vgPlain_assert_fail (m_libcassert.c:265)
> ==18783==    by 0x38002AEB: vgDrd_cond_pre_broadcast (drd_cond.c:420)
> ==18783==    by 0x38001D89: handle_client_request (drd_clientreq.c:359)
> ==18783==    by 0x3805380E: vgPlain_scheduler (scheduler.c:1560)
> ==18783==    by 0x3807CB14: run_a_thread_NORETURN (syswrap-linux.c:94)
>
> sched status:
>  running_tid=1
>
> Thread 1: status = VgTs_Runnable
> ==18783==    at 0x4C287B9: pthread_cond_broadc...@*
> (drd_pthread_intercepts.c:771)
> ==18783==    by 0x679FCD2: ??? (in
> /opt/boost/boost_1_42_0/stage/lib/libboost_log.so.1.42.0)
> ==18783==    by 0x67DDE85: ??? (in
> /opt/boost/boost_1_42_0/stage/lib/libboost_log.so.1.42.0)
> ==18783==    by 0x6788BD2: ??? (in
> /opt/boost/boost_1_42_0/stage/lib/libboost_log.so.1.42.0)
> [ ... ]

I have been able to reproduce this behavior with a version of
libboost_log.so built with debug information and obtained the
following call stack:

Thread 1: status = VgTs_Runnable
at 0x4C2AA69: pthread_cond_broadc...@* (drd_pthread_intercepts.c:771)
by 0x405D54: void boost::call_once<void (*)()>(boost::once_flag&, void
(*)()) (once.hpp:78)
by 0x4ED1DAD: global constructors keyed to named_scope.cpp (in
/usr/lib/libboost_log.so.1.43.0)

This means that pthread_cond_broadcast() was called from a global
constructor in libboost_log.so before the initialization function in
vgpreload_drd-amd64-linux.so (DRD_(init)) was called. I was surprised
seeing constructors being called in this order. Julian, is this a
normal behavior of the Valgrind core ?

To Jorge: the reported DRD issue should have been fixed by r11145.

Bart.

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Valgrind-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to