RFR (M) 8210700: Clean up JNI_ENV_ARG and factorize the macros for vmTestbase/jvmti/unit tests

Alex Menkov alexey.menkov at oracle.com
Fri Sep 14 17:52:13 UTC 2018


Hi Jc,

On 09/13/2018 20:05, JC Beyler wrote:
> Thanks Alexey for the review, I fixed all the " ," issues that the patch 
> changed but there are still at least 29 files that seem to have that 
> issue in the vmTestbase that were not touched by this webrev. I imagine 
> we can do a refactoring in another webrev (want me to file it?) or we 
> can try to handle them when we refactor the tests to move them out of 
> vmTestbase.

I don't think we need to fix this minor style issues - I asked to fix 
them just because your fix touches the lines.

Regarding jvmti/jvmti_env mix:
Looks like you are right about <...>/timers/JvmtiTest/JvmtiTest.cpp 
(actually if JNI_ENV_ARG didn't drop the 1st arg, the code would just 
fail to compile as jvmti_env is undefined in some cases).

But the same issues in <...>/functions/rawmonitor/rawmonitor.cpp needs 
to be fixed.
As I wrote before if jvmtiEnv is used in JVMTI callback, it should use 
jvmtiEnv passed to the callback (callback may be called on a different 
thread and in the case jvmti if different from jvmti_env):

void JNICALL vmStart(jvmtiEnv *jvmti_env, JNIEnv *env) {
      jvmtiError res;
-    res = 
JVMTI_ENV_PTR(jvmti)->GetCurrentThread(JVMTI_ENV_ARG(jvmti_env, 
&main_thread));
+    res = jvmti->GetCurrentThread(&main_thread);

should be
+    res = jvmti_env->GetCurrentThread(&main_thread);

the same for other callbacks in rawmonitor.cpp

--alex

> 
> The new webrev is here:
> Webrev: http://cr.openjdk.java.net/~jcbeyler/8210700/webrev.01/ 
> <http://cr.openjdk.java.net/%7Ejcbeyler/8210700/webrev.01/>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8210700
> 
> Good catch on the change here:
> -    res =
> JVMTI_ENV_PTR(jvmti)->GetCurrentThread(JVMTI_ENV_ARG(jvmti_env,
> &main_thread));
> +    res = jvmti->GetCurrentThread(&main_thread);
> 
> You are right that the change from Igor introduced this weird part where 
> jvmti and jvmti_env are seemingly used at the same time. Turns out that 
> for C++, JVMTI_ENV_ARG/JVMTI_ENV_PTR is transformed into:
> 
> -#define JNI_ENV_PTR(x) x
> -#define JNI_ENV_ARG(x, y) y
> 
> ..
> 
> -#define JVMTI_ENV_PTR JNI_ENV_PTR
> -#define JVMTI_ENV_ARG JNI_ENV_ARG
> 
> So you are right that actually it is weird but it all works out:
> 
> -    res =
> JVMTI_ENV_PTR(jvmti)->GetCurrentThread(JVMTI_ENV_ARG(jvmti_env,
> &main_thread));
> 
> -> The JVMTI_ENV_PTR is JNI_ENV_PTR which is identity so JVMTI_ENV_PTR(jvmti) -> jvmti
> 
> -> The JVMT_ENV_ARG ignores the first argument so JVMTI_ENV_ARG(jvmti_env, &main_thread) -> &main_thread
> 
> So my transformation is correct; turns out that Igor's transformation was wrong but because things were in C++,
> 
> the undeclared jvmti_env was just ignored.
> 
> 
> So apart from the case where I missed something I think we are good. Let me know what you think,
> 
> Jc
> 
> 
> 
> 
> On Thu, Sep 13, 2018 at 5:32 PM Alex Menkov <alexey.menkov at oracle.com 
> <mailto:alexey.menkov at oracle.com>> wrote:
> 
>     Hi Jc,
> 
>     Some notes:
>     <...>/MethodBind/JvmtiTest/JvmtiTest.cpp
>     and
>     <...>/StackTrace/JvmtiTest/JvmtiTest.cpp
>     have several places with extra space before comma like:
>     -    ret = JVMTI_ENV_PTR(jvmti)->GetStackTrace(JVMTI_ENV_ARG(jvmti,
>     thr), 0, max_count , stack_buffer, &count);
>     +    ret = jvmti->GetStackTrace(thr, 0, max_count , stack_buffer,
>     &count);
> 
>     <...>/functions/rawmonitor/rawmonitor.cpp
>     and
>     <...>/timers/JvmtiTest/JvmtiTest.cpp
>     have several suspicious changes when JVMTI_ENV_PTR and JVMTI_ENV_ARG
>     have different arguments (that's certainly wrong, but needs to re
>     resolved correctly):
>     -    res =
>     JVMTI_ENV_PTR(jvmti)->GetCurrentThread(JVMTI_ENV_ARG(jvmti_env,
>     &main_thread));
>     +    res = jvmti->GetCurrentThread(&main_thread);
> 
>     JVMTI_ENV_PTR(jvmti) is an address of the function in the vtable, and
>     JVMTI_ENV_ARG(jvmti_env, ...) is a C++ "this" pointer.
>     So I'd expect that this should be
>     +    res = + jvmti_env->GetCurrentThread(&main_thread);
> 
>     Looking at timers/JvmtiTest/JvmtiTest.cpp history looks like
>     JVMTI_ENV_PTR(jvmti)-><func>(JVMTI_ENV_ARG(jvmti_env, ... changes were
>     introduced recently by the fix for "8209611: use C++ compiler for
>     hotspot tests".
> 
>     /functions/rawmonitor/rawmonitor.cpp had such wrong statements before,
>     so they should be revised carefully.
>     AFAIU if JVMTI dunction is called from some callback where jvmtiEnv is
>     passed, the passed value should be used.
> 
>     --alex
> 
>     On 09/13/2018 13:26, JC Beyler wrote:
>      > Hi all,
>      >
>      > We have arrived to the last webrev for removing the JNI_ENV
>     macros from
>      > the vmTestbase:
>      >
>      > Webrev: http://cr.openjdk.java.net/~jcbeyler/8210700/webrev.00/
>     <http://cr.openjdk.java.net/%7Ejcbeyler/8210700/webrev.00/>
>      > <http://cr.openjdk.java.net/%7Ejcbeyler/8210700/webrev.00/>
>      > Bug: https://bugs.openjdk.java.net/browse/JDK-8210700
>      >
>      > Thanks again for the reviews,
>      > Jc
> 
> 
> 
> -- 
> 
> Thanks,
> Jc


More information about the serviceability-dev mailing list