So far as I can see we can eliminate at least some of the clutter of the
calls to deletelocalreference by simply doing it as soon as we are done with the reference

eg

309     familyLC = (*env)->CallObjectMethod(env, fmi->family,
 310                                         fmi->toLowerCaseMID, fmi->locale);


can be immediately followed by :
   DeleteLocalReference(env, familyLC);


.. whether or not there is a pending exception.

and

343     (*env)->CallObjectMethod(env, fmi->familyToFontListMap,
 344                              fmi->putMID, familyLC, fmi->list);

can be immediately followed by :

   DeleteLocalReference(env, fmi->family);
   DeleteLocalReference(env, fmi->list);

.. whether or not there is a pending exception.

and so on.

releaseGdiFontMapReferences() seems to be used right before returning to Java.
The issue with local refs is that you want to avoid too many so
there is no need to do that release before return explicitly since the VM will 
do it for us.
same for the direct calls to deletelocalref.
Do you get any JNI warnings if you remove these ?


I could even argue that some of the ones before return (0) from the enum 
functions
which will cause us to then exit up the call stack fall into the same bucket but
if you can simplify the change as I suggest it'll be easier to sort that out
as there'll be less noise.


-phil.


On 07/04/2016 02:43 AM, Prahalad Kumar Narayanan wrote:
Hello Everyone

Good day to you.

A quick follow-up on the fix for
            Bug ID : JDK-8152971
            Title     : -Xcheck:jni - WARNING in native method

Thanks to Phil for his feedback.
The feedback was not only detailed.. but contained important links for 
reference.

I 've incorporated the review suggestions and have updated the webrev.
Brief on changes from previous revision:

       1. Once an exception has been found in an Up-call, the exception is ' 
not ' consumed or cleared now.
                . As Phil rightly said, this will pave way for the Java methods 
to know of the exceptions and handle them.

       2. In addition to point No.1, The GDI's callback functions return zero 
'0' during an exception.
                . This will stop the subsequent enumeration of fonts & calls to 
registered callbacks through the APIs

       3. Since exceptions are not consumed, all GDI 's callback functions are 
checked for pending exceptions at the entry.
               . On pending exceptions, the GDI's callback functions return 
immediately.
                        . This prevents the functions from invoking any other 
JNI calls that could be un-safe during a pending exception
                        . The callback functions merely release any local 
reference held before returning to caller.

       4. Since we no longer support Win98, the obsolete ANSI versions of 
functions (~A functions) have been removed.
              . Functions that work with Unicode strings invoking Unicode 
versions of Windows APIs (~W functions) are retained.
5. The jtreg shell script has been modified to execute on all platforms after testing its execution on Windows, Linux, Mac and SunOS.
             . Just to re-iterate: The jtreg script fails on windows and 
solaris but in java.lang codebase.
             . A bug is already Open indicating JNI warnings in java.lang 
package. Hence this change does not introduce any new issues.

As with any proposed webrev:
      . The changes were run through internal build system to ensure safe build 
on all supported OS versions.
      . JCK and JTREG test cases were run to ensure no conformance or 
regression failures occur.

Kindly review the changes at your convenience and provide your feedback.
        . Updated webrev link: 
http://cr.openjdk.java.net/~pnarayanan/8152971/webrev.03/

Thank you for your time & effort in review
Have a good day

Prahalad N.

----------------------------------------------------------------------------
From: Philip Race
Sent: Wednesday, June 29, 2016 10:48 PM
To: Prasanta Sadhukhan
Cc: Prahalad Kumar Narayanan; 2d-dev@openjdk.java.net; Jayathirth D V; Praveen 
Srivastava
Subject: Re: [9] Review Request- JDK-8152971- JNI Warning with -Xcheck:jni

https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/design.html#exception_handling

lists DeleteLocalRef as safe to call with a pending exception.

So here ...
74     fullnameLC = (*env)->CallObjectMethod(env, fullname,
  175                                           fmi->toLowerCaseMID, 
fmi->locale);
  176     if ((*env)->ExceptionCheck(env)) {
  177         (*env)->ExceptionClear(env);
  178         /* Delete the created references */
  179         DeleteLocalReference(env, fullname);
  180         return 1;
  181     }

... perhaps what we should do is not clear the exception and
with the goal that after returning from this function we can
check in the caller for a pending exception and return from
JNI to Java *without clearing it* - so that Java code gets
that exception propagated. I suggest this because I think
we would have a correctness issue which should be reported - not
swallowed - if there ever really was one.

I think this means that the GDI callbacks need to check
for a pending exception on entry and bail since once
we hand off to windows it may be called repeatedly.

But also we should stop enumeration if we detect an error
hence we should return 0 in this case, not 1 per the
docs for EnumFontFamExProc

---
https://msdn.microsoft.com/en-us/library/windows/desktop/dd162618(v=vs.85).aspx
Return value

The return value must be a nonzero value to continue enumeration;
  to stop enumeration, the return value must be zero.

---

Also the "A" functions are now obsolete. No win 98 support any more :-)
We should just delete them instead of updating them.

And I'd prefer the test be verified on Solaris rather than excluding it

-phil


On 6/27/16, 10:24 PM, Prasanta Sadhukhan wrote:
Looks good to me. Only thing is in test script, you need to add copyright 2015, 
2016 as the script is originally written in 2015 and you cannot omit the 
created year from the copyright.

Regards
Prasanta
On 6/27/2016 4:17 PM, Prahalad Kumar Narayanan wrote:

Hello Everyone

Good day to you.

Quick follow up to fix for the Bug
        Bug ID     : JDK-8152971
        Bug Link : https://bugs.openjdk.java.net/browse/JDK-8152971

First, Thanks to Prasanta for his review & suggestions.

I 've incorporated some of the review suggestions & updated the webrev.
       Webrev Link : http://cr.openjdk.java.net/~pnarayanan/8152971/webrev.02/

Overview on changes from previous webrev:

1. Code Changes: As Prasanta mentioned,
            The variable fontStrLC should be used in place of fontStr - The 
correction has been taken up.
            And releaseGdiFontMapReferences call is not required when 
GdiFontMapInfo object isn't initialized - The particular invocation has been 
removed.

2. With regard to deleting references held within GdiFontMapInfo struture
           JNI creates local references only for objects that are created at 
the Java side - jobject, jstring and jclass
           The other FMI variables - method IDs are not references to objects. 
Hence invoking deleteLocalRef.. is not valid (may not compile too).

3. The Jtreg shell script - LoadFontsJNICheck.sh was initially written to run 
only on MacOS.
           Since it addresses the bug at hand (which is on windows), I tested 
the script 's execution on Win and Linux.
                 The Jtreg script passes on linux and fails on windows with 
warnings in java.lang codebase.
                 As I understand, there is a JBS bug filed already pertaining 
to JNI warnings in java.lang package.
                 Hence enabling the script on windows, doesn't introduce new 
bug.
           The only OS that the script doesn't run - Solaris.
                 Presently, we don't have a Solaris environment at our facility 
to test the script.
                 Hence the original functionality on Solaris is retained.

Kindly take a look at the changes at your convenience & provide the suggestions.

Thank you for your review
Have a good day

Prahalad N.

----------------------------------------------------------------------------
From: Prasanta Sadhukhan
Sent: Monday, June 27, 2016 11:51 AM
To: Prahalad Kumar Narayanan; 2d-dev@openjdk.java.net
Cc: Philip Race; Jayathirth D V; Praveen Srivastava
Subject: Re: [9] Review Request- JDK-8152971- JNI Warning with -Xcheck:jni

I guess this method(s) should take "fontStrLC" instead of "fontStr"
650             (*env)->CallObjectMethod(env, fontToFileMap, fmi->putMID,
   651                                      fontStr, fileStr);

   692         (*env)->CallObjectMethod(env, fontToFileMap, fmi->putMID,
   693                                  fontStr, fileStr);

762             (*env)->CallObjectMethod(env, fontToFileMap, fmi->putMID,
   763                                      fontStr, fileStr);

805         (*env)->CallObjectMethod(env, fontToFileMap, fmi->putMID,
   806                                  fontStr, fileStr);
It seems this line is not needed as we have not populated fmi structure yet.
882         releaseGdiFontMapReferences(env, &fmi);

Why aren't we deleting fmi->env,fmi.arrayListCtr,fmi.addMID,fmi.putMID  in 
releaseGdiFontMapReferences()?

Also, it seems earlier the testscript was supposed to execute only on Mac but 
now you are extending the execution platform to windows and linux as well 
excluding only solaris.
Is there any particular need to restrict solaris too?

Regards
Prasanta


On 6/24/2016 7:34 PM, Prahalad Kumar Narayanan wrote:
Hello Everyone on Java2D Forum
Good day to you.
A Quick follow-up on webrev to fix the following issue
        Bug ID     : JDK-8152971  / -Xcheck:jni - warning in native method
        Bug Link : https://bugs.openjdk.java.net/browse/JDK-8152971?filter=-1
Updated webrev link:  http://cr.openjdk.java.net/~pnarayanan/8152971/webrev.01/
Description on Changes
        . The previous webrev contained changes to additional files which are 
not related to the current bug in concern.
        . Henceforth, the updated webrev limits the changes to only fontpath.c 
and a Jtreg test script to verify the change.
Regarding Build & Test
        . Though the changes pertain to windows specific code, internal build 
system was triggered to ensure safe build on all supported platforms.
        . In addition, no new Jtreg failures were found with the proposed 
changes.
Kindly review the changes at your convenience & provide your feedback.
Thank you for your time in review
Have a good day
Prahalad N.

-----Original Message-----
From: Prahalad Kumar Narayanan
Sent: Wednesday, June 22, 2016 3:20 PM
To: 2d-dev@openjdk.java.net
Cc: Philip Race; Prasanta Sadhukhan; Jayathirth D V; Praveen Srivastava
Subject: [9] Review Request- JDK-8152971- JNI Warning with -Xcheck:jni
Hello Everyone, on Java2D Group
Good day to you.
Please find herewith, webrev changes to fix the bug-
        Bug ID     : JDK-8152971  / -Xcheck:jni - warning in native method
        Bug Link : https://bugs.openjdk.java.net/browse/JDK-8152971?filter=-1
        Webrev : http://cr.openjdk.java.net/~pnarayanan/8152971/webrev.00/
Description on Bug:
       1.  Too many JNI warnings are reported in the native functions when 
test-code is run with VM Option:  -Xcheck:jni
       2.  The warnings can be classified into 2 categories
                   a.  JNI warnings that are thrown due to the missing 
exception checks after an Up call ( JNI function invoking Java method )
                   b.  JNI warnings that are thrown due to increased usage of 
Local Reference objects.
Description on the Fix:
       1.  File : FontPath.c
                     Added JNIEnv->ExceptionCheck() and ExceptionClear() where 
Up call is invoked.
                             The checks are added only to the valid Up calls as 
per JNI spec.
                     Added JNIEnv->DeleteLocalRef where the native functions 
created Java side objects but did not delete their local reference after usage.
                             A few of the native functions get invoked as 
Callbacks to Windows APIs following the font enumeration.
                             Therefore at each callback, the count of active 
local references would increase.
                                      Over time, the active local references 
would exceed the planned number of local references set by JVM.
       2.  File : awt_Component.cpp
                     Added JNIEnv->ExceptionCheck() and ExceptionClear() where 
an Up call displayed a JNI warning while running the Jtreg test script.
                     Information on Jtreg test script is given below.
       3.  File : LoadFontsJNICheck.sh
                     The shell script is already a part of JTreg test case & 
invokes LoadFontsJNICheck with -Xcheck:jni VM option
                     However, the script was configured to run only on Mac OS. 
Now, the script is modified to run on windows, linux and mac systems.
                                  This way, the code changes can be checked for 
proper execution with test-case.
Kindly review the changes at your convenience and share your feedback.
Thank you for your time in review
Have a good day
Prahalad N.

Reply via email to