RFR: 8244936: Reduce JNI overhead of accessing FileDescriptor

Alan Bateman Alan.Bateman at oracle.com
Wed May 13 18:31:36 UTC 2020


On 13/05/2020 16:44, Claes Redestad wrote:
> Hi,
>
> compilers can't see though and optimize away the repeated GetObjectField
> calls in places such as in the io_util_md.h GET_FD macro:
>
> #define GET_FD(this, fid) \
>     (*env)->GetObjectField(env, (this), (fid)) == NULL ? \
>         -1 : (*env)->GetIntField(env, (*env)->GetObjectField(env, 
> (this), (fid)), IO_fd_fdID)
>
> This can be avoided if we turn the macros into functions which call
> GetObjectField only once:
>
> FD getFD(JNIEnv *env, jobject this, jfieldID fid) {
>   jobject fd = (*env)->GetObjectField(env, this, fid);
>   if (fd == NULL) {
>     return -1;
>   }
>   return (*env)->GetIntField(env, fd, IO_fd_fdID);
> }
>
> The similarly affected SET_FD is only used in one place, so I removed
> that macro and applied the equivalent optimization at the call-site.
The Windows implementation returns a HANDLE rather than an int fd so 
there is a bit inconsistency when compared to the network code. This 
pre-dates your change and technical debt that will need attention some 
time. Your changes look good.

-Alan


More information about the core-libs-dev mailing list