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

Staffan Larsen staffan.larsen at oracle.com
Wed Apr 9 08:40:42 UTC 2014


On 9 apr 2014, at 10:24, shanliang <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.

With my change, the test now passes in JPRT which it did not before.

/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/d2e56b21/attachment.html>


More information about the serviceability-dev mailing list