On 9 apr 2014, at 10:24, shanliang <shanliang.ji...@oracle.com> wrote:
> Staffan Larsen wrote: >> >> On 8 apr 2014, at 22:10, shanliang <shanliang.ji...@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; >>>> >> > >