aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb_ci
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2009-02-26 19:52:00 +0100
committerghost <andreas.monzner@multimedia-labs.de>2009-02-26 19:52:00 +0100
commit14384e3f5aaf81897d1931a14afd11d855bd6140 (patch)
treed0f1f3304c63d359c708afbaadc76dddc9a4e1f1 /lib/dvb_ci
parentdb3985b36a8e42c4c9d560bc4efaa4ef75d48c56 (diff)
downloadenigma2-14384e3f5aaf81897d1931a14afd11d855bd6140.tar.gz
enigma2-14384e3f5aaf81897d1931a14afd11d855bd6140.zip
more CI fixes (i.e. fix segfault on e2 shutdown)
Diffstat (limited to 'lib/dvb_ci')
-rw-r--r--lib/dvb_ci/dvbci.cpp36
-rw-r--r--lib/dvb_ci/dvbci.h1
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 <dvbsi++/ca_program_map_section.h>
-#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<eDVBCISlot>::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);