On 12/7/17 9:27 AM, Chris Plummer wrote:
On 12/7/17 8:49 AM, Chris Plummer wrote:
On 12/7/17 2:41 AM, David Holmes wrote:
Hi Chris,
On 7/12/2017 5:44 PM, Chris Plummer wrote:
New webrev:
https://bugs.openjdk.java.net/browse/JDK-8191229
http://cr.openjdk.java.net/~cjplummer/8191229/webrev.01/
testClass now initialized from JNI_OnLoad(), and use memset to
clear callbacks. Also updated to use JVMTI_VERSION_9 when calling
GetEnv().
� 71�������� // JNI_OnLoad has not been called yet, so can't
possibly be an instance of TEST_CLASS.
You can't be executing this method before JNI_OnLoad has executed.
If JNI_Onload has executed then you can't execute this method and
find NULL as that means JNI_Onload failed and hence library loading
fails and so you can't be executing this method. So this method
reduces to a simple instanceof check, which can go straight into the
calling method.
That's what I thought, but it was crashing because testClass was
NULL. I think Agent_OnLoad() is being called before JNI_OnLoad. I'll
add traces and see for sure.
Printfs confirm that (at least in the one run I just did)
Agent_OnLoad() was called before JNI_OnLoad(). However, I'm not
certain that is always the case, because before I put the NULL check
in, it only crashed 12 out of 50 times. 2 of those were on a linux-x64
product build and the rest were on the macosx debug build. Debug
builds on Windows, solaris, and linux were fine. I'm not certain of
the call environment for either of these functions, but I can at least
see that Agent_OnLoad() is called on a different thread than
JNI_OnLoad(), which is called on the test's main thread. So a race is
seems possible.
I think Agent_OnLoad() is always called before JNI_OnLoad(), but the
reason is it only sometimes crashes without the NULL check is the same
as the reason this bug exists in the first place. It requires an
unexpected contended monitor callback, and that doesn't always happen
before JNI_OnLoad is called.
I think this might be another good reason to move the FindClass code to
Agent_Initialize(), which is called by Agent_Onload(). It will guarantee
that testClass is set before we setup the contended monitor callbacks.
Chris
Chris
Chris
�183���� if (testClass == NULL) {
That can just be "else {" - but as I said it can't be NULL anyway.
Thanks,
David
thanks,
Chris