From 8cada4eb31be58a3fa3efa09afbf431b3b62ca08 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Sat, 29 Jul 2006 11:08:14 +0000 Subject: [PATCH 1/1] fix frequently segfaults --- lib/dvb/epgcache.cpp | 15 ++++++++++----- lib/dvb/epgcache.h | 4 +--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp index 4afe813b..6a00b6be 100644 --- a/lib/dvb/epgcache.cpp +++ b/lib/dvb/epgcache.cpp @@ -208,7 +208,6 @@ void eEPGCache::DVBChannelAdded(eDVBChannel *chan) void eEPGCache::DVBChannelRunning(iDVBChannel *chan) { - singleLock s(channel_map_lock); channelMapIterator it = m_knownChannels.find(chan); if ( it == m_knownChannels.end() ) @@ -294,17 +293,20 @@ void eEPGCache::DVBChannelStateChanged(iDVBChannel *chan) { eDebug("[eEPGCache] remove channel %p", chan); messages.send(Message(Message::leaveChannel, chan)); - while(!it->second->canDelete()) - usleep(1000); - delete it->second; + pthread_mutex_lock(&it->second->channel_active); + singleLock s(channel_map_lock); m_knownChannels.erase(it); + pthread_mutex_unlock(&it->second->channel_active); + delete it->second; + it->second=0; // -> gotMessage -> abortEPG break; } default: // ignore all other events return; } - it->second->prevChannelState = state; + if (it->second) + it->second->prevChannelState = state; } } } @@ -1007,6 +1009,7 @@ eEPGCache::channel_data::channel_data(eEPGCache *ml) #ifdef ENABLE_PRIVATE_EPG CONNECT(startPrivateTimer.timeout, eEPGCache::channel_data::startPrivateReader); #endif + pthread_mutex_init(&channel_active, 0); } bool eEPGCache::channel_data::finishEPG() @@ -1130,6 +1133,7 @@ void eEPGCache::channel_data::abortNonAvail() void eEPGCache::channel_data::startChannel() { + pthread_mutex_lock(&channel_active); updateMap::iterator It = cache->channelLastUpdated.find( channel->getChannelID() ); int update = ( It != cache->channelLastUpdated.end() ? ( UPDATE_INTERVAL - ( (eDVBLocalTimeHandler::getInstance()->nowTime()-It->second) * 1000 ) ) : ZAP_DELAY ); @@ -1189,6 +1193,7 @@ void eEPGCache::channel_data::abortEPG() if (m_PrivateConn) m_PrivateConn=0; #endif + pthread_mutex_unlock(&channel_active); } void eEPGCache::channel_data::readData( const __u8 *data) diff --git a/lib/dvb/epgcache.h b/lib/dvb/epgcache.h index af02ead6..c692bc22 100644 --- a/lib/dvb/epgcache.h +++ b/lib/dvb/epgcache.h @@ -152,6 +152,7 @@ class eEPGCache: public eMainloop, private eThread, public Object DECLARE_REF(eEPGCache) struct channel_data: public Object { + pthread_mutex_t channel_active; channel_data(eEPGCache*); eEPGCache *cache; eTimer abortTimer, zapTimer; @@ -171,9 +172,6 @@ class eEPGCache: public eMainloop, private eThread, public Object std::set<__u8> seenPrivateSections; void readPrivateData(const __u8 *data); void startPrivateReader(); - bool canDelete() { return !isRunning && !m_PrivateConn; } -#else - bool canDelete() { return !isRunning; } #endif #ifdef ENABLE_MHW_EPG std::vector m_channels; -- 2.30.2