Hi folks,

I've found a deadlock at StateMachine#handle(StateMachine.java:129) and StateMachineProxyBuilder $MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253), when using two layered state machines in pipeline. It get into deadlock because both methods seems to be called concurrently.

Does anyone know how to avoid such deadlock???

See the full Thread dump at the end of this message.

Best regards,
--
Rafael Marins


--------------------------------- F U L L T H R E A D D U M P ---------------------------------


Full thread dump Java HotSpot(TM) Client VM (1.5.0_19-137 mixed mode, sharing):

"IsdnWorker(port 44237): id 937943, 55551111 => 55552222" prio=5 tid=0x01013cf0 nid=0x88c600 waiting for monitor entry [0xb0d0b000..0xb0d0bd90] at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 129) - waiting to lock <0x296300c0> (a org.apache.mina.statemachine.context.DefaultStateContext) at org.apache.mina.statemachine.StateMachineProxyBuilder $MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
        at $Proxy12.writeComplete(Unknown Source)
at org .neociclo .netty .statemachine .DefaultStateMachineChannelHandler .handleUpstream(DefaultStateMachineChannelHandler.java:57) at org .neociclo .netty .statemachine .ChannelAllCoverageWrapper .handleUpstream(ChannelAllCoverageWrapper.java:55) at org .jboss .netty .channel .DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:567) at org.jboss.netty.channel.DefaultChannelPipeline $DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java: 803) at org .neociclo .netty .statemachine .SimpleStateMachineHandler.handleEvent(SimpleStateMachineHandler.java: 55) at org .neociclo .isdn .netty .handler.PhysicalLinkHandler.unhandledEvent(PhysicalLinkHandler.java: 193)
        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:585)
at org .apache .mina .statemachine .transition.MethodTransition.invokeMethod(MethodTransition.java:272) at org .apache .mina .statemachine .transition.MethodTransition.doExecute(MethodTransition.java:229) at org .apache .mina .statemachine .transition.AbstractTransition.execute(AbstractTransition.java:73) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 173) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 263) at org .apache.mina.statemachine.StateMachine.processEvents(StateMachine.java: 160) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 147) - locked <0x29630390> (a org.apache.mina.statemachine.context.DefaultStateContext) at org.apache.mina.statemachine.StateMachineProxyBuilder $MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
        at $Proxy12.messageReceived(Unknown Source)
at org .neociclo .netty .statemachine .DefaultStateMachineChannelHandler .handleUpstream(DefaultStateMachineChannelHandler.java:54) at org .neociclo .netty .statemachine .ChannelAllCoverageWrapper .handleUpstream(ChannelAllCoverageWrapper.java:55) at org .jboss .netty .channel .DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:567) at org .jboss .netty .channel .DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:562) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java: 342) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java: 329)
        at org.neociclo.isdn.netty.channel.IsdnWorker.run(IsdnWorker.java:344)
at org .jboss .netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:113) at org .jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java: 53) at java.util.concurrent.ThreadPoolExecutor $Worker.runTask(ThreadPoolExecutor.java:651) at java.util.concurrent.ThreadPoolExecutor $Worker.run(ThreadPoolExecutor.java:676)
        at java.lang.Thread.run(Thread.java:613)

"ReaderThread" prio=5 tid=0x0100c750 nid=0x88b800 runnable [0xb0c8a000..0xb0c8ad90]
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
        at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
        - locked <0x29abf8a0> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:167)
        at java.io.BufferedReader.fill(BufferedReader.java:136)
        at java.io.BufferedReader.readLine(BufferedReader.java:299)
        - locked <0x29abf8a0> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(BufferedReader.java:362)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner $ReaderThread.run(RemoteTestRunner.java:140)

"Low Memory Detector" daemon prio=5 tid=0x010091d0 nid=0x81aa00 runnable [0x00000000..0x00000000]

"CompilerThread0" daemon prio=9 tid=0x010087c0 nid=0x819c00 waiting on condition [0x00000000..0xb0b077d8]

"Signal Dispatcher" daemon prio=9 tid=0x01008330 nid=0x817800 waiting on condition [0x00000000..0x00000000]

"Finalizer" daemon prio=8 tid=0x01007b30 nid=0x816600 in Object.wait() [0xb0a05000..0xb0a05d90]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x29a9d978> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:120)
        - locked <0x29a9d978> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:136)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x01007770 nid=0x814e00 in Object.wait() [0xb0984000..0xb0984d90]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x29a9da00> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:474)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
        - locked <0x29a9da00> (a java.lang.ref.Reference$Lock)

"main" prio=5 tid=0x01001670 nid=0xb0801000 waiting for monitor entry [0xb07fe000..0xb0800148] at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 129) - waiting to lock <0x29630390> (a org.apache.mina.statemachine.context.DefaultStateContext) at org.apache.mina.statemachine.StateMachineProxyBuilder $MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
        at $Proxy12.writeRequested(Unknown Source)
at org .neociclo .netty .statemachine .DefaultStateMachineChannelHandler .handleDownstream(DefaultStateMachineChannelHandler.java:111) at org .neociclo .netty .statemachine .ChannelAllCoverageWrapper .handleDownstream(ChannelAllCoverageWrapper.java:49) at org .jboss .netty .channel .DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:590) at org.jboss.netty.channel.DefaultChannelPipeline $ DefaultChannelHandlerContext .sendDownstream(DefaultChannelPipeline.java:796) at org .neociclo .netty .statemachine .SimpleStateMachineHandler.handleEvent(SimpleStateMachineHandler.java: 53) at org .neociclo .isdn .netty .handler .LogicalConnectionHandler.unhandledEvent(LogicalConnectionHandler.java: 192)
        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:585)
at org .apache .mina .statemachine .transition.MethodTransition.invokeMethod(MethodTransition.java:272) at org .apache .mina .statemachine .transition.MethodTransition.doExecute(MethodTransition.java:229) at org .apache .mina .statemachine .transition.AbstractTransition.execute(AbstractTransition.java:73) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 173) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 263) at org .apache.mina.statemachine.StateMachine.processEvents(StateMachine.java: 160) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 147) - locked <0x296300c0> (a org.apache.mina.statemachine.context.DefaultStateContext) at org.apache.mina.statemachine.StateMachineProxyBuilder $MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
        at $Proxy12.closeRequested(Unknown Source)
at org .neociclo .netty .statemachine .DefaultStateMachineChannelHandler .handleDownstream(DefaultStateMachineChannelHandler.java:117) at org .neociclo .netty .statemachine .ChannelAllCoverageWrapper .handleDownstream(ChannelAllCoverageWrapper.java:49) at org .jboss .netty .channel .DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:590) at org .jboss .netty .channel .DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:585)
        at org.jboss.netty.channel.Channels.close(Channels.java:1033)
at org.jboss.netty.channel.AbstractChannel.close(AbstractChannel.java: 185) at org .neociclo .isdn .netty .channel .IsdnClientChannelTest .testChannelConnectAndDisconnect(IsdnClientChannelTest.java:130)
        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:585)
        at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
at org .junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
        at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
at org .junit .internal .runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java: 77)
        at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
at org .junit .internal .runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88) at org .junit .internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java: 51) at org.junit.internal.runners.JUnit4ClassRunner $1.run(JUnit4ClassRunner.java:44) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java: 27) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) at org .junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) at org .eclipse .jdt .internal .junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org .eclipse .jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org .eclipse .jdt .internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java: 467) at org .eclipse .jdt .internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java: 683) at org .eclipse .jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java: 390) at org .eclipse .jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java: 197)

"VM Thread" prio=9 tid=0x01006ed0 nid=0x814000 runnable

"VM Periodic Task Thread" prio=9 tid=0x01009db0 nid=0x806000 waiting on condition

"Exception Catcher Thread" prio=10 tid=0x01001890 nid=0x80bc00 runnable

Found one Java-level deadlock:
=============================
"IsdnWorker(port 44237): id 937943, 55551111 => 55552222":
waiting to lock monitor 0x00815cb8 (object 0x296300c0, a org.apache.mina.statemachine.context.DefaultStateContext),
  which is held by "main"
"main":
waiting to lock monitor 0x00815c70 (object 0x29630390, a org.apache.mina.statemachine.context.DefaultStateContext), which is held by "IsdnWorker(port 44237): id 937943, 55551111 => 55552222"

Java stack information for the threads listed above:
===================================================
"IsdnWorker(port 44237): id 937943, 55551111 => 55552222":
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 129) - waiting to lock <0x296300c0> (a org.apache.mina.statemachine.context.DefaultStateContext) at org.apache.mina.statemachine.StateMachineProxyBuilder $MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
        at $Proxy12.writeComplete(Unknown Source)
at org .neociclo .netty .statemachine .DefaultStateMachineChannelHandler .handleUpstream(DefaultStateMachineChannelHandler.java:57) at org .neociclo .netty .statemachine .ChannelAllCoverageWrapper .handleUpstream(ChannelAllCoverageWrapper.java:55) at org .jboss .netty .channel .DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:567) at org.jboss.netty.channel.DefaultChannelPipeline $DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java: 803) at org .neociclo .netty .statemachine .SimpleStateMachineHandler.handleEvent(SimpleStateMachineHandler.java: 55) at org .neociclo .isdn .netty .handler.PhysicalLinkHandler.unhandledEvent(PhysicalLinkHandler.java: 193)
        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:585)
at org .apache .mina .statemachine .transition.MethodTransition.invokeMethod(MethodTransition.java:272) at org .apache .mina .statemachine .transition.MethodTransition.doExecute(MethodTransition.java:229) at org .apache .mina .statemachine .transition.AbstractTransition.execute(AbstractTransition.java:73) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 173) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 263) at org .apache.mina.statemachine.StateMachine.processEvents(StateMachine.java: 160) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 147) - locked <0x29630390> (a org.apache.mina.statemachine.context.DefaultStateContext) at org.apache.mina.statemachine.StateMachineProxyBuilder $MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
        at $Proxy12.messageReceived(Unknown Source)
at org .neociclo .netty .statemachine .DefaultStateMachineChannelHandler .handleUpstream(DefaultStateMachineChannelHandler.java:54) at org .neociclo .netty .statemachine .ChannelAllCoverageWrapper .handleUpstream(ChannelAllCoverageWrapper.java:55) at org .jboss .netty .channel .DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:567) at org .jboss .netty .channel .DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:562) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java: 342) at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java: 329)
        at org.neociclo.isdn.netty.channel.IsdnWorker.run(IsdnWorker.java:344)
at org .jboss .netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:113) at org .jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java: 53) at java.util.concurrent.ThreadPoolExecutor $Worker.runTask(ThreadPoolExecutor.java:651) at java.util.concurrent.ThreadPoolExecutor $Worker.run(ThreadPoolExecutor.java:676)
        at java.lang.Thread.run(Thread.java:613)
"main":
at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 129) - waiting to lock <0x29630390> (a org.apache.mina.statemachine.context.DefaultStateContext) at org.apache.mina.statemachine.StateMachineProxyBuilder $MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
        at $Proxy12.writeRequested(Unknown Source)
at org .neociclo .netty .statemachine .DefaultStateMachineChannelHandler .handleDownstream(DefaultStateMachineChannelHandler.java:111) at org .neociclo .netty .statemachine .ChannelAllCoverageWrapper .handleDownstream(ChannelAllCoverageWrapper.java:49) at org .jboss .netty .channel .DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:590) at org.jboss.netty.channel.DefaultChannelPipeline $ DefaultChannelHandlerContext .sendDownstream(DefaultChannelPipeline.java:796) at org .neociclo .netty .statemachine .SimpleStateMachineHandler.handleEvent(SimpleStateMachineHandler.java: 53) at org .neociclo .isdn .netty .handler .LogicalConnectionHandler.unhandledEvent(LogicalConnectionHandler.java: 192)
        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:585)
at org .apache .mina .statemachine .transition.MethodTransition.invokeMethod(MethodTransition.java:272) at org .apache .mina .statemachine .transition.MethodTransition.doExecute(MethodTransition.java:229) at org .apache .mina .statemachine .transition.AbstractTransition.execute(AbstractTransition.java:73) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 173) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 263) at org .apache.mina.statemachine.StateMachine.processEvents(StateMachine.java: 160) at org.apache.mina.statemachine.StateMachine.handle(StateMachine.java: 147) - locked <0x296300c0> (a org.apache.mina.statemachine.context.DefaultStateContext) at org.apache.mina.statemachine.StateMachineProxyBuilder $MethodInvocationHandler.invoke(StateMachineProxyBuilder.java:253)
        at $Proxy12.closeRequested(Unknown Source)
at org .neociclo .netty .statemachine .DefaultStateMachineChannelHandler .handleDownstream(DefaultStateMachineChannelHandler.java:117) at org .neociclo .netty .statemachine .ChannelAllCoverageWrapper .handleDownstream(ChannelAllCoverageWrapper.java:49) at org .jboss .netty .channel .DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:590) at org .jboss .netty .channel .DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:585)
        at org.jboss.netty.channel.Channels.close(Channels.java:1033)
at org.jboss.netty.channel.AbstractChannel.close(AbstractChannel.java: 185) at org .neociclo .isdn .netty .channel .IsdnClientChannelTest .testChannelConnectAndDisconnect(IsdnClientChannelTest.java:130)
        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:585)
        at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
at org .junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
        at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
at org .junit .internal .runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java: 77)
        at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
at org .junit .internal .runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88) at org .junit .internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java: 51) at org.junit.internal.runners.JUnit4ClassRunner $1.run(JUnit4ClassRunner.java:44) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java: 27) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) at org .junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) at org .eclipse .jdt .internal .junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org .eclipse .jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org .eclipse .jdt .internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java: 467) at org .eclipse .jdt .internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java: 683) at org .eclipse .jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java: 390) at org .eclipse .jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java: 197)

Found 1 deadlock.

Reply via email to