[OpenJDK 2D-Dev] [9] RFR: JDK-8066139, , Null return from PrintJob.getGraphics() running closed/java/awt/PrintJob/HighResTest/HighResTest.java

Phil Race philip.race at oracle.com
Tue Mar 15 22:14:45 UTC 2016


On 03/10/2016 02:34 AM, prasanta sadhukhan wrote:
> Hi Phil,
>
> Please find the modified webrev
> http://cr.openjdk.java.net/~psadhukhan/8066139/webrev.02/

+1
>
> I tested in Mac too but there it seems to be working (ie no NPE) 
> without and with this fix.
>

The mac code is sufficiently different that it is not a surprise that it 
behaves differently.


> For issue seen on windows , I have raised a bug JDK-8151589 
> <https://bugs.openjdk.java.net/browse/JDK-8151589> (strangely it is 
> not seen in jdk1.8.0_76 but seen from  1.9.0-ea-b01 onwards, can you 
> tell me what is the release version before b01?]

That suggests a bug introduced before 8GA, fixed in an 8-update, but not 
in 9.
But I find that a bit unlikely and I don't want to speculate more. It 
just needs investigation.

-phil.

>
> Regards
> Prasanta
> On 3/8/2016 9:45 PM, Philip Race wrote:
>> > However, I am finding a strange issue with and without this fix 
>> too. The "Center" string is not printed
>>
>> Sounds completely unrelated to anything to do with the NPE bug.
>>
>> It is probably appropriate to file that as a separate bug.
>> No big surprise that the behaviour is platform-specific as there
>> is a lot of difference in Windows vs Linux (or vs Mac) in the 
>> printing code.
>>
>> -phil.
>>
>> On 3/8/16, 2:30 AM, prasanta sadhukhan wrote:
>>>
>>>
>>> On 3/8/2016 2:17 AM, Phil Race wrote:
>>>> I don't think starting a new thread can be right. That would re-invoke
>>>> printerJob.print() which even if you can reuse a PrinterJob 
>>>> (something that
>>>> was never set out in spec.) you are surely getting a new spool job 
>>>> .. not
>>>> a continuation. There a couple of other things I am not sure about 
>>>> either.
>>>>
>>>> I've looked into this - only on Linux - and I believe the issue is that
>>>> the test program has decided up-front how many pages it is going to
>>>> print and it is paying no attention to the selected page ranges.
>>>> Not what the 'user' asked for but it is perfectly within its rights 
>>>> to do so.
>>>>
>>>> However the 2D PrinterJob operates in a way where it calls back
>>>> asking for the specific pages it wants to be printed and there the
>>>> app. must comply. The PrinterJob terminates once it has done.
>>>>
>>>> In the case when the 2D PrinterJob is being used to 'run' a
>>>> PrintJob then it must *never* return until the application has
>>>> called "end" - or some exception occurs.
>>>>
>>>> So we need to remove the elements that will cause the job to exit.
>>>>
>>>> --- a/src/java.desktop/share/classes/sun/print/PrintJob2D.java
>>>> +++ b/src/java.desktop/share/classes/sun/print/PrintJob2D.java
>>>> @@ -995,6 +995,7 @@
>>>>      public void run() {
>>>>
>>>>          try {
>>>> +            attributes.remove(PageRanges.class);
>>>>              printerJob.print(attributes);
>>>>          } catch (PrinterException e) {
>>>>              //REMIND: need to store this away and not rethrow it.
>>>> diff --git 
>>>> a/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java 
>>>> b/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
>>>> --- a/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
>>>> +++ b/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java
>>>> @@ -1172,6 +1172,7 @@
>>>>          pageRangesAttr = (PageRanges)attributes.get(PageRanges.class);
>>>>          if (!isSupportedValue(pageRangesAttr, attributes)) {
>>>>              pageRangesAttr = null;
>>>> +            setPageRange(-1, -1);
>>>>          } else {
>>>>              if 
>>>> ((SunPageSelection)attributes.get(SunPageSelection.class)
>>>>                       == SunPageSelection.RANGE) {
>>>>
>>>>
>>>> This works for me on Linux although
>>>> a) I have not tried Windows)
>>> I tried on windows. The NPE is not seen and it prints 2 pages.
>>> However, I am finding a strange issue with and without this fix too. 
>>> The "Center" string is not printed in the 1st page in both 
>>> "Portrait" and "Landscape" mode (although the rectangles are 
>>> printed) but is printed in the 2nd page.
>>> I do not find this issue in linux.
>>>
>>> Regards
>>> Prasanta
>>>> b) I have not verified if there are no negative consequences from 
>>>> the 2nd change.
>>>>
>>>> -phil.
>>>>
>>>> On 03/01/2016 03:14 AM, prasanta sadhukhan wrote:
>>>>> Hi Phil,
>>>>>
>>>>> Please find an updated webrev:
>>>>> http://cr.openjdk.java.net/~psadhukhan/8066139/webrev.01/
>>>>>
>>>>> It seems if printerJobThread finished printing, it will set 
>>>>> graphicsToBeDrawn/graphicsDrawn ArrayList to null resulting in 
>>>>> getGraphics() returning null in the 2nd iteration causing NPE so
>>>>>  I have modified printerJobThread#run so that when it has finished 
>>>>> printing, do not set the arrayList to null but set a flag. In 
>>>>> getGraphics(), I check that flag and start a new printerJobThread 
>>>>> to handle the next printing.
>>>>> I have tested "All" and "Pages" selection.
>>>>>
>>>>> Regards
>>>>> Prasanta
>>>>> On 2/22/2016 1:35 PM, Philip Race wrote:
>>>>>> > It seems this behaviour is same in linux too for this 
>>>>>> HighResTest testcase.
>>>>>>
>>>>>> OK that is good information .. so is not really a regression from 
>>>>>> 8061267 <https://bugs.openjdk.java.net/browse/JDK-8061267> as 
>>>>>> that is not in
>>>>>> any way touching linux .. it is a pre-existing issue in a code 
>>>>>> path that was not being tested.
>>>>>>
>>>>>> -phil.
>>>>>>
>>>>>> On 2/22/16, 11:59 AM, prasanta sadhukhan wrote:
>>>>>>> Hi Phil,
>>>>>>>
>>>>>>> >>Additionally, have you tried running the original test case 
>>>>>>> provided with 8061267
>>>>>>> >> against your fix ?
>>>>>>> The 8061267 testcase behaves similarly before and after my fix.
>>>>>>>
>>>>>>> >> If I manually select it, (ie select that "Pages" radio 
>>>>>>> button) then press print,
>>>>>>> >> then voila, the NPE is back!
>>>>>>> It seems this behaviour is same in linux too for this 
>>>>>>> HighResTest testcase.
>>>>>>>
>>>>>>> Regards
>>>>>>> Prasanta
>>>>>>> On 2/20/2016 1:55 AM, Phil Race wrote:
>>>>>>>> I am having trouble building JDK 9 at the moment so i applied 
>>>>>>>> 8061267 to jdk8u-dev
>>>>>>>> and was able to reproduce the regression and have a couple of 
>>>>>>>> observations
>>>>>>>>
>>>>>>>> - I am now seeing the NPE after the first page as you did .. 
>>>>>>>> puzzling.
>>>>>>>> - I next applied your fix but still see the NPE !
>>>>>>>>
>>>>>>>> It appears that all your fix did is stop the "PD_PAGENUMS"  
>>>>>>>> flag being automatically
>>>>>>>> set. If I manually select it, (ie select that "Pages" radio 
>>>>>>>> button) then press print,
>>>>>>>> then voila, the NPE is back!
>>>>>>>>
>>>>>>>> -phil.
>>>>>>>>
>>>>>>>>
>>>>>>>> On 02/19/2016 10:53 AM, Phil Race wrote:
>>>>>>>>> I am not sure I can be correctly understanding the fix as the 
>>>>>>>>> ramification seems
>>>>>>>>> to be that if the users wants to print only Page 3 of a 10 
>>>>>>>>> page document and so sets
>>>>>>>>> from page=3 and to page=3, that this request will be ignored 
>>>>>>>>> and all pages will
>>>>>>>>> be printed .. can you test such a scenario.
>>>>>>>>>
>>>>>>>>> Additionally, have you tried running the original test case 
>>>>>>>>> provided with 8061267
>>>>>>>>> against your fix ?
>>>>>>>>>
>>>>>>>>> Also when I ran the HighResTest on a current build I saw a 
>>>>>>>>> null graphics on
>>>>>>>>> the very first call to getGraphics() which is different than 
>>>>>>>>> what I interpret
>>>>>>>>> you as saying - you see the null *after* the first page is 
>>>>>>>>> printed.
>>>>>>>>>
>>>>>>>>> -phil.
>>>>>>>>>
>>>>>>>>> On 02/19/2016 01:18 AM, prasanta sadhukhan wrote:
>>>>>>>>>> Hi Phil, All,
>>>>>>>>>>
>>>>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8066139
>>>>>>>>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8066139/webrev.00/
>>>>>>>>>>
>>>>>>>>>> It was seen after fix of JDK-8061267 
>>>>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8061267>: 
>>>>>>>>>> PrinterJob: Specified Page Ranges not displayed in Windows 
>>>>>>>>>> Native Print Dialog
>>>>>>>>>> the closed/java/awt/PrintJob/HighResTest/HighResTest.java was 
>>>>>>>>>> failing with NPE when PrinterJob.getGraphics() is called the 
>>>>>>>>>> 2nd time before calling PrinterJob.end().
>>>>>>>>>>
>>>>>>>>>> The above fix caused this regression because it sets the 
>>>>>>>>>> PD_PAGENUMS flag for windows PrintDlg struct which causes 
>>>>>>>>>> *Pages* radio button to be selected in print dialog.
>>>>>>>>>> However, fromPage and toPage was both set to 1 so after the 
>>>>>>>>>> 1st page is printed, RasterPrinterJob.print(attributes) 
>>>>>>>>>> finishes and graphicsToBeDrawn.closeWhenEmpty() gets called
>>>>>>>>>> http://hg.openjdk.java.net/jdk9/client/jdk/file/d8def65c6c00/src/java.desktop/share/classes/sun/print/PrintJob2D.java#l1006
>>>>>>>>>>
>>>>>>>>>> which sets the queue to null so when 
>>>>>>>>>> PrinterJob2D#getGraphics() calls graphicsToBeDrawn.pop() it 
>>>>>>>>>> sees queue to be null and sets graphics object to be null so
>>>>>>>>>> PrinterJob.getGraphics() gets null and g.drawLine in testcase 
>>>>>>>>>> causes NPE since g is null.
>>>>>>>>>>
>>>>>>>>>> Fix was done to set the PD_PAGENUMS flag only when toPage is 
>>>>>>>>>> more than fromPage in which case, "All" will be selected in 
>>>>>>>>>> printer dialog and RasterPrinterJob.print() will finish only 
>>>>>>>>>> after printing all the pages.
>>>>>>>>>>
>>>>>>>>>> Regards
>>>>>>>>>> Prasanta
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>
>>>>
>>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/2d-dev/attachments/20160315/2e4b331c/attachment.html>


More information about the 2d-dev mailing list