RFR(S): JDK-8030708: warnings from b119 for jdk/src/share/back: JNI exception pending
Dmitry Samersoff
dmitry.samersoff at oracle.com
Wed Jan 21 13:05:54 UTC 2015
David,
Please, take a look at updated webrev
http://cr.openjdk.java.net/~dsamersoff/JDK-8030708/webrev.03/
-Dmitry
On 2014-10-16 16:07, David Holmes wrote:
> Hi Dmitry,
>
> On 16/10/2014 8:08 PM, Dmitry Samersoff wrote:
>> David,
>>
>> Changed. Thank you for review!
>>
>> please, see:
>>
>> http://cr.openjdk.java.net/~dsamersoff/JDK-8030708/webrev.02/
>
> 102 if (weakRef == NULL || (*env)->ExceptionCheck(env)) {
>
> Isn't the only time it will return NULL when an exception occurs?
> Conversely if an exception occurs then it must return NULL - so the
> exception check seems redundant.
>
> But this also suggests you need similar logic at:
>
> 182 weakRef = JNI_FUNC_PTR(env,NewWeakGlobalRef)(env, node->ref);
>
> 456 lref = JNI_FUNC_PTR(env,NewLocalRef)(env, node->ref);
>
> Or more generally any JNI call from JVMTI should be wrapped in a way
> that checks for exceptions and clears them.
>
> David
>
>> -Dmitry
>>
>> On 2014-10-16 04:24, David Holmes wrote:
>>> On 16/10/2014 12:33 AM, Dmitry Samersoff wrote:
>>>> David,
>>>>
>>>> Sorry, copied wrong function!
>>>>
>>>> I mean this call
>>>>
>>>> weakRef = JNI_FUNC_PTR(env,NewWeakGlobalRef)(env, ref);
>>>>
>>>> that can post OutOfMemoryError
>>>
>>> Okay, so shouldn't that be where the exception is cleared:
>>>
>>> /* Create weak reference to make sure we have a reference */
>>> weakRef = JNI_FUNC_PTR(env,NewWeakGlobalRef)(env, ref);
>>> if (weakRef == NULL) {
>>> + // < clear exception here >
>>> jvmtiDeallocate(node);
>>> return NULL;
>>> }
>>>
>>> Thanks,
>>> David
>>> -----
>>>
>>>> commonRef_refToID() ->
>>>>
>>>> createNode(JNIEnv *env, jobject ref) ->
>>>>
>>>> weakRef = JNI_FUNC_PTR(env,NewWeakGlobalRef)(env, ref);
>>>>
>>>> -Dmitry
>>>>
>>>> On 2014-10-15 16:21, David Holmes wrote:
>>>>> On 15/10/2014 8:39 PM, Dmitry Samersoff wrote:
>>>>>> On 2014-10-15 14:27, David Holmes wrote:
>>>>>>> On 15/10/2014 8:08 PM, Dmitry Samersoff wrote:
>>>>>>>> Please review the fix:
>>>>>>>>
>>>>>>>> http://cr.openjdk.java.net/~dsamersoff/JDK-8030708/webrev.01/
>>>>>>>>
>>>>>>>> Added missed exception checks.
>>>>>>>
>>>>>>> src/jdk.jdwp.agent/share/native/libjdwp/outStream.c
>>>>>>>
>>>>>>> What is potentially posting the exception?
>>>>>>
>>>>>> JvmtiEnv::GetTag(jobject object, jlong* tag_ptr) called from
>>>>>> commonRef_refToID()
>>>>>
>>>>> You mean this call:
>>>>>
>>>>> error = JVMTI_FUNC_PTR(gdata->jvmti,GetTag)(gdata->jvmti, ref,
>>>>> &tag);
>>>>
>>>> x
>>>>>
>>>>> in findNodeByRef which is called by commonRef_refToID? JVM TI doesn't
>>>>> post exceptions.
>>>>>
>>>>> "JVM TI functions never throw exceptions; error conditions are
>>>>> communicated via the function return value. Any existing exception
>>>>> state
>>>>> is preserved across a call to a JVM TI function."
>>>>>
>>>>> http://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html
>>>>>
>>>>> David
>>>>>
>>>>>> -Dmitry
>>>>>>
>>>>>>
>>>>
>>>>
>>
>>
--
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* I would love to change the world, but they won't give me the sources.
More information about the serviceability-dev
mailing list