Java 7 Application freeze at sun.lwawt.macosx.CCursorManager.nativeGetCursorPosition
Viral Barot
vbarot at tibco.com
Mon Nov 18 14:51:05 PST 2013
Accessing AWT frame from a thread causes the application to freeze when executed with JRE 7. The AWT frame is created with SWT_AWT bridge.
Below is the test case in which call to frame.setVisible(true); from the AWT event dispatching thread does not return.
Test Case:
import java.awt.Button;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Composite;
public class Main {
public static void main(String[] args) {
if(System.getProperty("os.name").toLowerCase().startsWith("mac")){
SWT_AWT.embeddedFrameClass = "sun.lwawt.macosx.CViewEmbeddedFrame";
}
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Shell");
shell.setSize(200, 200);
shell.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
final Composite composite = new Composite(shell, SWT.EMBEDDED);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
composite.setLayout(gridLayout);
composite.setSize(200,200);
composite.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
final java.awt.Frame frame = SWT_AWT.new_Frame(composite);
frame.setVisible(false);
frame.setBackground(Color.red);
frame.setSize(200, 200);
Button button = new Button("Submit");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Hello");
}
});
frame.add(button);
frame.doLayout();
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
frame.setVisible(true);
}
});
} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
Below is the thread dump for this.
"AWT-EventQueue-0" prio=5 tid=0x00007f8d0b087000 nid=0x8703 runnable [0x0000000195e40000]
java.lang.Thread.State: RUNNABLE
at sun.lwawt.macosx.CCursorManager.nativeGetCursorPosition(Native Method)
at sun.lwawt.macosx.CCursorManager.getCursorPosition(CCursorManager.java:54)
at sun.lwawt.LWCursorManager.updateCursorImpl(LWCursorManager.java:79)
at sun.lwawt.LWCursorManager.updateCursor(LWCursorManager.java:56)
at sun.lwawt.LWComponentPeer.updateCursorImmediately(LWComponentPeer.java:852)
at java.awt.Component.updateCursorImmediately(Component.java:3123)
at java.awt.Component.show(Component.java:1626)
- locked <0x0000000160c5b8c8> (a java.awt.Component$AWTTreeLock)
at java.awt.Window.show(Window.java:1042)
at sun.awt.EmbeddedFrame.show(EmbeddedFrame.java:179)
at java.awt.Component.show(Component.java:1651)
at java.awt.Component.setVisible(Component.java:1603)
at java.awt.Window.setVisible(Window.java:1014)
at Main$2.run(Main.java:60)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:241)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Locked ownable synchronizers:
- None
While in the above test case if invokeLater is called instead of invokeAndWait, the test case runs fine. But in my application the invokeLater calls also freeze at same location.
This behavoir happens with SWT 3.7.2 as well as 4.3.
More information about the macosx-port-dev
mailing list