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;