On 06/13/2010 11:28 PM, Paul E. McKenney wrote:
On Sun, Jun 13, 2010 at 05:20:34PM -0400, Mathieu Desnoyers wrote:
* Paul E. McKenney ([email protected]) wrote:
On Thu, Jun 10, 2010 at 09:46:31PM -0400, Mathieu Desnoyers wrote:

[...]

(will reply to the rest in the individual patches)

Can we trust __sync_lock_test_and_set/__sync_add_and_fetch given that
__sync_synchronize is broken ?

I don't know yet.  If it turns out that we cannot, then I will use some
form of global locking.  But the __sync_lock_test_and_set() do at least
generate instructions, unlike __sync_synchronize().  ;-)

I'm concerned about the fact that their synchronization primitives might have
the assembly all with, except for the memory barriers.

The default implementation of these __sync_* builtins is based on cmpxchg, and will cause a link error unless cmpxchg is also available (either in libgcc or with a compiler-provided inline implementation).

Instead, the default implementation of __sync_synchronize is to just do a compiler barrier. ARM implements __sync_synchronize only for Linux, so at least there it is not needed. Strange that Paul needs it too.

Anyway, a simple configure test is to compile this with -fdump-rtl-expand:

        int
        f()
        {
          __sync_synchronize();
        }

If the assembly output includes "__sync_synchronize", or the dump file includes the text "unspec:BLK", it should be fine. In particular, ia64, mips, and Alpha are ok. Else you can use the pthreads trick. I can try to make a patch if you're interested. Or, more simply, it's possible to hardcode the above three platforms since it's unlikely that others will be added soon.

Paolo

_______________________________________________
ltt-dev mailing list
[email protected]
http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev

Reply via email to