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

shanliang shanliang.jiang at oracle.com
Wed Apr 9 08:24:00 UTC 2014


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.

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/79ed2ed5/attachment-0001.html>


More information about the serviceability-dev mailing list