JNI ReleasePrimitiveArrayCritical with mode JNI_COMMIT shouldn't end critical region
David Holmes
david.holmes at oracle.com
Wed Dec 6 00:37:29 UTC 2017
Hi Ian,
On 6/12/2017 9:15 AM, Ian Rogers wrote:
> From:
> https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#GetPrimitiveArrayCritical_ReleasePrimitiveArrayCritical
You need to see the updated spec:
https://docs.oracle.com/javase/9/docs/specs/jni/functions.html#getprimitivearraycritical-releaseprimitivearraycritical
That spec makes it clear:
"mode: the release mode (see Primitive Array Release Modes): 0,
JNI_COMMIT or JNI_ABORT. Ignored if carray was a not copy."
In hotspot getCriticalArrayPrimitive never returns a copy so the mode is
always ignored, as per the existing comment.
David
-----
> "The semantics of these two functions are very similar to the existing
> Get/Release<primitivetype>ArrayElements functions. "
>
> https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#Release_PrimitiveType_ArrayElements_routines
>
> "JNI_COMMIT copy back the content but do not free the elems buffer"
>
> Consider the pattern of:
> GetPrimitiveArrayCritical(...)
> ReleasePrimitiveArrayCritical(..., JNI_COMMIT)
> ReleasePrimitiveArrayCritical(..., 0)
>
> where the first release is to just achieve a copy back. For example,
> jniCheck.cpp will copy back but not free a copy in the case of JNI_COMMIT
> for a critical. The implementation of ReleasePrimitiveArrayCritical ignores
> all arguments and so it ends the critical region even in the event of a
> commit.
>
> The attached patch makes ReleasePrimitiveArrayCritical consider the mode
> argument when releasing the GCLocker.
>
> Thanks,
> Ian
>
More information about the hotspot-dev
mailing list