RFR: 8039432 demo/jvmti/mtrace/TraceJFrame.java can't connect to X11

shanliang shanliang.jiang at oracle.com
Wed Apr 9 08:56:46 UTC 2014


Staffan Larsen wrote:
>
> On 9 apr 2014, at 10:24, shanliang <shanliang.jiang at oracle.com 
> <mailto:shanliang.jiang at oracle.com>> wrote:
>
>> Staffan Larsen wrote:
>>> On 8 apr 2014, at 22:10, shanliang <shanliang.jiang at oracle.com> wrote:
>>>
>>>   
>>>> Hi Staffan,
>>>>
>>>> I did work on this bug and I thought the problem was from a bad DISPLAY setting (see my comments in the bug), I might miss something here.
>>>>
>>>> I looked at the class GraphicsEnvironment.java, getLocalGraphicsEnvironment() calls createGE(), and the latter has the following code:
>>>>
>>>>           Class<GraphicsEnvironment> geCls;
>>>>            ......
>>>>           ge = geCls.newInstance();
>>>> //          long t1 = System.currentTimeMillis();
>>>> //          System.out.println("GE creation took " + (t1-t0)+ "ms.");
>>>>           if (isHeadless()) {
>>>>               ge = new HeadlessGraphicsEnvironment(ge);
>>>>           }
>>>>
>>>> so we should not get an AWTError in case of headless, instead we get a HeadlessGraphicsEnvironment.
>>>>     
>>> If you look at the exception you can see that it is Class.forName() inside createGE() that throws the AWTError. We never get to the if(isHeadless()) statement.
>>>   
>> Yes the exception was thrown before calling isHeadless(), does this 
>> mean a possible bug in the createGE implementation? should we check 
>> isHeadLess() before calling Class.forName() ?
>>  
>> I repeated my old test, it did call GraphicsEnvironment.isHeadless():
>> -------------------------------
>> public class Test extends JFrame {
>>     public Test() {
>>        setTitle("Simple example");
>>        setSize(300, 200);
>>        setLocationRelativeTo(null);
>>        setDefaultCloseOperation(EXIT_ON_CLOSE);
>>     }
>>
>>     public static void main(String[] args) {
>>         if (GraphicsEnvironment.isHeadless()) {
>>             System.out.println("JFrame test was skipped due to 
>> headless mode");
>>
>>             System.exit(0);
>>         }
>>
>>         SwingUtilities.invokeLater(new Runnable() {
>>             @Override
>>             public void run() {
>>                 Test ex = new Test();
>>                 ex.setVisible(true);
>>             }
>>         });
>>     }
>> }
>> -------------------------------
>> When running the test with X11 and a wrong DISPLAY, isHeadless did 
>> not return "true" to stop the test, the test continued and failed 
>> later with the exception:
>>   Exception in thread "main" java.lang.InternalError: Can't connect 
>> to X11 window server using 'toto' as the value of the DISPLAY variable.
>>         at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
>>         at 
>> sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
>>         at 
>> sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:110)
>>         at java.security.AccessController.doPrivileged(Native Method)
>>         at 
>> sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74)
>>         at java.lang.Class.forName0(Native Method)
>>         at java.lang.Class.forName(Class.java:190)
>>         at 
>> java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:102)
>>         at 
>> java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:81)
>>        ...
>>
>> I am wondering that "isHeadLess" would not check a wrong DISPLAY, a 
>> quick look at the method implementation seems telling yes.
>
> It assumes that if you have DISPLAY set, that it is the correct value. 
> Which is a fair assumption, I think.
Yes we do have to set DISPLAY for this issue, I set a wrong DISPLAY to 
reproduce the bug.
>
> With my change, the test now passes in JPRT which it did not before.
Good to hear that the test passes!

Thanks,
Shanliang
>
> /Staffan
>
>>
>> Shanliang
>>> /Staffan
>>>
>>>   
>>>> Look at the following 2 methods:
>>>>
>>>>   public static boolean isHeadless() {
>>>>       return getHeadlessProperty();
>>>>   }
>>>>
>>>>   public boolean isHeadlessInstance() {
>>>>       // By default (local graphics environment), simply check the
>>>>       // headless property.
>>>>       return getHeadlessProperty();
>>>>   }
>>>>
>>>> it seems no difference to call
>>>>   GraphicsEnvironment.getLocalGraphicsEnvironement().isHeadlessInstance()
>>>> and
>>>>   GraphicsEnvironment.isHeadless()   
>>>> yes better to cal the static method, but I am not sure that the direct call would fix the failure.
>>>>
>>>> Thanks,
>>>> Shanliang
>>>>
>>>>
>>>> Staffan Larsen wrote:
>>>>     
>>>>> This test causes exceptions that looks like this:
>>>>>
>>>>> java.awt.AWTError: Can't connect to X11 window server using ‘REDACTED:503' as the value of the DISPLAY variable.
>>>>> 	at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
>>>>> 	at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
>>>>> 	at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:115)
>>>>> 	at java.security.AccessController.doPrivileged(Native Method)
>>>>> 	at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:74)
>>>>> 	at java.lang.Class.forName0(Native Method)
>>>>> 	at java.lang.Class.forName(Class.java:259)
>>>>> 	at java.awt.GraphicsEnvironment.createGE(GraphicsEnvironment.java:102)
>>>>> 	at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:81)
>>>>> 	at TraceJFrame.main(TraceJFrame.java:39)
>>>>> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>>>>> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>>>> 	at java.lang.reflect.Method.invoke(Method.java:484)
>>>>> 	at com.sun.javatest.regtest.MainAction$SameVMRunnable.run(MainAction.java:754)
>>>>> 	at java.lang.Thread.run(Thread.java:744)
>>>>>
>>>>>
>>>>> The fix seems to be to not call GraphicsEnvironment.getLocalGraphicsEnvironement().isHeadlessInstance() but GraphicsEnvironment.isHeadless() directly.
>>>>>
>>>>> Please review the fix below,
>>>>>
>>>>> Thanks,
>>>>> /Staffan
>>>>>
>>>>>
>>>>>
>>>>> diff --git a/test/demo/jvmti/mtrace/TraceJFrame.java b/test/demo/jvmti/mtrace/TraceJFrame.java
>>>>> --- a/test/demo/jvmti/mtrace/TraceJFrame.java
>>>>> +++ b/test/demo/jvmti/mtrace/TraceJFrame.java
>>>>> @@ -36,7 +36,7 @@
>>>>>
>>>>> public class TraceJFrame {
>>>>>     public static void main(String args[]) throws Exception {
>>>>> -        if (GraphicsEnvironment.getLocalGraphicsEnvironment().isHeadlessInstance()) {
>>>>> +        if (GraphicsEnvironment.isHeadless()) {
>>>>>             System.out.println("JFrame test was skipped due to headless mode");
>>>>>         } else {
>>>>>             DemoRun demo;
>>>>>       
>>>   
>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20140409/985c9eec/attachment-0001.html>


More information about the serviceability-dev mailing list