From 14384e3f5aaf81897d1931a14afd11d855bd6140 Mon Sep 17 00:00:00 2001 From: ghost Date: Thu, 26 Feb 2009 19:52:00 +0100 Subject: [PATCH] more CI fixes (i.e. fix segfault on e2 shutdown) --- lib/dvb_ci/dvbci.cpp | 36 +++++++++++++++++++++++++----------- lib/dvb_ci/dvbci.h | 1 + 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lib/dvb_ci/dvbci.cpp b/lib/dvb_ci/dvbci.cpp index d088075c..0227c43c 100644 --- a/lib/dvb_ci/dvbci.cpp +++ b/lib/dvb_ci/dvbci.cpp @@ -18,7 +18,7 @@ #include -#undef CIDEBUG +//#define CIDEBUG 1 #ifdef CIDEBUG #define eDebugCI(x...) eDebug(x) @@ -268,23 +268,34 @@ void eDVBCIInterfaces::recheckPMTHandlers() eDVBCISlot *tmp = it->cislot; eDVBServicePMTHandler *pmthandler = it->pmthandler; eDVBServicePMTHandler::program p; + bool first_plugged_cis_exist = false; pmthandler->getServiceReference(ref); pmthandler->getService(service); eDebugCI("recheck %p %s", pmthandler, ref.toString().c_str()); + for (eSmartPtrList::iterator ci_it(m_slots.begin()); ci_it != m_slots.end(); ++ci_it) + if (ci_it->first_plugged && ci_it->getCAManager()) + { + eDebug("Slot %d first plugged", ci_it->getSlotID()); + ci_it->first_plugged = false; + first_plugged_cis_exist = true; + } // check if this pmt handler has already assigned CI(s) .. and this CI(s) are already running - while(tmp) - { - if (!tmp->running_services.empty()) - break; - tmp=tmp->linked_next; - } - if (tmp) // we dont like to change tsmux for running services + if (!first_plugged_cis_exist) { - eDebugCI("already assigned and running CI!\n"); - continue; + while(tmp) + { + if (!tmp->running_services.empty()) + break; + tmp=tmp->linked_next; + } + if (tmp) // we dont like to change tsmux for running services + { + eDebugCI("already assigned and running CI!\n"); + continue; + } } if (!pmthandler->getProgramInfo(p)) @@ -912,6 +923,7 @@ int eDVBCISlot::send(const unsigned char *data, size_t len) void eDVBCISlot::data(int what) { + eDebugCI("CISlot %d what %d\n", getSlotID(), what); if(what == eSocketNotifier::Priority) { if(state != stateRemoved) { state = stateRemoved; @@ -981,6 +993,7 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr) use_count = 0; linked_next = 0; user_mapped = false; + first_plugged = true; slotid = nr; @@ -992,7 +1005,7 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr) fd = ::open(filename, O_RDWR | O_NONBLOCK); - eDebug("CI Slot %d has fd %d", getSlotID(), fd); + eDebugCI("CI Slot %d has fd %d", getSlotID(), fd); state = stateInvalid; if (fd >= 0) @@ -1007,6 +1020,7 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr) eDVBCISlot::~eDVBCISlot() { + eDVBCISession::deleteSessions(this); } void eDVBCISlot::setAppManager( eDVBCIApplicationManagerSession *session ) diff --git a/lib/dvb_ci/dvbci.h b/lib/dvb_ci/dvbci.h index c06ae7e3..7164d25a 100644 --- a/lib/dvb_ci/dvbci.h +++ b/lib/dvb_ci/dvbci.h @@ -65,6 +65,7 @@ class eDVBCISlot: public iObject, public Object int current_tuner; bool user_mapped; void data(int); + bool first_plugged; public: enum {stateRemoved, stateInserted, stateInvalid, stateResetted}; eDVBCISlot(eMainloop *context, int nr); -- 2.30.2