[cfe-dev] atomic intrinsics
Howard Hinnant
hhinnant at apple.com
Fri Oct 8 10:40:01 PDT 2010
On Oct 7, 2010, at 7:57 PM, Jeffrey Yasskin wrote:
> On Thu, Oct 7, 2010 at 7:26 AM, Howard Hinnant <hhinnant at apple.com> wrote:
>> Thanks Jeffrey, comments below:
>>
>> On Oct 7, 2010, at 4:58 AM, Jeffrey Yasskin wrote:
>>> * I'm not sure if you want this in the API doc, but the choice of
>>> mutex vs. lock-free instructions to implement each size/type is an ABI
>>> decision, and that needs to be noted somewhere for each target. That
>>> is, if clang-2.9 implements the 16-byte atomic by calling out to
>>> compiler-rt, which uses a spinlock to make it atomic, and then
>>> clang-2.10 implements it by using the cmpxchg16b instruction, that's
>>> an ABI change. To avoid ABI changes, we'd need to implement all the
>>> atomics up to the largest platform-supported size using instructions
>>> in the first version that supports them at all.
>>
>> I haven't taken action yet on this as I'm not yet sure how to modify the design doc. Your point reminded me of something else:
>>
>> The library has functions that look like:
>>
>> bool atomic_is_lock_free(const volatile type*);
>> bool atomic_is_lock_free(const atomic_itype*);
>>
>> To implement this, the library must be able to ask the compiler this question in some way. So perhaps I should add to the list of intrinsics:
>>
>> bool __atomic_is_lock_free(const type*); // volatile implied by comment just added to A
>>
>> Does the existence of this intrinsic mitigate your ABI concern? I.e. if the client cares about this ABI, he has to query it.
>
> I don't think it mitigates the ABI concern, although I could be wrong.
> Say you have:
>
> TU1.cc
> -----------
> atomic<long long> A;
> int foo() { return A.load(); }
>
> TU2.cc
> -----------
> extern atomic<long long> A;
> void bar() { A.store(3); }
>
>
> How would I use __atomic_is_lock_free() to make those link together
> thread-safely if one's compiled with a version where long long is lock
> free, and the other is compiled with a version where it's locked?
I've updated:
http://libcxx.llvm.org/atomic_design.html
with this concern. And I've added:
bool __atomic_is_lock_free(const type* atomic_obj);
to:
http://libcxx.llvm.org/atomic_design_a.html
http://libcxx.llvm.org/atomic_design_b.html
-Howard
More information about the cfe-dev
mailing list