Some of us have lobbied to make openjdk source C++11, but it's not yet.

If you're brave, you can try to change that flag to -std=gnu++11

On Thu, Sep 27, 2018 at 2:33 PM, JC Beyler <jcbey...@google.com> wrote:
> Hi all,
>
> Sorry to come back to this so late in the game, but somehow when I synced my
> hg clone (or the issue was always there and it is a flaky build), it seems
> that something in the build might have changed? Basically now it seems that
> the build is adding flags that makes my usage of unique_ptr fail.
>
> I "think" it is due to the build adding the gnu++98 standard (But this has
> been there for a while it seems so most likely a side-effect is it is being
> now used):
>
>     CXXSTD_CXXFLAG="-std=gnu++98"
>     FLAGS_CXX_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [$CXXSTD_CXXFLAG -Werror],
>     IF_FALSE: [CXXSTD_CXXFLAG=""])
>
> (from:
> https://hg.openjdk.java.net/jdk/jdk/file/dade6dd87bb4/make/autoconf/flags-cflags.m4)
> but I'm not sure.
>
> When I remove that flag, my g++ goes to a more recent standard and
> unique_ptr works.
>
> So I now have to ask you all:
>   1) Should we try to fix the build system to at least have C++11 for the
> C++ tests, then my webrev.04 can stay as is but has to wait for that to
> happen
>   2) Should we push a new version that does not use unique_ptr? That
> solution would look like the following webrev:
>              http://cr.openjdk.java.net/~jcbeyler/8210842/webrev.05/
>
> Sorry for the last minute rug pull,
> Jc
>
> On Thu, Sep 27, 2018 at 11:32 AM Mikael Vidstedt
> <mikael.vidst...@oracle.com> wrote:
>>
>>
>> Very, very nice! Thanks for adding the comment and renaming the class!
>> Ship it!
>>
>> Cheers,
>> Mikael
>>
>>
>> On Sep 27, 2018, at 10:45 AM, JC Beyler <jcbey...@google.com> wrote:
>>
>> Hi Mikael and David,
>>
>> @David: I thought it was implicit but did not want to presume on this one
>> because my goal is to start propagating this new class in the test base and
>> get the checks to be done implicitly so I was probably being over-cautious
>> @Mikael: done and done, what do you think of the comment here :
>> http://cr.openjdk.java.net/~jcbeyler/8210842/webrev.04/test/hotspot/jtreg/vmTestbase/nsk/share/jni/ExceptionCheckingJniEnv.hpp.html
>>
>> For all, the new webrev is here:
>> Webrev: http://cr.openjdk.java.net/~jcbeyler/8210842/webrev.04/
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8210842
>>
>> Thanks,
>> Jc
>>
>> On Thu, Sep 27, 2018 at 6:03 AM David Holmes <david.hol...@oracle.com>
>> wrote:
>>>
>>> Sorry Jc, I thought my LGTM was implicit. :)
>>>
>>> Thanks,
>>> David
>>>
>>> On 26/09/2018 11:52 PM, JC Beyler wrote:
>>> > Ping on this, anybody have time to do a review and give a LGTM? Or
>>> > David
>>> > if you have time and will to provide an explicit LGTM :)
>>> >
>>> > Thanks,
>>> > Jc
>>> >
>>> > On Mon, Sep 24, 2018 at 9:18 AM JC Beyler <jcbey...@google.com
>>> > <mailto:jcbey...@google.com>> wrote:
>>> >
>>> >     Hi David,
>>> >
>>> >     Sounds good to me, Alex gave me one LGTM, so it seems I'm waiting
>>> >     for an explicit LGTM from you or from someone else on this list to
>>> >     do a review.
>>> >
>>> >     Thanks again for your help,
>>> >     Jc
>>> >
>>> >     On Sun, Sep 23, 2018 at 9:22 AM David Holmes
>>> >     <david.hol...@oracle.com <mailto:david.hol...@oracle.com>> wrote:
>>> >
>>> >         Hi Jc,
>>> >
>>> >         I don't think it is an issue for this to go ahead. If the
>>> > static
>>> >         analysis tool has an issue then we can either find out how to
>>> >         teach it
>>> >         about this code structure, or else flag the issues as false
>>> >         positives.
>>> >         I'd be relying on one of the serviceability team here to handle
>>> >         that if
>>> >         the problem arises.
>>> >
>>> >         Thanks,
>>> >         David
>>> >
>>> >         On 23/09/2018 12:17 PM, JC Beyler wrote:
>>> >          > Hi David,
>>> >          >
>>> >          > No worries with the time to answer; I appreciate the review!
>>> >          >
>>> >          > That's a fair point. Is it possible to "describe" to the
>>> >         static analysis
>>> >          > tool to "trust" calls made in the SafeJNIEnv class?
>>> >          >
>>> >          > Otherwise, do you have any idea on how to go forward? For
>>> >         what it's
>>> >          > worth, this current webrev does not try to replace exception
>>> >         checking
>>> >          > with the SafeJNIEnv (it actually adds it), so for now the
>>> >          > question/solution could be delayed. I could continue working
>>> >         on this in
>>> >          > the scope of both the nsk/gc/lock/jniref code base and the
>>> >         NSK_VERIFIER
>>> >          > macro removal and we can look at how to tackle the cases
>>> >         where the tests
>>> >          > are actually calling exception checking (I know my
>>> >         heapmonitor does for
>>> >          > example).
>>> >          >
>>> >          > Let me know what you think and thanks for the review,
>>> >          > Jc
>>> >          >
>>> >          >
>>> >          > On Sun, Sep 23, 2018 at 6:48 AM David Holmes
>>> >         <david.hol...@oracle.com <mailto:david.hol...@oracle.com>
>>> >          > <mailto:david.hol...@oracle.com
>>> >         <mailto:david.hol...@oracle.com>>> wrote:
>>> >          >
>>> >          >     Hi Jc,
>>> >          >
>>> >          >     Sorry for the delay on getting back to this but I'm
>>> >         travelling at the
>>> >          >     moment.
>>> >          >
>>> >          >     This looks quite neat. Thanks also to Alex for all the
>>> >         suggestions.
>>> >          >
>>> >          >     My only remaining concern is that static analysis tools
>>> >         may not like
>>> >          >     this because they may not be able to determine that we
>>> >         won't make
>>> >          >     subsequent JNI calls when an exception happens in the
>>> >         first. That's not
>>> >          >     a reason not to do this of course, just flagging that we
>>> >         may have to do
>>> >          >     something to deal with that problem.
>>> >          >
>>> >          >     Thanks,
>>> >          >     David
>>> >          >
>>> >          >     On 20/09/2018 11:56 AM, JC Beyler wrote:
>>> >          >      > Hi Alex,
>>> >          >      >
>>> >          >      > Done here, thanks for the review:
>>> >          >      >
>>> >          >      > Webrev:
>>> >         http://cr.openjdk.java.net/~jcbeyler/8210842/webrev.03/
>>> >         <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.03/>
>>> >          >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.03/>
>>> >          >      >
>>> >         <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.03/>
>>> >          >      > Bug: https://bugs.openjdk.java.net/browse/JDK-8210842
>>> >          >      >
>>> >          >      > Thanks again!
>>> >          >      > Jc
>>> >          >      >
>>> >          >      >
>>> >          >      > On Wed, Sep 19, 2018 at 5:13 PM Alex Menkov
>>> >          >     <alexey.men...@oracle.com
>>> >         <mailto:alexey.men...@oracle.com>
>>> >         <mailto:alexey.men...@oracle.com
>>> > <mailto:alexey.men...@oracle.com>>
>>> >          >      > <mailto:alexey.men...@oracle.com
>>> >         <mailto:alexey.men...@oracle.com>
>>> >          >     <mailto:alexey.men...@oracle.com
>>> >         <mailto:alexey.men...@oracle.com>>>> wrote:
>>> >          >      >
>>> >          >      >     Hi Jc,
>>> >          >      >
>>> >          >      >     Looks good to me.
>>> >          >      >     A minor note:
>>> >          >      >     - I'd move ErrorHandler typedef to SafeJNIEnv
>>> >         class to avoid
>>> >          >     global
>>> >          >      >     namespece pollution (ErrorHandler is too generic
>>> >         name).
>>> >          >      >
>>> >          >      >     --alex
>>> >          >      >
>>> >          >      >     On 09/19/2018 15:56, JC Beyler wrote:
>>> >          >      >      > Hi Alex,
>>> >          >      >      >
>>> >          >      >      > I've updated the webrev to:
>>> >          >      >      > Webrev:
>>> >          > http://cr.openjdk.java.net/~jcbeyler/8210842/webrev.02/
>>> >         <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.02/>
>>> >          >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.02/>
>>> >          >      >
>>> >           <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.02/>
>>> >          >      >      >
>>> >         <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.02/>
>>> >          >      >      > Bug:
>>> >         https://bugs.openjdk.java.net/browse/JDK-8210842
>>> >          >      >      >
>>> >          >      >      > That webrev has the code that is shown here in
>>> >         snippets.
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      > Thanks for the reviews, I've relatively
>>> >         followed your reviews
>>> >          >      >     except for
>>> >          >      >      > one detail due to me wanting to handle the
>>> >         NSK_JNI_VERIFY
>>> >          >     macros via
>>> >          >      >      > this system as well later down the road. For
>>> > an
>>> >         example:
>>> >          >      >      >
>>> >          >      >      > We currently have in the code:
>>> >          >      >      > if ( ! NSK_JNI_VERIFY(pEnv, (mhClass =
>>> >          >     NSK_CPP_STUB2(GetObjectClass,
>>> >          >      >      > pEnv, mhToCall)) != NULL) )
>>> >          >      >      >
>>> >          >      >      > 1) The NSK_CPP_STUB2 is trivially removed with
>>> >         a refactor
>>> >          >      >     (JDK-8210728)
>>> >          >      >      >
>>> >         <https://bugs.openjdk.java.net/browse/JDK-8210728> to:
>>> >          >      >      > if ( ! NSK_JNI_VERIFY(pEnv, (mhClass =
>>> >          >     pEnv->GetObjectClass(pEnv,
>>> >          >      >      > mhToCall)) != NULL) )
>>> >          >      >      >
>>> >          >      >      > 2) Then the NSK_JNI_VERIFY, I'd like to remove
>>> >         it to and it
>>> >          >      >     becomes via
>>> >          >      >      > this wrapping of JNIEnv:
>>> >          >      >      > if ( ! (mhClass = pEnv->GetObjectClass(pEnv,
>>> >         mhToCall)) )
>>> >          >      >      >
>>> >          >      >      > 3) Then, via removing the assignment, we'd
>>> >         arrive to a:
>>> >          >      >      > mhClass = pEnv->GetObjectClass(pEnv,
>>> > mhToCall));
>>> >          >      >      > if (!mhClass)
>>> >          >      >      >
>>> >          >      >      > Without any loss of checking for failures,
>>> > etc.
>>> >          >      >      >
>>> >          >      >      > So that is my motivation for most of this work
>>> >         with a concrete
>>> >          >      >     example
>>> >          >      >      > (hopefully it helps drive this conversation).
>>> >          >      >      >
>>> >          >      >      > I inlined my answers here, let me know what
>>> > you
>>> >         think.
>>> >          >      >      >
>>> >          >      >      > On Wed, Sep 19, 2018 at 2:30 PM Alex Menkov
>>> >          >      >     <alexey.men...@oracle.com
>>> >         <mailto:alexey.men...@oracle.com>
>>> >         <mailto:alexey.men...@oracle.com
>>> > <mailto:alexey.men...@oracle.com>>
>>> >          >     <mailto:alexey.men...@oracle.com
>>> >         <mailto:alexey.men...@oracle.com>
>>> >         <mailto:alexey.men...@oracle.com
>>> > <mailto:alexey.men...@oracle.com>>>
>>> >          >      >      > <mailto:alexey.men...@oracle.com
>>> >         <mailto:alexey.men...@oracle.com>
>>> >          >     <mailto:alexey.men...@oracle.com
>>> >         <mailto:alexey.men...@oracle.com>>
>>> >          >      >     <mailto:alexey.men...@oracle.com
>>> >         <mailto:alexey.men...@oracle.com>
>>> >          >     <mailto:alexey.men...@oracle.com
>>> >         <mailto:alexey.men...@oracle.com>>>>> wrote:
>>> >          >      >      >
>>> >          >      >      >     Hi Jc,
>>> >          >      >      >
>>> >          >      >      >     Updated tests looks good.
>>> >          >      >      >     Some notes about implementation.
>>> >          >      >      >
>>> >          >      >      >     - FatalOnException implements both
>>> >         verification and error
>>> >          >      >     handling
>>> >          >      >      >     It would be better to separate them (and
>>> >         this makes
>>> >          >     easy to
>>> >          >      >     implement
>>> >          >      >      >     error handling different from
>>> >         JNIEnv::FatalError).
>>> >          >      >      >     The simplest way is to define error
>>> > handler as
>>> >          >      >      >     class SafeJNIEnv {
>>> >          >      >      >     public:
>>> >          >      >      >           typedef void (*ErrorHandler)(JNIEnv
>>> >         *env, const
>>> >          >     char*
>>> >          >      >     errorMsg);
>>> >          >      >      >           // error handler which terminates
>>> > jvm
>>> >         by using
>>> >          >     FatalError()
>>> >          >      >      >           static void FatalError(JNIEnv *env,
>>> >         const char
>>> >          >     *errrorMsg);
>>> >          >      >      >
>>> >          >      >      >           SafeJNIEnv(JNIEnv* jni_env,
>>> > ErrorHandler
>>> >          >     errorHandler =
>>> >          >      >      >     FatalError);
>>> >          >      >      >     (SafeJNIEnv methods should create
>>> >         FatalOnException objects
>>> >          >      >     passing
>>> >          >      >      >     errorHandler)
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      > Agreed, I tried to keep the code simple. The
>>> >         concepts you
>>> >          >     talk about
>>> >          >      >      > here are generally what I reserve for when I
>>> >         need it (ie
>>> >          >      >     extensions and
>>> >          >      >      > handling new cases). But a lot are going to be
>>> >         needed soon
>>> >          >     so I
>>> >          >      >     think it
>>> >          >      >      > is a good time to iron the code out now on
>>> > this
>>> >         "simple"
>>> >          >     webrev.
>>> >          >      >      >
>>> >          >      >      > So done for this.
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >     - FatalOnException is used in SafeJNIEnv
>>> >         methods as
>>> >          >      >      >         FatalOnException marker(this, "msg");
>>> >          >      >      >         ret = <JNI call>
>>> >          >      >      >         (optional)marker.check_for_null(ret);
>>> >          >      >      >         return ret;
>>> >          >      >      >     But actually I'd call it something like
>>> >          >     JNICallResultVerifier and
>>> >          >      >      >     create
>>> >          >      >      >     the object after JNI call. like
>>> >          >      >      >         ret = <JNI call>
>>> >          >      >      >         JNICallResultVerifier(this, "msg")
>>> >          >      >      >           (optional).notNull(ret);
>>> >          >      >      >         return ret;
>>> >          >      >      >     or even (if you like such syntax sugar)
>>> > you
>>> >         can define
>>> >          >      >      >         template<typename T>
>>> >          >      >      >         T resultNotNull(T result) {
>>> >          >      >      >             notNull(result);
>>> >          >      >      >             return result;
>>> >          >      >      >         }
>>> >          >      >      >     and do
>>> >          >      >      >         ret = <JNI call>
>>> >          >      >      >         return JNICallResultVerifier(this,
>>> >          >     "msg").resultNotNull(ret);
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      > So I renamed FatalOnException to now being
>>> >         JNIVerifier.
>>> >          >      >      >
>>> >          >      >      > Though I like it, I don't think we can do it,
>>> >         except if we
>>> >          >     do it
>>> >          >      >      > slightly differently:
>>> >          >      >      > I'm trying to solve two problems with one
>>> > stone:
>>> >          >      >      >     - How to check for returns of JNI calls in
>>> >         the way that is
>>> >          >      >     done here
>>> >          >      >      >     - How to remove NSK_JNI_VERIFY* (from
>>> >          >     nsk/share/jni/jni_tools)
>>> >          >      >      >
>>> >          >      >      > However, the NSK_JNI_VERIFY need to start a
>>> >         tracing system
>>> >          >     before
>>> >          >      >     the
>>> >          >      >      > call to JNI, so it won't work this way. (Side
>>> >         question
>>> >          >     would be
>>> >          >      >     do we
>>> >          >      >      > still care about the tracing in
>>> > NSK_JNI_VERIFY,
>>> >         if we
>>> >          >     don't then
>>> >          >      >     your
>>> >          >      >      > solution works well in most situations).
>>> >          >      >      >
>>> >          >      >      > My vision or intuition is that we would throw
>>> > a
>>> >         template
>>> >          >     at some
>>> >          >      >     point
>>> >          >      >      > on SafeJNIEnv to handle both cases and have
>>> >         JNIVerifier
>>> >          >     become a
>>> >          >      >      > specialization in certain cases and something
>>> >         different
>>> >          >     for the
>>> >          >      >      > NSK_JNI_VERIFY case (or have a different
>>> >         constructor to enable
>>> >          >      >     tracing).
>>> >          >      >      > But for now, I offer the implementation that
>>> > does:
>>> >          >      >      >
>>> >          >      >      > jclass SafeJNIEnv::GetObjectClass(jobject obj)
>>> > {
>>> >          >      >      >    JNIVerifier<jclass> marker(this,
>>> >         "GetObjectClass");
>>> >          >      >      >    return
>>> >         marker.ResultNotNull(_jni_env->GetObjectClass(obj));
>>> >          >      >      > }
>>> >          >      >      >
>>> >          >      >      > and:
>>> >          >      >      >
>>> >          >      >      > void SafeJNIEnv::SetObjectField(jobject obj,
>>> >         jfieldID
>>> >          >     field, jobject
>>> >          >      >      > value) {
>>> >          >      >      >    JNIVerifier<> marker(this,
>>> > "SetObjectField");
>>> >          >      >      >    _jni_env->SetObjectField(obj, field,
>>> > value);
>>> >          >      >      > }
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >     - you added #include <memory> in the test
>>> >         (and you have to
>>> >          >      >     add it to
>>> >          >      >      >     every test).
>>> >          >      >      >     It would be simpler to add the include to
>>> >          >     SafeJNIEnv.hpp and
>>> >          >      >     define
>>> >          >      >      >     typedef std::unique_ptr<SafeJNIEnv>
>>> >         SafeJNIEnvPtr;
>>> >          >      >      >     Then each in the test methods:
>>> >          >      >      >         SafeJNIEnvPtr env(new
>>> > SafeJNIEnv(jni_env));
>>> >          >      >      >     or you can add
>>> >          >      >      >     static SafeJNIEnv::SafeJNIEnvPtr
>>> >         wrap(JNIEnv* jni_env,
>>> >          >      >     ErrorHandler
>>> >          >      >      >     errorHandler = fatalError)
>>> >          >      >      >     and get
>>> >          >      >      >         SafeJNIEnvPtr env =
>>> >         SafeJNIEnv::wrap(jni_env);
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      > Done, I like that, even less code change to
>>> >         tests then.
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >     - it would be better to wrap internal
>>> > classes
>>> >          >      >     (FatalOnException) into
>>> >          >      >      >     unnamed namespace - this helps to avoid
>>> >         conflicts with
>>> >          >     other
>>> >          >      >     classes)
>>> >          >      >      >
>>> >          >      >      >     - FatalOnException::check_for_null(void*
>>> > ptr)
>>> >          >      >      >     should be
>>> >          >      >      >     FatalOnException::check_for_null(const
>>> >         void* ptr)
>>> >          >      >      >     And calling the method you don't need
>>> >         reinterpret_cast
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      > Also done, it got renamed to ResultNotNull, is
>>> >         using a
>>> >          >     template
>>> >          >      >     now, but
>>> >          >      >      > agreed, that worked.
>>> >          >      >      > Thanks again for the review,
>>> >          >      >      > Jc
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >     --alex
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >     On 09/18/2018 11:07, JC Beyler wrote:
>>> >          >      >      >      > Hi David,
>>> >          >      >      >      >
>>> >          >      >      >      > Thanks for the quick review and
>>> >         thoughts. I have
>>> >          >     now a new
>>> >          >      >      >     version here
>>> >          >      >      >      > that addresses your comments:
>>> >          >      >      >      >
>>> >          >      >      >      > Webrev:
>>> >          >      >
>>> >         http://cr.openjdk.java.net/~jcbeyler/8210842/webrev.01/
>>> >         <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/>
>>> >          >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/>
>>> >          >      >
>>> >           <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/>
>>> >          >      >      >
>>> >          >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/>
>>> >          >      >      >      >
>>> >          >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/>
>>> >          >      >      >      >
>>> >         Bug:https://bugs.openjdk.java.net/browse/JDK-8210842
>>> >          >      >      >      >
>>> >          >      >      >      > I've also inlined my answers/comments.
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      >      > I've slowly started working on
>>> >         JDK-8191519
>>> >          >      >      >      >      >
>>> >          >     <https://bugs.openjdk.java.net/browse/JDK-8191519>.
>>> >          >      >      >     However before
>>> >          >      >      >      >      > starting to really refactor all
>>> >         the tests, I
>>> >          >      >     thought I'd
>>> >          >      >      >     get a few
>>> >          >      >      >      >      > opinions. I am working on
>>> >         internalizing the
>>> >          >     error
>>> >          >      >     handling
>>> >          >      >      >     of JNI
>>> >          >      >      >      >     calls
>>> >          >      >      >      >      > via a SafeJNIEnv class that
>>> >         redefines all
>>> >          >     the JNI
>>> >          >      >     calls to
>>> >          >      >      >     add an
>>> >          >      >      >      >     error
>>> >          >      >      >      >      > checker.
>>> >          >      >      >      >      >
>>> >          >      >      >      >      > The advantage is that the test
>>> >         code will
>>> >          >     look and
>>> >          >      >     feel like
>>> >          >      >      >      >     normal JNI
>>> >          >      >      >      >      > code and calls but will have the
>>> >         checks we
>>> >          >     want to have
>>> >          >      >      >     for our
>>> >          >      >      >      >     tests.
>>> >          >      >      >      >
>>> >          >      >      >      >     Not sure I get that. Normal JNI
>>> > code
>>> >         has to
>>> >          >     check for
>>> >          >      >      >     errors/exceptions
>>> >          >      >      >      >     after every call. The tests need
>>> >         those checks too.
>>> >          >      >     Today they are
>>> >          >      >      >      >     explicit, with this change they
>>> > become
>>> >          >     implicit. Not sure
>>> >          >      >      >     what we are
>>> >          >      >      >      >     gaining here ??
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      > In my humble opinion, having the error
>>> >         checking out
>>> >          >     of the way
>>> >          >      >      >     allows
>>> >          >      >      >      > the code reader to concentrate on the
>>> >         JNI code while
>>> >          >      >     maintaining
>>> >          >      >      >     error
>>> >          >      >      >      > checking. We use something similar
>>> >         internally, so
>>> >          >     perhaps I'm
>>> >          >      >      >     biased to
>>> >          >      >      >      > it :-).
>>> >          >      >      >      > If this is not a desired/helpful
>>> >         "feature" to simplify
>>> >          >      >     tests in
>>> >          >      >      >     general,
>>> >          >      >      >      > I will backtrack it and just add the
>>> >         explicit tests
>>> >          >     to the
>>> >          >      >     native
>>> >          >      >      >     code
>>> >          >      >      >      > of the locks for the fix
>>> >          >      >      >      >
>>> >          > https://bugs.openjdk.java.net/browse/JDK-8191519 instead.
>>> >          >      >      >      >
>>> >          >      >      >      > Let me however try to make my case and
>>> >         let me know what
>>> >          >      >     you all
>>> >          >      >      >     think!
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      >      > If agreed with this, we can
>>> >         augment the
>>> >          >     SafeJNIEnv
>>> >          >      >     class
>>> >          >      >      >     as needed.
>>> >          >      >      >      >      > Also, if the tests require
>>> >         something else
>>> >          >     than fatal
>>> >          >      >      >     errors, we
>>> >          >      >      >      >     can add
>>> >          >      >      >      >      > a different marker and make it a
>>> >         parameter
>>> >          >     to the
>>> >          >      >     base class.
>>> >          >      >      >      >      >
>>> >          >      >      >      >      > Webrev:
>>> >          >      >      >
>>> >         http://cr.openjdk.java.net/~jcbeyler/8210842/webrev.00/
>>> >         <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.00/>
>>> >          >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.00/>
>>> >          >      >
>>> >           <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.00/>
>>> >          >      >      >
>>> >          >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.00/>
>>> >          >      >      >      >
>>> >          >      >
>>> >           <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.00/>
>>> >          >      >      >      >      >
>>> >          >      >
>>> >           <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.00/>
>>> >          >      >      >      >      > Bug:
>>> >          > https://bugs.openjdk.java.net/browse/JDK-8210842
>>> >          >      >      >      >      >
>>> >          >      >      >      >      > Let me know what you think,
>>> >          >      >      >      >
>>> >          >      >      >      >     Two initial suggestions:
>>> >          >      >      >      >
>>> >          >      >      >      >     1. FatalOnException should be
>>> >         constructed with a
>>> >          >      >     description
>>> >          >      >      >     string so
>>> >          >      >      >      >     that it can report the failing
>>> >         operation when
>>> >          >     calling
>>> >          >      >      >     FatalError rather
>>> >          >      >      >      >     than the general "Problem with a
>>> > JNI
>>> >         call".
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      > Agreed with you, the new webrev
>>> > produces:
>>> >          >      >      >      >
>>> >          >      >      >      > FATAL ERROR in native method:
>>> > GetObjectClass
>>> >          >      >      >      >          at
>>> >          >      >      >
>>> >          >      >
>>> >          >
>>> >
>>> > nsk.share.gc.lock.CriticalSectionTimedLocker.criticalSection(CriticalSectionTimedLocker.java:47)
>>> >          >      >      >      >          at
>>> >          >      >      >
>>> >          >
>>> >
>>> > nsk.share.gc.lock.jniref.JNIGlobalRefLocker.criticalNative(Native
>>> >          >      >      >     Method)
>>> >          >      >      >      >          at
>>> >          >      >      >
>>> >          >      >
>>> >          >
>>> >
>>> > nsk.share.gc.lock.jniref.JNIGlobalRefLocker.criticalSection(JNIGlobalRefLocker.java:44)
>>> >          >      >      >      >          at
>>> >          >      >      >
>>> >          >      >
>>> >          >
>>> >
>>> > nsk.share.gc.lock.CriticalSectionLocker$1.run(CriticalSectionLocker.java:56)
>>> >          >      >      >      >          at
>>> >          >      >      >
>>> >          >
>>> > java.lang.Thread.run(java.base@12-internal/Thread.java:834)
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      > and for a return NULL in NewGlobalRef,
>>> >         we would get
>>> >          >      >     automatically:
>>> >          >      >      >      >
>>> >          >      >      >      > FATAL ERROR in native method:
>>> >         NewGlobalRef:Return
>>> >          >     is NULL
>>> >          >      >      >      >          at
>>> >          >      >      >
>>> >          >
>>> >
>>> > nsk.share.gc.lock.jniref.JNIGlobalRefLocker.criticalNative(Native
>>> >          >      >      >     Method)
>>> >          >      >      >      >
>>> >          >      >      >      >          at
>>> >          >      >      >      >
>>> >          >      >      >
>>> >          >      >
>>> >          >
>>> >
>>> > nsk.share.gc.lock.jniref.JNIGlobalRefLocker.criticalSection(JNIGlobalRefLocker.java:44)
>>> >          >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      > Again as we port and simplify more
>>> > tests
>>> >         (I'll only
>>> >          >     do the
>>> >          >      >     locks
>>> >          >      >      >     for now
>>> >          >      >      >      > and we can figure out the next steps as
>>> >         start
>>> >          >     working on
>>> >          >      >     moving
>>> >          >      >      >     tests
>>> >          >      >      >      > out of vmTestbase),
>>> >          >      >      >      > we can add, if needed, other exception
>>> >         handlers
>>> >          >     that don't
>>> >          >      >     throw
>>> >          >      >      >     or do
>>> >          >      >      >      > other things depending on the JNI
>>> > method
>>> >         outputs.
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      >     2. Make the local SafeJNIEnv a
>>> >         pointer called
>>> >          >     env so
>>> >          >      >     that the
>>> >          >      >      >     change is
>>> >          >      >      >      >     less disruptive. All the env->op()
>>> >         calls will
>>> >          >     remain
>>> >          >      >     and only
>>> >          >      >      >     the local
>>> >          >      >      >      >     error checking will be removed.
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      > Done, I used a unique_ptr to make the
>>> > object
>>> >          >      >      >     created/destroyed/available
>>> >          >      >      >      > as a pointer do-able in one line:
>>> >          >      >      >      > std::unique_ptr<SafeJNIEnv> env(new
>>> >          >     SafeJNIEnv(jni_env));
>>> >          >      >      >      >
>>> >          >      >      >      > and then you can see that, as you
>>> >         mentioned, the
>>> >          >     disruption to
>>> >          >      >      >     the code
>>> >          >      >      >      > is much less:
>>> >          >      >      >      >
>>> >          >      >      >
>>> >          >      >
>>> >          >
>>> >
>>> > http://cr.openjdk.java.net/~jcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.udiff.html
>>> >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.udiff.html>
>>> >          >
>>> >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.udiff.html>
>>> >          >      >
>>> >          >
>>> >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.udiff.html>
>>> >          >      >      >
>>> >          >      >
>>> >          >
>>> >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.udiff.html>
>>> >          >      >      >
>>> >          >      >      >      >
>>> >          >      >      >
>>> >          >      >
>>> >          >
>>> >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.udiff.html>
>>> >          >      >      >      >
>>> >          >      >      >      > Basically the tests now become internal
>>> >         to the
>>> >          >     SafeJNIEnv
>>> >          >      >     and the
>>> >          >      >      >     code
>>> >          >      >      >      > now only contains the JNI calls
>>> >         happening but we
>>> >          >     are protected
>>> >          >      >      >     and will
>>> >          >      >      >      > fail any test that has an exception or
>>> > a
>>> >         NULL
>>> >          >     return for the
>>> >          >      >      >     call. Of
>>> >          >      >      >      > course, this is not 100% proof in terms
>>> >         of not
>>> >          >     having any
>>> >          >      >     error
>>> >          >      >      >     handling
>>> >          >      >      >      > in the test but in some cases like
>>> > this,
>>> >         the new
>>> >          >     code seems to
>>> >          >      >      >     just work
>>> >          >      >      >      > better:
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >
>>> >          >      >
>>> >          >
>>> >
>>> > http://cr.openjdk.java.net/~jcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.html
>>> >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.html>
>>> >          >
>>> >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.html>
>>> >          >      >
>>> >          >
>>> >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.html>
>>> >          >      >      >
>>> >          >      >
>>> >          >
>>> >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.html>
>>> >          >      >      >
>>> >          >      >      >      >
>>> >          >      >      >
>>> >          >      >
>>> >          >
>>> >
>>> > <http://cr.openjdk.java.net/%7Ejcbeyler/8210842/webrev.01/test/hotspot/jtreg/vmTestbase/nsk/share/gc/lock/jniref/JNIGlobalRefLocker.cpp.html>
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      >     The switch from, e.g., checking
>>> > NULL
>>> >         returns to
>>> >          >      >     checking for
>>> >          >      >      >     pending
>>> >          >      >      >      >     exceptions, need to be sure that
>>> > the
>>> >         JNI operations
>>> >          >      >     clearly
>>> >          >      >      >     specify
>>> >          >      >      >      >     that
>>> >          >      >      >      >     NULL implies there will be an
>>> > exception
>>> >          >     pending. This
>>> >          >      >     change
>>> >          >      >      >     may be an
>>> >          >      >      >      >     issue for static code analysis if
>>> >         not smart
>>> >          >     enough to
>>> >          >      >      >     understand the
>>> >          >      >      >      >     RAII wrappers.
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      > Agreed, I fixed it to be more strict
>>> > and
>>> >         say: in
>>> >          >     normal test
>>> >          >      >      >     handling,
>>> >          >      >      >      > the JNI calls should never return NULL
>>> >         or throw an
>>> >          >      >     exception. This
>>> >          >      >      >      > should hold for tests I imagine but if
>>> >         not we can add a
>>> >          >      >     different
>>> >          >      >      >     call
>>> >          >      >      >      > verifier as we go.
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      >     Thanks,
>>> >          >      >      >      >     David
>>> >          >      >      >      >
>>> >          >      >      >      >      > Jc
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      >
>>> >          >      >      >      > Let me know what you all think. When
>>> >         talking about it a
>>> >          >      >     bit, I had
>>> >          >      >      >      > gotten some interest to see what it
>>> >         would look
>>> >          >     like. Here
>>> >          >      >     it is
>>> >          >      >      >     :-). Now
>>> >          >      >      >      > if it is not wanted like I said, I can
>>> >         backtrack
>>> >          >     and just
>>> >          >      >     put the
>>> >          >      >      >     error
>>> >          >      >      >      > checks after each JNI call for all the
>>> >         tests as we are
>>> >          >      >     porting them.
>>> >          >      >      >      > Jc
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      >
>>> >          >      >      > --
>>> >          >      >      >
>>> >          >
>
>
>
> --
>
> Thanks,
> Jc

Reply via email to