I think it is a real data races bugs, or an order violation(the order of two
write operations), look at the following the scenario, (we just treat *lock)
 as a normal global shared struct variable X and it has two membersas:
   struct X {
        BOOL initialized_flags
        int data
    }

struct X x;
thread1:

     if( x.data == NULL)  {
        lock
            x.initialized_flags =
            x.data = initialized_variables
         unlock
      }
      = x.data ( it's first use)

we must enforce that x.data is used after  its initialization.  I think your
fix  is a very good fix.  Please file a bug in the bugzillar.

Thanks for your great finding.

Tianwei

On Tue, Sep 21, 2010 at 1:21 PM, Jiangzhou HE <hejiangz...@gmail.com> wrote:

> Hi, all,
>
> I found a bug in osprey/libopenmp/omp_lock.c. See the following function:
>
> inline void
> __ompc_critical(int gtid, volatile ompc_lock_t **lck)
> {
>   if (**lck == NULL*) { *//(1)*
>     __ompc_lock_spinlock(&_ompc_thread_lock);
>     if ((ompc_lock_t*)*lck == NULL){
>       // put the shared data aligned with cache line
> *      *lck = aligned_malloc(sizeof(ompc_lock_t), CACHE_LINE_SIZE); //(2)
> *      Is_True(*lck!=NULL,
>               ("Cannot allocate lock memory for critical"));
> *      __ompc_init_lock (*lck); //(3)*
>     }
>     __ompc_unlock_spinlock(&_ompc_thread_lock);
>   }
>   *__ompc_lock((volatile ompc_lock_t *)*lck);* *//(4)*
> }
>
> Bug happens in the following execution sequence:
>
> thread1   thread2
> (1)
> (2)
>             (1)
>             (4)   *// Error! Trying to lock a uninitialized lock.*
> (3)
>
> This is my patch of this bug:
>
> diff --git a/osprey/libopenmp/omp_lock.c b/osprey/libopenmp/omp_lock.c
> index 0781647..718117c 100644
> --- a/osprey/libopenmp/omp_lock.c
> +++ b/osprey/libopenmp/omp_lock.c
> @@ -197,10 +197,11 @@ __ompc_critical(int gtid, volatile ompc_lock_t **lck)
>      __ompc_lock_spinlock(&_ompc_thread_lock);
>      if ((ompc_lock_t*)*lck == NULL){
>        // put the shared data aligned with cache line
> -      *lck = aligned_malloc(sizeof(ompc_lock_t), CACHE_LINE_SIZE);
> -      Is_True(*lck!=NULL,
> +      volatile ompc_lock_t* new_lock = aligned_malloc(sizeof(ompc_lock_t),
> CACHE_LINE_SIZE);
> +      Is_True(new_lock!=NULL,
>               ("Cannot allocate lock memory for critical"));
> -      __ompc_init_lock (*lck);
> +      __ompc_init_lock (new_lock);
> +      *lck = new_lock;
>      }
>      __ompc_unlock_spinlock(&_ompc_thread_lock);
>    }
>
> Could the gatekeeper help to review this patch?
>
> Thanks!
>
> Jiangzhou
>
> --
> Jiangzhou HE (何江舟)
>
> Institute of High-Performance Computing
> Department of Computer Science and Technology
> Tsinghua University, Beijing, China
>
>
>
> ------------------------------------------------------------------------------
> Start uncovering the many advantages of virtual appliances
> and start using them to simplify application deployment and
> accelerate your shift to cloud computing.
> http://p.sf.net/sfu/novell-sfdev2dev
> _______________________________________________
> Open64-devel mailing list
> Open64-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/open64-devel
>
>


-- 
Sheng, Tianwei
Inst. of High Performance Computing
Dept. of Computer Sci. & Tech.
Tsinghua Univ.
------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to