Patch for PR libgomp/37938, IA64 specific.
Jakub Jelinek
jakub@redhat.com
Thu Nov 6 21:35:00 GMT 2008
On Thu, Nov 06, 2008 at 10:33:11AM -0800, Steve Ellcey wrote:
> On Thu, 2008-11-06 at 09:56 -0800, H.J. Lu wrote:
>
> > Shouldn't we use __sync_lock_test_and_set to initialize mutux?
> >
> >
> > H.J.
> > --- libgomp/config/linux/mutex.h.sync 2006-11-18 06:22:18.000000000 -0800
> > +++ libgomp/config/linux/mutex.h 2008-11-06 09:50:46.000000000 -0800
> > @@ -38,7 +38,7 @@ typedef int gomp_mutex_t;
> >
> > static inline void gomp_mutex_init (gomp_mutex_t *mutex)
> > {
> > - *mutex = 0;
> > + __sync_lock_test_and_set (mutex, 0);
> > }
> >
> > extern void gomp_mutex_lock_slow (gomp_mutex_t *mutex);
>
> I was wondering about the initialization but this patch didn't seem to
> fix the test case in PR 37938 when I added it and then removed my
> patches.
Why would mutex initialization need it? A mutex is always initialized
uncontended, so other threads either don't exist at that point, or are
prevented from trying to look it, usually by some other mutex, barrier etc.
I guess the problem is that the __sync_* builtins don't have explicit
acquire vs. release semantics variants. We need to use
__sync_bool_compare_and_swap for locking the mutex, and I believe on ia64
__sync_bool_compare_and_swap has release, not acquire semantics, which is
desirable for mutex lock, and for unlocking the mutex we use
__sync_lock_test_and_set (which has acquire semantics?), but want release
semantics, right? Putting __sync_synchronize into gomp_mutex_unlock
would mean slowing down other targets, for which already
__sync_lock_test_and_set (and __sync_bool_compare_and_swap) act as a full
barrier. So I'm afraid ia64 needs to define config/linux/ia64/mutex.[ch]
which uses __asm instead of __sync builtins.
Jakub
More information about the Gcc-patches
mailing list