2002 2003 2004 2005 2006 2007 2008 2009 <2010> 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 | Index | 2002 2003 2004 2005 2006 2007 2008 2009 <2010> 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 |
<== Date ==> | <== Thread ==> |
---|
Subject: | Fixed: Segfaults in 3.14 branch since merging ca-over-tcp |
From: | Ralph Lange <[email protected]> |
To: | Andrew Johnson <[email protected]> |
Cc: | EPICS Core Talk <[email protected]> |
Date: | Mon, 16 Aug 2010 12:03:10 -0400 |
Hi Andrew,it looks as I have found the reason for the segfaults, which I think is a bug in CAC.
In the cac::~cac() destructor, a private member "this->iiuExistenceCount" is used to determine if cac should wait for TCP threads to shutdown. While this counter gets correctly decreased in cac::destroyIIU(), it never gets increased or set (except initialized to 0 in the cpp constructor).
So cac::~cac() was never waiting for the TCP threads to shutdown, and happily kept tearing down the timer/mutex infrastructure. If the threads were not fast enough, they were hitting on destroyed semaphores when cancelling their watchdog timers - that was causing the exceptions and segfaults.
This one-line fix will take care of the problem: === modified file 'src/ca/cac.cpp' --- src/ca/cac.cpp 2010-04-15 21:06:16 +0000 +++ src/ca/cac.cpp 2010-08-16 15:24:13 +0000 @@ -287,6 +287,7 @@ // // shutdown all tcp circuits // + this->iiuExistenceCount = this->circuitList.count(); tsDLIter < tcpiiu > iter = this->circuitList.firstIter (); while ( iter.valid() ) { // this causes a clean shutdown to occur Maybe it actually takes care of several shutdown related issues... Yay! Ralph