This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

Bug 21730 - deadlock in Term and Swing
Summary: deadlock in Term and Swing
Status: CLOSED FIXED
Alias: None
Product: cnd
Classification: Unclassified
Component: Terminalemulator (show other bugs)
Version: 3.x
Hardware: PC Windows 3.1/NT
: P2 blocker (vote)
Assignee: ivan
URL:
Keywords: THREAD
Depends on:
Blocks:
 
Reported: 2002-03-19 22:40 UTC by Andrew Sherman
Modified: 2008-12-23 08:36 UTC (History)
3 users (show)

See Also:
Issue Type: DEFECT
Exception Reporter:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Andrew Sherman 2002-03-19 22:40:24 UTC
This is Sun bugtraq 4649460.

Can get a deadlock between two threads as shown below.
Term can call swing at the same time swing is calling Term.
Naively this is a lock ordering problem.   

"org.netbeans.core.ModuleActions-6" daemon prio=1 tid=0x9fbe98 nid=0xec waiting for monitor entry [0xe0f00000..0xe0f019d8]
treelock->at java.awt.Component.reshape(Component.java:1407)
          at javax.swing.JComponent.reshape(JComponent.java:2926)
          at java.awt.Component.setBounds(Component.java:1399)
          at javax.swing.plaf.basic.BasicScrollBarUI.layoutVScrollbar(BasicScrollBarUI.java:538)
          at javax.swing.plaf.basic.BasicScrollBarUI.layoutContainer(BasicScrollBarUI.java:663)
          at javax.swing.plaf.basic.BasicScrollBarUI$ModelListener.stateChanged(BasicScrollBarUI.java:776)
          at javax.swing.DefaultBoundedRangeModel.fireStateChanged(DefaultBoundedRangeModel.java:329)
          at javax.swing.DefaultBoundedRangeModel.setRangeProperties(DefaultBoundedRangeModel.java:285)
          at javax.swing.JScrollBar.setValues(JScrollBar.java:565)
          at org.netbeans.lib.terminalemulator.Term.adjust_scrollbar(Term.java:3243)
          at org.netbeans.lib.terminalemulator.Term.limit_lines(Term.java:1189)
          at org.netbeans.lib.terminalemulator.Term.access$2900(Term.java:160)
          at org.netbeans.lib.terminalemulator.Term$OpsImpl.op_line_feed(Term.java:2741)
          at org.netbeans.lib.terminalemulator.InterpDumb$4.action(InterpDumb.java:148)
          at org.netbeans.lib.terminalemulator.InterpDumb.processChar(InterpDumb.java:94)
          at org.netbeans.lib.terminalemulator.Term.putc_work(Term.java:3198)
termlock->at org.netbeans.lib.terminalemulator.Term.appendText(Term.java:3947) 
          at org.netbeans.core.output.OutputTabTerm$OutTermPane$TermOutputWriter.appendText(OutputTabTerm.java:1339)
          at org.netbeans.core.output.OutputTabTerm$OutTermPane$TermOutputWriter.write(OutputTabTerm.java:1050)
          at org.netbeans.core.output.OutputTabTerm$OutTermPane$TermOutputWriter.write(OutputTabTerm.java:1109)
          at java.io.PrintWriter.write(PrintWriter.java:229)
          at org.netbeans.core.execution.WriterPrintStream.write(WriterPrintStream.java:56)
          at org.netbeans.core.execution.WriterPrintStream.print(WriterPrintStream.java:189)
          at org.netbeans.core.execution.WriterPrintStream.println(WriterPrintStream.java:339)
          at com.sun.forte4j.j2ee.appsrv.RI.RIAppServerInstance.deploy(RIAppServerInstance.java:397)
          at com.sun.forte4j.j2ee.appsrv.RI.RIAppServerInstance.deploy(RIAppServerInstance.java:1116)
          at org.netbeans.modules.j2ee.impl.DefaultServerInstanceManager.doDeploy(DefaultServerInstanceManager.java:147)
          at org.netbeans.modules.j2ee.impl.DefaultServerInstanceManager.startDeployment(DefaultServerInstanceManager.java:173)
          at 
org.netbeans.modules.j2ee.impl.DefaultServerInstanceManager.serverInstanceDeployment(DefaultServerInstanceManager.java:112)
          at org.netbeans.modules.j2ee.impl.DefaultExecPerformer.startDeployment(DefaultExecPerformer.java:116)
          at org.netbeans.modules.j2ee.impl.ServerExecutor.execute(ServerExecutor.java:72)
          at org.netbeans.modules.j2ee.impl.ServerExecutor.execute(ServerExecutor.java:64)
          at org.netbeans.modules.j2ee.impl.ExecSupport.start(ExecSupport.java:125)
          at org.netbeans.modules.j2ee.impl.ServerExecSupport.start(ServerExecSupport.java:139)
          at org.openide.actions.ExecuteAction.execute(ExecuteAction.java:140)
          at org.openide.actions.ExecuteAction.execute(ExecuteAction.java:237)
          at org.openide.actions.ExecuteAction.performAction(ExecuteAction.java:102)
          at org.netbeans.modules.j2ee.impl.DeployAction.performAction(DeployAction.java:42)
          at org.openide.util.actions.NodeAction.performAction(NodeAction.java:180)
          at org.openide.util.actions.NodeAction.actionPerformed(NodeAction.java:171)
          at org.netbeans.core.ModuleActions$1.run(ModuleActions.java:105)
          at org.openide.util.Task.run(Task.java:152)
          at org.openide.util.RequestProcessor$ProcessorThread.run(RequestProcessor.java:622)


"AWT-EventQueue-0" prio=5 tid=0x3223b8 nid=0xc waiting for monitor entry [0xe72ff000..0xe73019d8]
termlock->at org.netbeans.lib.terminalemulator.Term.do_paint(Term.java:2389)
          at org.netbeans.lib.terminalemulator.Screen.paint(Screen.java:89)
          at javax.swing.JComponent.paintChildren(JComponent.java:498)
          at javax.swing.JComponent.paint(JComponent.java:696)
          at javax.swing.JComponent.paintChildren(JComponent.java:498)
          at javax.swing.JComponent.paint(JComponent.java:696)
          at javax.swing.JComponent.paintChildren(JComponent.java:498)
          at javax.swing.JComponent.paint(JComponent.java:696)
          at javax.swing.JComponent.paintChildren(JComponent.java:498)
          at javax.swing.JComponent.paint(JComponent.java:696)
          at javax.swing.JComponent.paintChildren(JComponent.java:498)
          at javax.swing.JComponent.paint(JComponent.java:696)
          at javax.swing.JComponent.paintChildren(JComponent.java:498)
          at javax.swing.JComponent.paint(JComponent.java:696)
          at javax.swing.JComponent.paintChildren(JComponent.java:498)
          at javax.swing.JComponent.paint(JComponent.java:696)
          at javax.swing.JComponent.paintWithBuffer(JComponent.java:3878)
          at javax.swing.JComponent._paintImmediately(JComponent.java:3821)
          at javax.swing.JComponent.paintImmediately(JComponent.java:3672)
          at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:370)
          at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:124)
          at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:154)
          at java.awt.EventQueue.dispatchEvent(EventQueue.java:337)
          at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:131)
          at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:98)
          at java.awt.Dialog.show(Dialog.java:380)
          at org.netbeans.core.NbPresenter.superShow(NbPresenter.java:642)
          at org.netbeans.core.NbPresenter.run(NbPresenter.java:665)
          at org.openide.util.Mutex.doEventAccess(Mutex.java:917)
          at org.openide.util.Mutex.readAccess(Mutex.java:162)
          at org.netbeans.core.NbPresenter.show(NbPresenter.java:646)
treelock->at java.awt.Component.show(Component.java:946)
          at java.awt.Component.setVisible(Component.java:903)
          at org.netbeans.modules.j2ee.impl.ProgressObject$4.run(ProgressObject.java:131)
          at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:154)
          at java.awt.EventQueue.dispatchEvent(EventQueue.java:337)
          at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:131)
          at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:98)
          at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
          at java.awt.EventDispatchThread.run(EventDispatchThread.java:85)
Comment 1 _ ttran 2002-03-20 08:50:30 UTC
> at javax.swing.JScrollBar.setValues(JScrollBar.java:565)
          at
org.netbeans.lib.terminalemulator.Term.adjust_scrollbar(Term.java:3243)

this is fatal.  Term is calling Swing from a thread other than AWT
Event thread.

What is the thread commitment of term?  thread-safe? 
thread-compatible?    swing-like (call me only from within awt event
thread)?  "I-don't-promise-anything"?
Comment 2 _ ttran 2002-03-22 13:50:38 UTC
well, I've fixed the bug.  adjust_scrollbars() now makes sure that it
call JScrollBars only from AWT event thread
Comment 3 Andrew Sherman 2002-03-22 16:25:49 UTC
Thanks.
Comment 4 Jan Chalupa 2002-04-08 12:32:50 UTC
IMO, this should be fixed for Orion and the next bugfix release of
NetBeans. Attaching the 3.3.2_CANDIDATE keyword.
Comment 5 ssffleming 2002-04-08 17:32:47 UTC
Agreed, needed for Orion FCS, thanks Honza.
Comment 6 ivan 2002-04-08 19:15:25 UTC
Tor is about to apply this to Orion.
Comment 7 Marian Mirilovic 2002-10-16 17:42:15 UTC
verified in [nb_dev](20021016)
Comment 8 Quality Engineering 2003-07-01 16:46:55 UTC
Resolved for 3.4.x or earlier, no new info since then -> closing.
Comment 9 Quality Engineering 2008-12-23 08:36:45 UTC
moving terminal emulator issues to terminalemulator component.
To see the correct version and target milestone of this issue look at Issue
Activity table.