On 10/4/17 6:21 PM, David Holmes wrote:
Hi Mandy

On 5/10/2017 9:24 AM, mandy chung wrote:
Updated webrev:
http://cr.openjdk.java.net/~mchung/jdk10/webrevs/8164512/webrev.01/

JNI FindClass change has been separated from this patch [1]. I made further clean up to the NativeLibrary implementation and replaced the use of Vector/Stack.  I also added a native test to verify the native library can be unloaded and reloaded.

Summary: The patch replaces the ClassLoader use of finalizer with phantom reference, specifically Cleaner, for unloading native libraries.  It registers the class loader for cleanup only if it's not a builtin class loader which will never be unloaded.

src/java.base/share/classes/java/lang/ClassLoader.java

This comment is not a sentence:

2442                 /* If the library is being loaded (must be by the same thread,
2443                  * because Runtime.load and Runtime.loadLibrary are
2444                  * synchronous).

This is an existing comment.  I rewrite it in the updated webrev.
Overall the changes seem fine, but I do have a concern about the use of ConcurrentHashMap. This would seem to be a significant change in the initialization order -

ConcurrentHashMap is referenced in ClassLoader but actually not loaded until later.  So it does change the initialization order.   I now change the implementation to lazily create CHM.  This saves the footprint when a class loader does not load any native library.

and I'm wondering how libjava itself actually gets loaded ??


 os::native_java_library() which is called by JDK_Version_init() at VM creation time.

---

I assume the tests will be updated to use JNI_VERSION_10, assuming you push the FindClass changes first?

JDK-8188052 will be pushed first to jdk10/hs.  This fix will have to wait until JDK-8188052 is integrated to jdk10/master.   I will update the test to use JNI_VERSION_10 before I push.


libnativeLibraryTest.c:

Not sure I see the point in the FindClass("java/lang/ClassLoader") as if it fails to find it then surely it already failed to find "java/lang/Error" and you'll possibly crash trying to throw.

I agree that should be cleaned up.  I took out FindClass("java/lang/ClassLoader") case.
NativeLibraryTest.java:

Not clear how/if this actually verifies any unloading actually takes place?

If the native library is not unloaded, p.Test.<clinit> will fail when reloading the native library.  I think this is adequate. I added further checks to verify the number of times the native library is unloaded as you suggest below.

Also if the OnUnload throws an error and that happens in the Cleaner thread, how would that exception result in the test reporting a failure ??


Good point.  Cleaner ignores all exceptions.  I change it to be a fatal error.
I think OnUnload has to update some state stored in the main test class so that it can confirm the unloading occurred successfully, or not.


I added this per your suggestion to enhance the verification.

Updated webrev:
http://cr.openjdk.java.net/~mchung/jdk10/webrevs/8164512/webrev.02/

Mandy

Reply via email to