I think the code as it is, is correct and safe.
The proposed optimisation would have very little measurable benefit
for something that creates such a dependency on knowing the implementation
of some other piece of code.

So we should push it as it is now.

-phil.

On 2/19/19, 9:15 PM, Shashidhara Veerabhadraiah wrote:

Thank you Prashanta. This bug(NPE) is already a regression for an earlier bug and do not wish to cause one more in future for a poorly creation of the function definition especially when it is not implied by the function definition. That's my intent. The null check expression should not even take a single cpu cycle per me and running it in 4 mins is definitely fine I feel rather than creating a path for a future NPE(it's very easy to overlook per me when not implied).

So any other volunteers for reviewing this bug.

Thanks and regards,

Shashi

*From:*Prasanta Sadhukhan
*Sent:* Monday, February 18, 2019 5:39 PM
*To:* Shashidhara Veerabhadraiah <shashidhara.veerabhadra...@oracle.com>; Philip Race <philip.r...@oracle.com>
*Cc:* 2d-dev@openjdk.java.net
*Subject:* Re: [OpenJDK 2D-Dev] [12] JDK-8212202: NPE in the print tests after JDK-8153732

Hi Shashi,

I think if the overhead can be fixed with a small change, we should do it as I think we need to keep the code optimized with whatever code is present now. If in future, if somebody changes the function order, like doCompare(prev..., curr..) to doCompare(curr..., prev..) [what you are trying to imply] then it needs to be done with proper reasoning (which I am not sure what it can be and then we can do these checks). That's my take. It other reviewers feel the present changes are ok, you can commit the changes with their approval.

Regards
Prasanta

On 18-Feb-19 12:26 PM, Shashidhara Veerabhadraiah wrote:

    Hi Prasanta, I hope I have answered your questions satisfactorily.
    Please let me know if you have any more questions.

    Thanks and regards,

    Shashi

    *From:*Shashidhara Veerabhadraiah
    *Sent:* Friday, February 15, 2019 12:37 PM
    *To:* Prasanta Sadhukhan <prasanta.sadhuk...@oracle.com>
    <mailto:prasanta.sadhuk...@oracle.com>; Philip Race
    <philip.r...@oracle.com> <mailto:philip.r...@oracle.com>
    *Cc:* 2d-dev@openjdk.java.net <mailto:2d-dev@openjdk.java.net>
    *Subject:* RE: [OpenJDK 2D-Dev] [12] JDK-8212202: NPE in the print
    tests after JDK-8153732

    Hi Prasanta, The parameters for the function does not tells the
    order and is not implied by the way function definition is and
    more over this function is called in an interval of minimum
    refresh time(4 mins). Rather than adding overhead of confusion
    since it is not implied by the function I think it is safe to keep
    it that way. Depending on reviewer's comments is also not the
    right way to depend on. The current definition avoids that but
    with a small overhead and I think is not too much of a burden to bear.

    Thanks and regards,

    Shashi

    *From:*Prasanta Sadhukhan
    *Sent:* Friday, February 15, 2019 12:28 PM
    *To:* Shashidhara Veerabhadraiah
    <shashidhara.veerabhadra...@oracle.com
    <mailto:shashidhara.veerabhadra...@oracle.com>>; Philip Race
    <philip.r...@oracle.com <mailto:philip.r...@oracle.com>>
    *Cc:* 2d-dev@openjdk.java.net <mailto:2d-dev@openjdk.java.net>
    *Subject:* Re: [OpenJDK 2D-Dev] [12] JDK-8212202: NPE in the print
    tests after JDK-8153732

    Hi Shashi,

    In this case, we know doCompare() is called from one location only
    [and also is not a public method to be called by user] and the
    check I mentioned is redundant. It's in while(true) loop so any
    optimzation we can do to avoid unnecessary checks will be good in
    my opinion.

    If someone changed the doCompare() call without seeing the
    implication or giving thought, then he has to face the
    repurcussions, but I guess reviewers would be able to catch that
    beforehand.

    Regards

    Prasanta

    On 15-Feb-19 12:17 PM, Shashidhara Veerabhadraiah wrote:

        Hi Prasanta, doCompare(str1, str2) is a different function and
        one should not define a function based on how it is going to
        be called!! What if someone changed the caller to this:
        doCompare(currentRemotePrinters, prevRemotePrinters). There is
        no restriction if one calls like this. Here the function is
        taking 2 strings and it does not say which one should be
        passed at what position. Probably if the function takes
        different parameters then it sets an automatic rule on which
        parameter needs to be passed at which position but otherwise
        function definition should take care this.

        Hope you agree with me.

        Thanks and regards,

        Shashi

        *From:*Prasanta Sadhukhan
        *Sent:* Friday, February 15, 2019 12:11 PM
        *To:* Phil Race <philip.r...@oracle.com>
        <mailto:philip.r...@oracle.com>; Shashidhara Veerabhadraiah
        <shashidhara.veerabhadra...@oracle.com>
        <mailto:shashidhara.veerabhadra...@oracle.com>
        *Cc:* 2d-dev@openjdk.java.net <mailto:2d-dev@openjdk.java.net>
        *Subject:* Re: [OpenJDK 2D-Dev] [12] JDK-8212202: NPE in the
        print tests after JDK-8153732

        Hi Shashi,

        I have one comment:
        doCompare(prevRemotePrinters, currentRemotePrinters) is only
        called from run() method when "prevRemotePrinters" is already
        checked to be not null [*if (prevRemotePrinters != null &&
        prevRemotePrinters.length > 0) ]*
        so I see no point in checking "str1" [which is
        prevRemotePrinters] to be null in doCompare(). I guess instead of

        *413             if (str1 == null && str2 == null) {*

        *414                 return false;*

        *415             } else if (str1 == null || str2 == null) {*

        *416                 return true;*

        *417             }*

        you can have

        if (str2 == null)

            return true;

        Regards

        Prasanta

        On 15-Feb-19 2:48 AM, Phil Race wrote:

            +1 .. remember to use the current bug synopsis in the push
            comment

            ie : "[Windows] Exception if no printers are installed."

            -phil.

            On 2/11/19 12:39 AM, Shashidhara Veerabhadraiah wrote:

                Hi Phil, Here is the new Webrev fixing those comments:

                http://cr.openjdk.java.net/~sveerabhadra/8212202/webrev.06/
                <http://cr.openjdk.java.net/%7Esveerabhadra/8212202/webrev.06/>

                Thanks and regards,

                Shashi

                *From:*Philip Race
                *Sent:* Saturday, February 9, 2019 2:25 AM
                *To:* Shashidhara Veerabhadraiah
                <shashidhara.veerabhadra...@oracle.com>
                <mailto:shashidhara.veerabhadra...@oracle.com>
                *Cc:* Prasanta Sadhukhan
                <prasanta.sadhuk...@oracle.com>
                <mailto:prasanta.sadhuk...@oracle.com>;
                2d-dev@openjdk.java.net <mailto:2d-dev@openjdk.java.net>
                *Subject:* Re: [OpenJDK 2D-Dev] [12] JDK-8212202: NPE
                in the print tests after JDK-8153732


                413             if (str1 == null && str2 == null) {
                 414                 return false;
                 415             } else if ((str1 == null && str2 !=
                null) || (str2 == null && str1 != null)) {
                 416                 return true;
                 417             }

                When we get to 415 we already know at least one of
                str1 or str2 is non-null so 415 can just be

                } else if (str1 == null || str2 == null) {

                -phil.

                On 2/6/19, 12:31 AM, Shashidhara Veerabhadraiah wrote:

                    Hi Phil, Here is the updated Webrev fixing those
                    comments:

                    http://cr.openjdk.java.net/~sveerabhadra/8212202/webrev.05/
                    
<http://cr.openjdk.java.net/%7Esveerabhadra/8212202/webrev.05/>

                    Thanks and regards,

                    Shashi

                    *From:*Phil Race
                    *Sent:* Thursday, January 31, 2019 4:36 AM
                    *To:* Shashidhara Veerabhadraiah
                    <shashidhara.veerabhadra...@oracle.com>
                    <mailto:shashidhara.veerabhadra...@oracle.com>
                    *Cc:* Prasanta Sadhukhan
                    <prasanta.sadhuk...@oracle.com>
                    <mailto:prasanta.sadhuk...@oracle.com>;
                    2d-dev@openjdk.java.net
                    <mailto:2d-dev@openjdk.java.net>
                    *Subject:* Re: [OpenJDK 2D-Dev] [12] JDK-8212202:
                    NPE in the print tests after JDK-8153732

                    Sorry .. this got lost ..

                    I don't understand this line :

                      253     jobjectArray emptyArray = env->NewObjectArray(1, 
clazz, NULL);


                    This is returning an array of length 1 and element
                    0 is NULL.
                    I think you want

                    env->NewObjectArray(0, clazz, NULL);

                    and I don't see why you need to create it there

                    instead you can just have

                    304     if (nameArray != NULL) {

                      305       return nameArray;

                      306     } else {

                      307       returnenv->NewObjectArray(0, clazz, NULL);

                      308     }

                      449                 if (prevRemotePrinters != null) {

                    shouldn't this be

                      449                 if (prevRemotePrinters != null&&  
prevRemotePrinters.length>  0) {

                    ?

                    -phil.

                    On 12/10/18 10:19 PM, Shashidhara Veerabhadraiah
                    wrote:

                        Hi Phil, I have updated with small code updates:

                        
http://cr.openjdk.java.net/~sveerabhadra/8212202/webrev.04/
                        
<http://cr.openjdk.java.net/%7Esveerabhadra/8212202/webrev.04/>

                        Thanks and regards,

                        Shashi

                        *From:*Shashidhara Veerabhadraiah
                        *Sent:* Monday, December 10, 2018 3:19 PM
                        *To:* Philip Race <philip.r...@oracle.com>
                        <mailto:philip.r...@oracle.com>
                        *Cc:* Prasanta Sadhukhan
                        <prasanta.sadhuk...@oracle.com>
                        <mailto:prasanta.sadhuk...@oracle.com>;
                        2d-dev@openjdk.java.net
                        <mailto:2d-dev@openjdk.java.net>
                        *Subject:* RE: [OpenJDK 2D-Dev] [12]
                        JDK-8212202: NPE in the print tests after
                        JDK-8153732

                        Hi Phil, Please find the updated Webrev.

                        
http://cr.openjdk.java.net/~sveerabhadra/8212202/webrev.03/
                        
<http://cr.openjdk.java.net/%7Esveerabhadra/8212202/webrev.03/>

                        Thanks and regards,

                        Shashi

                        *From:*Philip Race
                        *Sent:* Friday, December 7, 2018 8:54 PM
                        *To:* Shashidhara Veerabhadraiah
                        <shashidhara.veerabhadra...@oracle.com
                        <mailto:shashidhara.veerabhadra...@oracle.com>>
                        *Cc:* Prasanta Sadhukhan
                        <prasanta.sadhuk...@oracle.com
                        <mailto:prasanta.sadhuk...@oracle.com>>;
                        2d-dev@openjdk.java.net
                        <mailto:2d-dev@openjdk.java.net>
                        *Subject:* Re: [OpenJDK 2D-Dev] [12]
                        JDK-8212202: NPE in the print tests after
                        JDK-8153732

                        First off, I think the high order bit is that
                        if a non-null array reference is returned
                        there are NO
                        null String entries in it. Whether a zero
                        length or null array is returned when there
                        are no printers
                        is the less important issue.

                        However an empty array also tells you there
                        are no printers, and you are less likely to
                        get an NPE from that.
                        It is arguably easier for the caller, if they
                        don't need the extra null check first.
                        FWIW the javax.print public APIs return zero
                        length arrays instead of null and applications
                        seem to survive :-)

                        I don't know what you mean by :
                        > (And anyway we need to handle the first null
                        string reference)?

                        If you are referring to a small matter of
                        coding in the native layer, then that is not
                        an insurmountable problem.

                        Basically if there are problems getting names
                        or whatever in the native layer, handle it
                        THERE, don't make
                        everyone else have to deal with it.

                        One caveat: JNI calls can theoretically fail
                        due to OOME .. in such a case we are doomed and
                        the main goal is to not crash in native and to
                        obey all JNI rules. What is returned in that case
                        can be a null array reference and an NPE in a
                        Java-level user of that reference in such a
                        case is not a big deal.

                        -phil

                        On 12/6/18, 8:10 PM, Shashidhara
                        Veerabhadraiah wrote:

                            Hi Phil, Is it advisable to return zero
                            length array from native? The null return
                            from native is telling the caller that
                            there are no printers connected to the
                            system. To tell this should we allocate a
                            zero length array containing null back to
                            the caller(And anyway we need to handle
                            the first null string reference)? Handling
                            the null on the caller isn't an easier option?

                            Thanks and regards,

                            Shashi

                            *From:*Phil Race
                            *Sent:* Thursday, December 6, 2018 2:35 AM
                            *To:* Shashidhara Veerabhadraiah
                            <shashidhara.veerabhadra...@oracle.com>
                            <mailto:shashidhara.veerabhadra...@oracle.com>;
                            Prasanta Sadhukhan
                            <prasanta.sadhuk...@oracle.com>
                            <mailto:prasanta.sadhuk...@oracle.com>;
                            2d-dev@openjdk.java.net
                            <mailto:2d-dev@openjdk.java.net>
                            *Subject:* Re: [OpenJDK 2D-Dev] [12]
                            JDK-8212202: NPE in the print tests after
                            JDK-8153732

                            But what I am saying is we should not
                            return a NULL string reference
                            from native. You are still allowing that
                            and then having to handle
                            it in Java code.

                            And FWIW you can return a zero length
                            array as well so there
                            isn't a NULL array reference to deal with
                            either.

                            -phil.

                            On 12/3/18 8:29 AM, Shashidhara
                            Veerabhadraiah wrote:

                                Hi Phil, There were 2 problems
                                earlier. One is that, from the native
                                it is possible to have no printers
                                being associated with the
                                system(causing to return null
                                reference) and other problem in the
                                implementation was that there may be
                                no network printers and still return a
                                valid array reference containing a
                                null string. The first problem is
                                fixed by handling null references
                                returned from this function and other
                                problem was that earlier there were
                                different base conditions, for
                                updating the reference and use it to
                                create the printer name array which
                                could produce a valid reference
                                pointing to null string. Here is the
                                updated Webrev which fixes these problems:

                                
http://cr.openjdk.java.net/~sveerabhadra/8212202/webrev.02/
                                
<http://cr.openjdk.java.net/%7Esveerabhadra/8212202/webrev.02/>

                                The big problem was that I was not
                                able to reproduce this problem neither
                                at my end nor at the systems used for
                                PIT testing. Only Sergey had produced
                                this NPE till now.

                                Thanks and regards,

                                Shashi

                                *From:*Phil Race
                                *Sent:* Wednesday, November 28, 2018
                                11:19 PM
                                *To:* Shashidhara Veerabhadraiah
                                <shashidhara.veerabhadra...@oracle.com> 
<mailto:shashidhara.veerabhadra...@oracle.com>;
                                Prasanta Sadhukhan
                                <prasanta.sadhuk...@oracle.com>
                                <mailto:prasanta.sadhuk...@oracle.com>; 
2d-dev@openjdk.java.net
                                <mailto:2d-dev@openjdk.java.net>
                                *Subject:* Re: [OpenJDK 2D-Dev] [12]
                                JDK-8212202: NPE in the print tests
                                after JDK-8153732

                                I am not understanding you. I thought
                                the problem to be we got an array of
                                (say) 3 values
                                (ie printer names) returned from
                                native where some or all of the
                                *values* were NULL.
                                And I am saying we should in such a
                                case in the native code, before returning,
                                remove from the returned array all
                                values that are NULL.
                                That could result in an empty (zero
                                length) array being returned from
                                native but
                                no null names ..

                                -phil.

                                On 11/26/18 10:23 PM, Shashidhara
                                Veerabhadraiah wrote:

                                    The windows function
                                    EnumPrinters() returns a value
                                    that could be zero or greater. If
                                    it is zero we have no other option
                                    but to return null from the
                                    function. I do not think there is
                                    a way where we can always make
                                    sure we get a non-zero value
                                    considering the various system
                                    scenarios. So we should handle the
                                    null return values as well in the
                                    caller of this function I think.

                                    Here is the updated Webrev for
                                    test fix:

                                    
http://cr.openjdk.java.net/~sveerabhadra/8212202/webrev.01/
                                    
<http://cr.openjdk.java.net/%7Esveerabhadra/8212202/webrev.01/>

                                    Thanks and regards,
                                    Shashi

                                    *From:*Phil Race
                                    *Sent:* Tuesday, November 27, 2018
                                    1:52 AM
                                    *To:* Prasanta Sadhukhan
                                    <prasanta.sadhuk...@oracle.com>
                                    <mailto:prasanta.sadhuk...@oracle.com>;
                                    Shashidhara Veerabhadraiah
                                    <shashidhara.veerabhadra...@oracle.com>
                                    
<mailto:shashidhara.veerabhadra...@oracle.com>;
                                    2d-dev@openjdk.java.net
                                    <mailto:2d-dev@openjdk.java.net>
                                    *Subject:* Re: [OpenJDK 2D-Dev]
                                    [12] JDK-8212202: NPE in the print
                                    tests after JDK-8153732

                                    [Removed swing-dev as this as
                                    nothing to do with swing].

                                    You mention in the bug eval that
                                    you don't need a new test because this
                                    is already covered by the test for
                                    8153732. If that is the case then this
                                    bugid should be added to that test.
                                    Although it also looks like there
                                    are plenty of tests that provoke
                                    this ..
                                    if all you need is a system
                                    without any printers then this is
                                    a serious regression.

                                    I am not sure I am following why
                                    doCompare() is the place to fix this.
                                    If getRemotePrinterNames() is
                                    returning NULL strings, then maybe
                                    it should not !

                                    I suggest to fix it there.

                                    -phil.








                                    On 11/26/18 7:51 AM, Prasanta
                                    Sadhukhan wrote:

                                        I am not against doCompare()
                                        changes. I am just saying
                                        run() changes are not needed.

                                        Regards
                                        Prasanta

                                        On 26-Nov-18 9:15 PM,
                                        Shashidhara Veerabhadraiah wrote:

                                            There is a possible case
                                            and that is the reason for
                                            this fix. The possible
                                            states for
                                            prevRemotePinters and
                                            currentRemotePrinters are
                                            null and valid values and
                                            they can reach those
                                            states at any time either
                                            because of network
                                            disconnect or any other OS
                                            related changes. With that
                                            in mind, this fix tries to
                                            eliminate the possible NPE
                                            cases.

                                            Thanks and regards,

                                            Shashi

                                            *From:*Prasanta Sadhukhan
                                            *Sent:* Monday, November
                                            26, 2018 8:01 PM
                                            *To:* Shashidhara
                                            Veerabhadraiah
                                            
<shashidhara.veerabhadra...@oracle.com>
                                            
<mailto:shashidhara.veerabhadra...@oracle.com>;
                                            swing-...@openjdk.java.net
                                            <mailto:swing-...@openjdk.java.net>;
                                            2d-dev@openjdk.java.net
                                            <mailto:2d-dev@openjdk.java.net>
                                            *Subject:* Re: [OpenJDK
                                            2D-Dev] [12] JDK-8212202:
                                            NPE in the print tests
                                            after JDK-8153732

                                            On 26-Nov-18 6:51 PM,
                                            
shashidhara.veerabhadra...@oracle.com
                                            
<mailto:shashidhara.veerabhadra...@oracle.com>
                                            wrote:

                                                Hi Prasanta, I think
                                                we should not create a
                                                behavior across the
                                                functions. doCompare()
                                                does only the
                                                comparison and it may
                                                be used for other
                                                purposes and is
                                                complete with respect
                                                to the comparison
                                                functionality.

                                                run() function has a
                                                different behavior as
                                                it needs to populate
                                                the prevRemotePrinters
                                                and then the
                                                currentRemotePrinters
                                                and then use the
                                                comparison
                                                functionality. I think
                                                this is a good way to do.

                                            Even without the if-else
                                            check, it does populates
                                            the prevRemotePrinters, no?
                                            if "prevRemotePrinters" is
                                            null and
                                            currentRemotePrinters is
                                            null, then no need to
                                            update. If
                                            currentRemotePrinters is
                                            null, then what is the
                                            point of using
                                            getRemotePrintersNames()
                                            to update
                                            prevRemotePrinters as
                                            currentRemotePrinters is
                                            also obtained from
                                            getRemotePrintersNames!!
                                            If "prevRemotePrinters" is
                                            null and
                                            currentRemotePrinters is
                                            not null, then doCompare()
                                            called from run() will be
                                            true and
                                            prevRemotePrinters will be
                                            populated with
                                            currentRemotePrinters.
                                            If "prevRemotePrinters" is
                                            not null and
                                            currentRemotePrinters is
                                            null, then also
                                            prevRemotePrinters will be
                                            populated with
                                            currentRemotePrinters.

                                            Regards
                                            Prasanta








                                                Thanks and regards,

                                                Shashi

                                                On 26/11/18 6:03 PM,
                                                Prasanta Sadhukhan wrote:

                                                    Hi Shashi,

                                                    I think l437 check
                                                    of if-else *if
                                                    (prevRemotePrinters !=
                                                    null) {*

                                                    is not required.
                                                    prevRemotePrinters
                                                    null check is
                                                    addressed in
                                                    str1==null case in
                                                    doCompare().
                                                    If
                                                    prevRemotePrinters
                                                    is null and
                                                    currentRemotePrinters
                                                    is not null, then
                                                    you update
                                                    prevRemotePrinters
                                                    to
                                                    currentRemotePrinters
                                                    as per l415 where
                                                    doCompare returns
                                                    true.
                                                    Also, If
                                                    prevRemotePrinters
                                                    is not null and
                                                    currentRemotePrinters
                                                    is null, then also
                                                    you update
                                                    prevRemotePrinters
                                                    to
                                                    currentRemotePrinters
                                                    which is the
                                                    output of
                                                    getRemotePrintersNames().

                                                    Regards
                                                    Prasanta








                                                    On 26-Nov-18 2:33
                                                    PM, Shashidhara
                                                    Veerabhadraiah wrote:

                                                        Hi All, Please
                                                        review a NPE
                                                        fix for the
                                                        below bug.

                                                        Bug:
                                                        
https://bugs.openjdk.java.net/browse/JDK-8212202

                                                        Webrev:
                                                        
http://cr.openjdk.java.net/~sveerabhadra/8212202/webrev.00/
                                                        
<http://cr.openjdk.java.net/%7Esveerabhadra/8212202/webrev.00/>

                                                        Function
                                                        getRemotePrintersNames()
                                                        may return
                                                        null values
                                                        and hence they
                                                        need to be
                                                        handled from
                                                        the caller of
                                                        that function
                                                        which was
                                                        missing
                                                        earlier. This
                                                        fix handles
                                                        the null
                                                        return values
                                                        of the said
                                                        function.

                                                        Thanks and
                                                        regards,

                                                        Shashi

Reply via email to