RFR: 8186166: Generalize Atomic::cmpxchg with templates
Andrew Haley
aph at redhat.com
Fri Aug 18 14:08:44 UTC 2017
On 18/08/17 14:21, Andrew Haley wrote:
> More seriously, IMO: accessing a stored pointer to X as though it had
> been stored as a void* is certainly undefined behaviour, by the rule
> you point out above. It seems to me that you are worried about some
> things that are relatively minor, while ignoring things that are
> serious.
>
> If you followed the approach of never converting the type of the
> pointer to dest to some other point, *but instead converting the types
> of exchange_value and compare_value* everything would be fine. This
> whole thing could be done with no UB at all.
Looking at your patch again, I think that I've got this wrong: you're
doing it the right way here:
struct Atomic::CmpxchgImpl<
T*, D*, U*,
typename EnableIf<Atomic::IsPointerConvertible<T*, D*>::value &&
IsSame<typename RemoveCV<D>::type,
typename RemoveCV<U>::type>::value>::type>
VALUE_OBJ_CLASS_SPEC
{
D* operator()(T* exchange_value, D* volatile* dest, U* compare_value,
cmpxchg_memory_order order) const {
// Allow derived to base conversion, and adding cv-qualifiers.
D* new_value = exchange_value;
// Don't care what the CV qualifiers for compare_value are,
// but we need to match D* when calling platform support.
D* old_value = const_cast<D*>(compare_value);
My apologies.
--
Andrew Haley
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671
More information about the hotspot-dev
mailing list