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

Staffan Larsen staffan.larsen at oracle.com
Wed Apr 9 07:11:43 UTC 2014


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.

/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;
> 



More information about the serviceability-dev mailing list