On 03/13/12 14:47, Panagiotis Foteinos wrote:
> Hello grinders.
>
> So, I find it difficult to see the race. Below, the valgrind DRD output 
> follows:
>
> **************************************************************
> Conflicting load by thread 1 at 0x1221c91c size 4
> ==4907==    at 0x5B7028: Parallel_Mesh_Generation::try_lock(Vertex*,
> int) (Parallel_Mesh_Generation.cxx:2224)
> ......
>
>  Other segment start (thread 9)
> ==4907==    at 0x4C352A0: pthread_mutex_unlock (drd_pthread_intercepts.c:665)
> ==4907==    by 0x5CB1E9: boost::mutex::unlock() (mutex.hpp:61)
> ==4907==    by 0x5C96DE: Parallel_Mesh_Generation::UpdateNewCells(int,
> Simple_Containers::Vector<Cell*>&) (Parallel_Mesh_Generation.cxx:8909)
> ==4907==    by 0x5B3FC7: Parallel_Mesh_Generation::client_insert(int
> const&, Point const&, Cell*) (Parallel_Mesh_Generation.cxx:790)
>
> Other segment end (thread 9)
> ==4907==    at 0x6E13464: __lll_lock_wait (lowlevellock.S:136)
> ==4907==    by 0x6E0E5D8: _L_lock_953 (pthread_mutex_lock.c:117)
> ==4907==    by 0x6E0E3F9: pthread_mutex_lock (pthread_mutex_lock.c:61)
> ==4907==    by 0x4C362AF: pthread_mutex_lock (drd_pthread_intercepts.c:614)
> ==4907==    by 0x5CB182: boost::mutex::lock() (mutex.hpp:52)
> ==4907==    by 0x5C9661: Parallel_Mesh_Generation::UpdateNewCells(int,
> Simple_Containers::Vector<Cell*>&) (Parallel_Mesh_Generation.cxx:8900)
> ==4907==    by 0x5B3FC7: Parallel_Mesh_Generation::client_insert(int
> const&, Point const&, Cell*) (Parallel_Mesh_Generation.cxx:790)
> **************************************************************
>
> According to DRD, there is a race when thead 1 is at line 2224, and
> thread 9 is at the lines 8900-8909, correct?
>
> Below, the relevant code lines are attached:
>
> **************************************************************
> Thread 1:
> if(v->thread_id == thread_id)
>     //line 2224
> **************************************************************
>
> and
> **************************************************************
> Thread 9:
>       this->utilization_mtx.lock();
>  //line 8900
>       if(this->threads_without_work != 0)
>       {
>               this->threads_without_work--;
>
> #ifdef REPORT_COUNTERS
>               (*this->begging_list_not_empty[thread_id])++;
> #endif
>               other_id = 
> this->beggers[(this->beg_index_start++)%this->number_of_threads];
>               this->utilization_mtx.unlock();                         //line 
> 8909
> **************************************************************
>
> The variable "thread_id" in Thread 9 is local to its stack. It has
> nothing to do with either "v->thread_id"  or "thread_id" of Thread 1.
> Is this a false positive, or the drd message says something else?

It might be a race on v or v->thread_id as well. A convenient way to
analyze this further is to insert DRD_TRACE_VAR(thread_id) in the
constructor of the object v points at and to insert
DRD_TRACE_VAR(thread_id) just after the declaration of the thread_id
stack variable(s).

Bart.

------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to