Viewing Issue Advanced Details

ID 0003758 Category [DMDirc] Core Severity crash
Reproducibility have not tried Date Submitted 2010-02-11 10:21 Last Update 2010-02-18 20:19
Reporter MD87 Assigned To MD87 View Status public
Priority immediate Status closed Resolution fixed
Platform Fixed in Version Target Version 0.6.3
Product Version Product Build
Summary 0003758: Deadlock in away state change
Description
Found one Java-level deadlock:
=============================
"SwingWorker-pool-1-thread-3032":
  waiting to lock monitor 0x08ab145c (object 0x73d54698, a java.lang.Object),
  which is held by "SwingWorker-pool-1-thread-3025"
"SwingWorker-pool-1-thread-3025":
  waiting to lock monitor 0x089a4634 (object 0x73ca93d8, a java.lang.Object),
  which is held by "IRCParser pingTimer"
"IRCParser pingTimer":
  waiting to lock monitor 0x08b37f08 (object 0x73962798, a java.awt.Component$AWTTreeLock),
  which is held by "AWT-EventQueue-1"
"AWT-EventQueue-1":
  waiting to lock monitor 0x089a4634 (object 0x73ca93d8, a java.lang.Object),
  which is held by "IRCParser pingTimer"

Java stack information for the threads listed above:
===================================================
"SwingWorker-pool-1-thread-3032":
    at com.dmdirc.actions.ActionManager.triggerActions(ActionManager.java:420)
    - waiting to lock <0x73d54698> (a java.lang.Object)
    at com.dmdirc.actions.ActionManager.processEvent(ActionManager.java:391)
    at com.dmdirc.addons.ui_swing.components.frames.TextFrame$11$1.doInBackground(TextFrame.java:468)
    at javax.swing.SwingWorker$1.call(SwingWorker.java:278)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at javax.swing.SwingWorker.run(SwingWorker.java:317)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
"SwingWorker-pool-1-thread-3025":
    at com.dmdirc.Server.isValidChannelName(Server.java:1156)
    - waiting to lock <0x73ca93d8> (a java.lang.Object)
    at com.dmdirc.commandparser.parsers.CommandParser.parseCommand(CommandParser.java:131)
    at com.dmdirc.commandparser.parsers.CommandParser.parseCommand(CommandParser.java:210)
    at com.dmdirc.actions.ActionModel.trigger(ActionModel.java:149)
    at com.dmdirc.actions.Action.trigger(Action.java:563)
    at com.dmdirc.actions.ActionManager.triggerActions(ActionManager.java:421)
    - locked <0x73d54698> (a java.lang.Object)
    at com.dmdirc.actions.ActionManager.processEvent(ActionManager.java:391)
    at com.dmdirc.addons.ui_swing.components.frames.TextFrame$11$1.doInBackground(TextFrame.java:468)
    at javax.swing.SwingWorker$1.call(SwingWorker.java:278)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at javax.swing.SwingWorker.run(SwingWorker.java:317)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
"IRCParser pingTimer":
    at java.awt.Container.clearCurrentFocusCycleRootOnHide(Container.java:3117)
    - waiting to lock <0x73962798> (a java.awt.Component$AWTTreeLock)
    at java.awt.Component.hide(Component.java:1590)
    at java.awt.Component.show(Component.java:1565)
    at java.awt.Component.setVisible(Component.java:1515)
    at javax.swing.JComponent.setVisible(JComponent.java:2612)
    at com.dmdirc.addons.ui_swing.components.frames.InputTextFrame.setAwayIndicator(InputTextFrame.java:263)
    at com.dmdirc.addons.ui_swing.components.frames.InputTextFrame.onBack(InputTextFrame.java:470)
    at com.dmdirc.Server.updateAwayState(Server.java:1713)
    - locked <0x73dae088> (a com.dmdirc.util.ListenerList)
    at com.dmdirc.Server.onSocketClosed(Server.java:1339)
    - locked <0x73ca9480> (a java.lang.Object)
    at com.dmdirc.ServerEventHandler.onSocketClosed(ServerEventHandler.java:173)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.dmdirc.parser.common.CallbackObject.call(CallbackObject.java:151)
    at com.dmdirc.parser.irc.IRCParser.callSocketClosed(IRCParser.java:583)
    at com.dmdirc.parser.irc.IRCParser.disconnect(IRCParser.java:1739)
    at com.dmdirc.Server.disconnect(Server.java:379)
    - locked <0x73ca93d8> (a java.lang.Object)
    - locked <0x73ca9480> (a java.lang.Object)
    at com.dmdirc.Server.reconnect(Server.java:327)
    - locked <0x73ca9480> (a java.lang.Object)
    at com.dmdirc.Server.reconnect(Server.java:337)
    at com.dmdirc.Server.onPingFailed(Server.java:1426)
    at com.dmdirc.ServerEventHandler.onPingFailed(ServerEventHandler.java:233)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.dmdirc.parser.common.CallbackObject.call(CallbackObject.java:151)
    at com.dmdirc.parser.irc.IRCParser.callPingFailed(IRCParser.java:593)
    at com.dmdirc.parser.irc.IRCParser.pingTimerTask(IRCParser.java:1921)
    at com.dmdirc.parser.irc.PingTimer.run(PingTimer.java:53)
    at java.util.TimerThread.mainLoop(Timer.java:512)
    at java.util.TimerThread.run(Timer.java:462)
"AWT-EventQueue-1":
    at com.dmdirc.Server.getChannelPrefixes(Server.java:892)
    - waiting to lock <0x73ca93d8> (a java.lang.Object)
    at com.dmdirc.ui.messages.Styliser.doLinks(Styliser.java:275)
    at com.dmdirc.ui.messages.Styliser.addStyledString(Styliser.java:184)
    at com.dmdirc.ui.messages.Styliser.addStyledString(Styliser.java:157)
    at com.dmdirc.ui.messages.Styliser.getStyledString(Styliser.java:223)
    at com.dmdirc.ui.core.util.Utils.getAttributedString(Utils.java:64)
    at com.dmdirc.addons.ui_swing.textpane.Line.getStyled(Line.java:142)
    at com.dmdirc.addons.ui_swing.textpane.IRCDocument.getStyledLine(IRCDocument.java:299)
    - locked <0x748856c8> (a java.util.ArrayList)
    at com.dmdirc.addons.ui_swing.textpane.IRCDocument.getStyledLine(IRCDocument.java:317)
    at com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas.paintOntoGraphics(TextPaneCanvas.java:220)
    at com.dmdirc.addons.ui_swing.textpane.TextPaneCanvas.paintComponent(TextPaneCanvas.java:148)
    at javax.swing.JComponent.paint(JComponent.java:1029)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    - locked <0x73962798> (a java.awt.Component$AWTTreeLock)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    - locked <0x73962798> (a java.awt.Component$AWTTreeLock)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    - locked <0x73962798> (a java.awt.Component$AWTTreeLock)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    - locked <0x73962798> (a java.awt.Component$AWTTreeLock)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    - locked <0x73962798> (a java.awt.Component$AWTTreeLock)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    - locked <0x73962798> (a java.awt.Component$AWTTreeLock)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    - locked <0x73962798> (a java.awt.Component$AWTTreeLock)
    at javax.swing.JComponent.paint(JComponent.java:1038)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:567)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1220)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:803)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:714)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:694)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at com.dmdirc.addons.ui_swing.DMDircEventQueue.dispatchEvent(DMDircEventQueue.java:79)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Found 1 deadlock.
Needs unit test no
Upstream Bug URL

Relationships

Notes

A patchset (1) related to this change has been added to gerrit by Chris Smith

Run some listeners in separate threads

Fixes issue 3745
Fixes issue 3758

Change-Id: Id611f5bca03f07c87f84c054d73cf1612221c0da

A patchset (2) related to this change has been added to gerrit by Chris Smith

Run some listeners in separate threads

Fixes issue 3745
Fixes issue 3758

Change-Id: Id611f5bca03f07c87f84c054d73cf1612221c0da

A patchset (3) related to this change has been added to gerrit by Chris Smith

Run some listeners in separate threads

Fixes issue 3745
Fixes issue 3758

Change-Id: Id611f5bca03f07c87f84c054d73cf1612221c0da
authorChris Smith <chris@dmdirc.com>2010-02-16 17:50:08 (GMT)
committer Gregory Holmes <greg@dmdirc.com>2010-02-17 02:37:09 (GMT)
commit984b36b234b943ea93d9fdb41b8bf53b77ef6713 (patch) (side-by-side diff)
Run some listeners in separate threads
Fixes issue 3745 Fixes issue 3758 Change-Id: Id611f5bca03f07c87f84c054d73cf1612221c0da Reviewed-on: http://gerrit.dmdirc.com/884 Reviewed-by: Gregory Holmes <greg@dmdirc.com> Automatic-Compile: Gregory Holmes <greg@dmdirc.com>
-rw-r--r--src/com/dmdirc/Channel.java15
-rw-r--r--src/com/dmdirc/Server.java25
2 files changed, 27 insertions, 13 deletions
Click to Expand/Collapse
diff src/com/dmdirc/Channel.java
@@ -566,11 +566,18 @@ public class Channel extends MessageTarget implements ConfigChangeListener {
topics.add(topic);
updateTitle();
- synchronized (listeners) {
- for (TopicChangeListener listener : listeners.get(TopicChangeListener.class)) {
- listener.topicChanged(this, topic);
+ new Thread(new Runnable() {
+
+ /** {@inheritDoc} */
+ @Override
+ public void run() {
+ synchronized (listeners) {
+ for (TopicChangeListener listener : listeners.get(TopicChangeListener.class)) {
+ listener.topicChanged(Channel.this, topic);
+ }
+ }
}
- }
+ }, "Topic change listener runner").start();
}
/**
Click to Expand/Collapse
diff src/com/dmdirc/Server.java
@@ -1711,17 +1711,24 @@ public class Server extends WritableFrameContainer implements ConfigChangeListen
awayMessage = message;
- synchronized (listeners) {
- if (message == null) {
- for (AwayStateListener listener : listeners.get(AwayStateListener.class)) {
- listener.onBack();
- }
- } else {
- for (AwayStateListener listener : listeners.get(AwayStateListener.class)) {
- listener.onAway(message);
+ new Thread(new Runnable() {
+
+ /** {@inheritDoc} */
+ @Override
+ public void run() {
+ synchronized (listeners) {
+ if (message == null) {
+ for (AwayStateListener listener : listeners.get(AwayStateListener.class)) {
+ listener.onBack();
+ }
+ } else {
+ for (AwayStateListener listener : listeners.get(AwayStateListener.class)) {
+ listener.onAway(message);
+ }
+ }
}
}
- }
+ }, "Away state listener runner").start();
}
// </editor-fold>

Issue History

Date Modified Username Field Change
2010-02-11 10:21 MD87 New Issue
2010-02-11 10:21 MD87 Status new => assigned
2010-02-11 10:21 MD87 Assigned To => MD87
2010-02-11 10:21 MD87 Needs unit test => no
2010-02-16 17:51 Version Control Checkin
2010-02-16 17:51 Version Control Note Added: 0009853
2010-02-16 17:51 Version Control Status assigned => fix pending
2010-02-17 02:25 Version Control Checkin
2010-02-17 02:25 Version Control Note Added: 0009881
2010-02-17 02:36 Version Control Checkin
2010-02-17 02:36 Version Control Note Added: 0009886
2010-02-17 02:38 MD87 Checkin
2010-02-17 02:38 MD87 Note Added: 0009889
2010-02-17 02:38 MD87 Status fix pending => resolved
2010-02-17 02:38 MD87 Resolution open => fixed
2010-02-18 20:19 Greboid Status resolved => closed