Christian Mamen created AMQCPP-524:
--------------------------------------

             Summary: Experiencing deadlock while destroying 
activemq::core::ActiveMQConnection
                 Key: AMQCPP-524
                 URL: https://issues.apache.org/jira/browse/AMQCPP-524
             Project: ActiveMQ C++ Client
          Issue Type: Bug
          Components: Decaf
    Affects Versions: 3.8.1
         Environment: windows
            Reporter: Christian Mamen
            Assignee: Timothy Bish


The deadlock occurs while destroying an amq connection, a broker connection as 
been establish.

I added a break point inside before termination 
decaf::internal::util::concurrent::PlatformThread::interruptibleWaitOnCondition,
 and before the deadlock occurs i can see
the following threads:
{noformat} 
0               4396    Main Thread     PorterSvc       
decaf::internal::util::concurrent::Threading::join      Normal  0
0               8252    Worker Thread   Win32 Thread    776ef959        Normal  0
0               5280    Worker Thread   Win32 Thread    776f015d        Normal  0
0               8588    Worker Thread   _threadstartex  
CtiLocalConnect<CtiOutMessage,INMESS>::CtiLocalConnectRead      Normal  0
0               4916    Worker Thread   _threadstartex  _CrtDefaultAllocHook    
Normal  0
0       >       5532    Worker Thread   _threadstartex  
decaf::internal::util::concurrent::PlatformThread::interruptibleWaitOnCondition 
Normal  0
0               1956    Worker Thread   _threadstartex  std::_Lockit::~_Lockit  
Normal  0
0               5784    Worker Thread   Win32 Thread    CtrlHandler     Highest 0
0               4512    Worker Thread   Win32 Thread    776f1f46        Normal  0
0               7180    Worker Thread   Win32 Thread    776f1f46        Normal  0
0               1668    Worker Thread   Win32 Thread    776f1f46        Normal  0
{noformat} 

At this moment, the call stack for thread 5532 is the following:
{noformat} 
decaf::internal::util::concurrent::PlatformThread::interruptibleWaitOnCondition(void
 * condition=0x000007d8, _RTL_CRITICAL_SECTION * mutex=0x077dee10, __int64 
mills=7659, int nanos=0, decaf::internal::util::concurrent::CompletionCondition 
& complete={...})  Line 305 + 0xe bytes  C++
`anonymous 
namespace'::doWaitOnMonitor(decaf::internal::util::concurrent::MonitorHandle * 
monitor=0x0771acf8, decaf::internal::util::concurrent::ThreadHandle * 
thread=0x05f338a8, __int64 mills=7659, int nanos=0, bool interruptible=true)  
Line 752 + 0x23 bytes     C++
decaf::internal::util::concurrent::Threading::waitOnMonitor(decaf::internal::util::concurrent::MonitorHandle
 * monitor=0x0771acf8, __int64 mills=7659, int nanos=0)  Line 1558 + 0x1b bytes 
    C++
decaf::util::concurrent::Mutex::wait(__int64 millisecs=7659, int nanos=0)  Line 
180 + 0x1a bytes        C++
decaf::util::concurrent::Mutex::wait(__int64 millisecs=7659)  Line 162  C++
decaf::internal::util::concurrent::SynchronizableImpl::wait(__int64 
millisecs=7659)  Line 54    C++
decaf::util::TimerImpl::run()  Line 102 + 0x1f bytes    C++
`anonymous namespace'::runCallback(void * arg=0x05f338a8)  Line 266 + 0x11 
bytes        C++
`anonymous namespace'::threadEntryMethod(void * arg=0x05f338a8)  Line 254 + 
0x15 bytes  C++
{noformat} 

Afterwards, only the main thread is left and the deadlock occurs 
interruptibleWaitOnCondition at "PlatformThread::unlockMutex(mutex);"
{noformat} 
0       >       4396    Main Thread     PorterSvc       
decaf::internal::util::concurrent::PlatformThread::interruptibleWaitOnCondition 
Normal  0
{noformat} 

{noformat} 
decaf::internal::util::concurrent::PlatformThread::interruptibleWaitOnCondition(void
 * condition=0x001293d0, _RTL_CRITICAL_SECTION * mutex=0x1f13f1e8, __int64 
mills=600000, int nanos=0, 
decaf::internal::util::concurrent::CompletionCondition & complete={...})  Line 
305 + 0xe bytes        C++
decaf::internal::util::concurrent::Threading::join(decaf::internal::util::concurrent::ThreadHandle
 * thread=0x043eb370, __int64 mills=600000, int nanos=0)  Line 1168 + 0x23 
bytes      C++
decaf::lang::Thread::join(__int64 millisecs=600000)  Line 178 + 0x19 bytes      
C++
decaf::util::Timer::awaitTermination(__int64 timeout=10, const 
decaf::util::concurrent::TimeUnit & unit={...})  Line 236        C++
decaf::util::concurrent::ExecutorKernel::~ExecutorKernel()  Line 419    C++
decaf::util::concurrent::ExecutorKernel::`scalar deleting destructor'()  + 0xf 
bytes    C++
decaf::util::concurrent::ThreadPoolExecutor::~ThreadPoolExecutor()  Line 1481 + 
0x1f bytes      C++
decaf::util::concurrent::ThreadPoolExecutor::`vector deleting destructor'()  + 
0x4d bytes       C++
decaf::lang::Pointer<decaf::util::concurrent::ExecutorService,decaf::util::concurrent::atomic::AtomicRefCounter>::onDeleteFunc(decaf::util::concurrent::ExecutorService
 * value=0x1f13b7f8)  Line 317 + 0x20 bytes      C++
decaf::lang::Pointer<decaf::util::concurrent::ExecutorService,decaf::util::concurrent::atomic::AtomicRefCounter>::~Pointer<decaf::util::concurrent::ExecutorService,decaf::util::concurrent::atomic::AtomicRefCounter>()
  Line 148 + 0xf bytes  C++
activemq::core::ConnectionConfig::~ConnectionConfig()  Line 303 + 0x1ba bytes   
C++
activemq::core::ConnectionConfig::`scalar deleting destructor'()  + 0xf bytes   
C++
activemq::core::ActiveMQConnection::~ActiveMQConnection()  Line 501 + 0x1f 
bytes        C++
activemq::core::ActiveMQConnection::`vbase destructor'()  + 0xf bytes   C++
activemq::core::ActiveMQConnection::`vector deleting destructor'()  + 0x4d 
bytes        C++
{noformat} 

If i look into the ThreadHandle object, i can see the threadId  5532 and state 
== 4 (Thread::TIMED_WAITING), however the thread at this point is not running
{noformat} 
-               thread  0x06054520 {parent=0x060543c0 handle=0x000007bc 
mutex=0x062ad498 ...}   decaf::internal::util::concurrent::ThreadHandle *
+               parent  0x060543c0 {heap={...} cancelled=true } 
decaf::lang::Thread *
                handle  0x000007bc      void *
+               mutex   0x062ad498 {DebugInfo=0x00373658 LockCount=-2 
RecursionCount=1 ...}     _RTL_CRITICAL_SECTION *
                condition       0x000007b8      void *
                state   4       volatile int
                references      2       volatile int
                priority        5       int
                interrupted     false   bool
                interruptible   true    bool
                timerSet        true    bool
                canceled        false   bool
                unparked        false   bool
                parked  false   bool
                sleeping        false   bool
                waiting false   bool
                notified        true    bool
                blocked true    bool
                suspended       false   bool
+               name    0x062ad580 "Thread-2"   char *
                stackSize       32768   __int64
+               tls     0x06054558      void * [384]
                threadMain      0x00ecbf7c `anonymous 
namespace'::runCallback(void *)   void (void *)*
                threadArg       0x06054520      void *
                threadId        5532    __int64
                osThread        false   bool
+               interruptingThread      0x00000000 {parent=??? handle=??? 
mutex=??? ...}        decaf::internal::util::concurrent::ThreadHandle *
                numAttached     0       int
+               next    0x00000000 {parent=??? handle=??? mutex=??? ...}        
decaf::internal::util::concurrent::ThreadHandle *
+               joiners 0x060e65c0 {parent=0x077a1d90 handle=0xfffffffe 
mutex=0x05fcf318 ...}   decaf::internal::util::concurrent::ThreadHandle *
+               monitor 0x052e47e8 {name=0xcdcdcdcd <Bad Ptr> mutex=0x06bfed80 
lock=0x06bff148 ...}     decaf::internal::util::concurrent::MonitorHandle *
{noformat} 

I'm not sure if this is a race condition or if the flags are not updated 
properly.








--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to