Staffan Larsen wrote:

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




Reply via email to