[
https://issues.apache.org/jira/browse/AMQCPP-524?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13814520#comment-13814520
]
Timothy Bish commented on AMQCPP-524:
-------------------------------------
Would need a reproducible test case. There are some fixes on the 3.8.x branch
if you want to try that out also.
> 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)