Unasafe.putOdered -> Unsafe.releasePut
David Holmes
david.holmes at oracle.com
Tue Mar 10 11:11:05 UTC 2015
On 10/03/2015 6:32 PM, Paul Sandoz wrote:
> On Mar 10, 2015, at 3:06 AM, David Holmes <david.holmes at oracle.com> wrote:
>>>>
>>>> So for example, j.u.c.atomic lazySet is defined as providing:
>>>>
>>>> * <li> {@code lazySet} has the memory effects of writing (assigning)
>>>> * a {@code volatile} variable except that it permits reorderings with
>>>> * subsequent (but not previous) memory actions that do not themselves
>>>> * impose reordering constraints with ordinary non-{@code volatile}
>>>> * writes.
>>>>
>>>> and is implemented by a call to Unsafe.putOrdered, which in turn is implemented by doing a full volatile write, which is OrderAccess::release_store_fence.
>>>
>>> I don't observe that from looking at the C2 code, nor from the generated x86 code. Its implemented like a release_store and used accordingly with that in mind.
>>
>> I was referring to the non-intrinsified version of Unsafe:
>>
>> // The non-intrinsified versions of setOrdered just use setVolatile
>>
>> UNSAFE_ENTRY(void, Unsafe_SetOrderedInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint x))
>> UnsafeWrapper("Unsafe_SetOrderedInt");
>> SET_FIELD_VOLATILE(obj, offset, jint, x);
>> UNSAFE_END
>>
>> and IIRC that was something Martin complained about a few weeks back.
>>
>
> Ah! ok.
>
>
>> Okay in that case aligning the names makes more sense - and we should fix the the non-intrinsic form. :)
>>
>
> When would that non-intrinsified version be used, just for the interpreter?
Yes.
> I suppose it could be changed, but it does not seem absolutely necessary to do so. What's currently there seems a pragmatic solution to me given what happens when C1/C2 kick in.
No not essential to fix when you have the JIT - may be more of a concern
in interpreter only environments.
David
> Paul.
>
More information about the hotspot-dev
mailing list