[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-macosx-port-dev
Subject:    Re: Java 7 Application freeze at sun.lwawt.macosx.CCursorManager.nativeGetCursorPosition
From:       Viral Barot <vbarot () tibco ! com>
Date:       2014-02-25 22:34:19
Message-ID: 3593678D-1136-44CB-AC8F-DFF3F242A827 () tibco ! com
[Download RAW message or body]

Hi Petr,
Are there any new findings with the AppKit thread dump.

Thanks,
Viral 

On Nov 25, 2013, at 6:53 AM, Viral Barot <vbarot@tibco.com> wrote:

> Hi Petr,
> Here is the dump of the Appkit thread and the AWT Thread. As I indicated earlier \
> our original application does not call invokeAndWait, it uses invokeLater to make \
> changes to the frame once the frame is created in Appkit thread. Also I see this \
> issue with SWT 3.7.2 as well as the latest 4.3. 
> "AWT-EventQueue-0" prio=5 tid=0x00007fcc9b357000 nid=0xbf03 runnable \
>                 [0x0000000167cac000]
> 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.hide(Component.java:1696)
> 	- locked <0x0000000158b7a4e0> (a java.awt.Component$AWTTreeLock)
> 	at java.awt.Window.hide(Window.java:1116)
> 	at sun.awt.EmbeddedFrame.hide(EmbeddedFrame.java:192)
> 	at java.awt.Component.show(Component.java:1653)
> 	at java.awt.Component.setVisible(Component.java:1603)
> 	at java.awt.Window.setVisible(Window.java:1014)
> 	at com.tibco.cep.studio.ui.overview.OverviewUtils.refreshOverview(OverviewUtils.java:122)
>   at com.tibco.cep.studio.ui.overview.OverviewUtils$1.run(OverviewUtils.java:51)
> 	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
> 	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
> 
> "AppKit Thread" prio=5 tid=0x00007fcc9a803800 nid=0x707 waiting for monitor entry \
>                 [0x00007fff58cb2000]
> java.lang.Thread.State: BLOCKED (on object monitor)
> 	at java.awt.Container.addImpl(Container.java:1077)
> 	- waiting to lock <0x0000000158b7a4e0> (a java.awt.Component$AWTTreeLock)
> 	at java.awt.Container.add(Container.java:966)
> 	at com.tomsawyer.canvas.swing.TSBaseSwingCanvas.setInnerCanvas(SourceFile:4258)
> 	at com.tomsawyer.interactive.swing.TSSwingCanvas.setInnerCanvas(SourceFile:798)
> 	at com.tomsawyer.canvas.swing.TSBaseSwingCanvas.createGUI(SourceFile:3870)
> 	at com.tomsawyer.canvas.swing.TSBaseSwingCanvas.<init>(SourceFile:138)
> 	at com.tomsawyer.interactive.swing.TSSwingCanvas.<init>(SourceFile:160)
> 	at com.tomsawyer.interactive.swing.TSSwingCanvas.<init>(SourceFile:138)
> 	at com.tibco.cep.diagramming.drawing.DrawingCanvas.<init>(DrawingCanvas.java:37)
> 	at com.tibco.cep.diagramming.drawing.DiagramManager.initialize(DiagramManager.java:233)
>   at com.tibco.cep.diagramming.drawing.DiagramManager.<init>(DiagramManager.java:196)
>   at com.tibco.cep.studio.ui.diagrams.EntityDiagramManager.<init>(EntityDiagramManager.java:135)
>   at com.tibco.cep.studio.ui.diagrams.EventDiagramManager.<init>(EventDiagramManager.java:87)
>   at com.tibco.cep.studio.ui.editors.events.EventDiagramEditor.getDiagramManager(EventDiagramEditor.java:24)
>   at com.tibco.cep.studio.ui.editors.EntityDiagramEditor.addFormPage(EntityDiagramEditor.java:85)
>   at com.tibco.cep.studio.ui.editors.EntityDiagramEditor.createUIEditorPage(EntityDiagramEditor.java:77)
>   at com.tibco.cep.studio.ui.editors.EntityDiagramEditor.createPages(EntityDiagramEditor.java:54)
>   at org.eclipse.ui.part.MultiPageEditorPart.createPartControl(MultiPageEditorPart.java:348)
>   at org.eclipse.ui.internal.EditorReference.createPartHelper(EditorReference.java:670)
>   at org.eclipse.ui.internal.EditorReference.createPart(EditorReference.java:465)
> 	at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595)
>   at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:313)
> 	at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:180)
>   at org.eclipse.ui.internal.presentations.util.PresentablePartFolder.select(PresentablePartFolder.java:270)
>   at org.eclipse.ui.internal.presentations.util.LeftToRightTabOrder.select(LeftToRightTabOrder.java:65)
>   at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation.selectPart(TabbedStackPresentation.java:473)
>   at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1245)
>   at org.eclipse.ui.internal.PartStack.setSelection(PartStack.java:1198)
> 	at org.eclipse.ui.internal.PartStack.presentationSelectionChanged(PartStack.java:834)
>   at org.eclipse.ui.internal.PartStack.access$1(PartStack.java:823)
> 	at org.eclipse.ui.internal.PartStack$1.selectPart(PartStack.java:137)
> 	at org.eclipse.ui.internal.presentations.util.TabbedStackPresentation$1.handleEvent(TabbedStackPresentation.java:133)
>   at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:269)
>   at org.eclipse.ui.internal.presentations.util.AbstractTabFolder.fireEvent(AbstractTabFolder.java:278)
>   at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder.access$1(DefaultTabFolder.java:1)
>   at org.eclipse.ui.internal.presentations.defaultpresentation.DefaultTabFolder$2.handleEvent(DefaultTabFolder.java:88)
>   at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
> 	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4128)
> 	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1457)
> 	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1480)
> 	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1465)
> 	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1270)
> 	at org.eclipse.swt.custom.CTabFolder.setSelection(CTabFolder.java:2746)
> 	at org.eclipse.swt.custom.CTabFolder.onMouse(CTabFolder.java:1433)
> 	at org.eclipse.swt.custom.CTabFolder$1.handleEvent(CTabFolder.java:257)
> 	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
> 	at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4128)
> 	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1457)
> 	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1480)
> 	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1465)
> 	at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:1270)
> 	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3974)
> 	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3613)
> 	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701)
> 	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665)
> 	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499)
> 	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679)
> 	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
> 	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668)
> 	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
> 	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
>   at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
>   at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
>   at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
>   at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
> 	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>   at java.lang.reflect.Method.invoke(Method.java:606)
> 	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
> 	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
> 	at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
> 	at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
> 
> Locked ownable synchronizers:
> 	- None
> 
> 
> 
> On Nov 18, 2013, at 10:55 PM, Petr Pchelko <petr.pchelko@oracle.com> wrote:
> 
> > Hello, Viral.
> > 
> > It's known that there are some deadlocks in SWT_AWT bridge on Mac. Here's an \
> > example: https://bugs.openjdk.java.net/browse/JDK-8020165
> > 
> > It would be useful if you also post the dump of an Appkit thread to identify your \
> > particular case. 
> > The deadlock occurs because AWT is called on the main thread. So the main thread \
> > get blocked on some internal AWT lock, while the EventDispatchThread is trying to \
> > perform a synchronous operation on the main thread. It's not quite obvious how to \
> > fix that internally, because for the normal AWT application we have a strict rule \
> > not to acquire locks on the Appkit thread.  
> > For now the workaround could be to wrap all the usages of AWT inside invokeLater \
> > (except the initial   SWT_AWT.new_Frame(composite) call). This should fix your \
> > deadlock.  
> > Also, which version of SWT are you using? The newer versions are patched so that \
> > you could not set the  embeddedFrameClass explicitly. That patch also contains \
> > additional changes in bridge initialization, so the bridge does not work quite \
> > well with older versions. This could be another reason of your deadlock. 
> > With best regards. Petr.
> > 
> > On 19.11.2013, at 2:51, Viral Barot <vbarot@tibco.com> wrote:
> > 
> > > 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.
> > > 
> > > 
> > > 
> > > 
> > 
> 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic