Request for reviews (M): 7009756: volatile variables could be broken throw reflection API

David Holmes David.Holmes at oracle.com
Mon Jan 3 19:28:57 PST 2011


David Holmes said the following on 01/04/11 13:01:
> Further, note that the specification for Unsafe does not make it clear 
> that these methods are supposed to implement the atomicity properties of 
> Java volatiles, as opposed to simply adhering to the memory model 
> properties.

Ignore the above - the usage by AtomicLongFieldUpdater makes it clear 
that 64-bit atomic access is expected/required.

David

> 
> David
> 
> David Holmes said the following on 01/04/11 12:48:
>> Vladimir Kozlov said the following on 01/04/11 12:28:
>>> http://cr.openjdk.java.net/~kvn/7009756/webrev
>>>
>>> Fixed 7009756: volatile variables could be broken throw reflection API
>>>
>>> Unsafe_SetLongVolatile() and Unsafe_GetLongVolatile() are not atomic
>>> on 32 bit x86 (C++ generates two 32 bit loads/stores).
>>>
>>> Use Atomic::load() and Atomic::store() to access a volatile long.
>>>
>>> Verified with bug's test on all 32 bit platforms. Passed JPRT.
>>
>> Hold up there! The Unsafe code uses supports_cx8 to determine whether 
>> atomic 64-bit operations are supported, and if not it falls back to 
>> using explicit locking. This change totally removes that for these 
>> methods and so breaks all platforms where cx8 is not supported.
>>
>> If anything is wrong it is these macros:
>>
>>  155 #define GET_FIELD_VOLATILE(obj, offset, type_name, v) \
>>  156   oop p = JNIHandles::resolve(obj); \
>>  157   volatile type_name v = *(volatile 
>> type_name*)index_oop_from_field_offset_long(p, offset)
>>  158
>>  159 #define SET_FIELD_VOLATILE(obj, offset, type_name, x) \
>>  160   oop p = JNIHandles::resolve(obj); \
>>  161   *(volatile type_name*)index_oop_from_field_offset_long(p, 
>> offset) = x; \
>>  162   OrderAccess::fence();
>>  163
>>
>> because we should be using a load/store mechanism that is aware of the 
>> volatile aspect and so enforces the 64-bit atomicity requirement at a 
>> lower level. Such a mechanism already exists for regular volatile 
>> variable support.
>>
>> David


More information about the hotspot-dev mailing list