harmony-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tim Ellison <t.p.elli...@gmail.com>
Subject Re: [jira] Created: (HARMONY-6328) [classlib][nio] optimize SocketChannel.write(ByteBuffer[], int, int) by writev
Date Wed, 16 Sep 2009 12:08:51 GMT
On 15/Sep/2009 09:51, Regis wrote:
> Tim Ellison wrote:
>> On 15/Sep/2009 04:26, Regis wrote:
>>> Tim Ellison wrote:
>>>> (2) Not sure if any JNI implementations will care, but AIUI you only
>>>> should call ReleaseByteArrayElements if you got a copy of the array
>>>> (i.e. as indicated by the GetByteArrayElements).
>>> I had the puzzle too, and did some searches, I found HARMONY-1634, not
>>> sure it's just suitable for drlvm, but "The Get.. Release pair can be
>>> used to prevent GC during the operation" seems reasonable, so I followed
>>> it.
>> My point was that, AIUI, the Release should only be called if the Get
>> returned a copy, and you are not checking whether the Get returned a
>> copy or not.  In practice, it probably doesn't matter anyway.
> AIUI, If Get pinned java heap, the pinned array will be locked to
> prevent GC collect or move it, Release will unlock it. So I think
> Release should be called anyway, like we did in HARMONY-1634.

The Get* function will tell you if it has been pinned or copied via the
isCopy argument.  However, as I read the spec [1] I think you are right
that Release* should/could be called every time (which is likely a
trivial operation for pinned arrays anyway).

I was looking at the Essential JNI book [2] reference page that says,
"This value [isCopy] should be tested to determine if a call to
Release<pType>ArrayElements needs to be called." (p.378)

I normally wrap the Release* function call in an if(isCopy == JNI_TRUE)
conditional, but maybe more by habit than necessity.

I agree it is different for GetPrimitiveArrayCritical (which was the
subject of HARMONY-1634).

[2] http://www.amazon.com/Essential-Jni-Java-Native-Interface/dp/0136798950


View raw message