Hallo.
Ich habe da ein Problem, wo ich nicht weiter komme.
Es geht um vdrmanager (Android) und das Löschen eines aktiven Timers.
Folgende Passage habe ich
Code
cauto_ptr<cTimer> timer(new cTimer);
if (!timer->Parse(param.c_str())) {
return Error("Error in timer settings");
}
dsyslog("[vdrmanager] timer %s parsed", *timer->ToDescr());
cTimer * t = Timers.GetTimer(timer.get());
if (!t) {
return Error("Timer not defined");
}
/**
* this should come lates as a command line parameter
*/
bool forceDelete = true;
if (t->Recording() && forceDelete == false) {
return Error("Timer is recording");
}
t->Skip();
cRecordControls::Process(time(NULL));
isyslog("deleting timer %s", *t->ToDescr());
Timers.Del(t);
Timers.SetModified();
dsyslog("[vdrmanager] timer %s deleted", *t->ToDescr());
Alles anzeigen
Das segfault passiert, nach
Vermutlich in Del Aufruf.
Code
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `/usr/bin/vdr-dbg --lirc=/var/run/lirc/lircd -v /srv/vdr/video.00 -c /var/lib/vd'.
Program terminated with signal 11, Segmentation fault.
#0 0x000000000054ec9d in cListObject::Index (this=0x18c34d0) at tools.c:1927
Die Stelle ab
Habe ich von menu.c (vdr) übernommen.
Die Stelle in menu.c sieht so aus
Code
eOSState cMenuTimers::Delete(void)
{
// Check if this timer is active:
cTimer *ti = CurrentTimer();
if (ti) {
if (Interface->Confirm(tr("Delete timer?"))) {
if (ti->Recording()) {
if (Interface->Confirm(tr("Timer still recording - really delete?"))) {
ti->Skip();
cRecordControls::Process(time(NULL));
}
else
return osContinue;
}
isyslog("deleting timer %s", *ti->ToDescr());
Timers.Del(ti);
cOsdMenu::Del(Current());
Timers.SetModified();
Display();
}
}
return osContinue;
}
Alles anzeigen
Wenn bei einem aktiven Timer, was gerade aufzeichnet der Code durchlaufen wird, gibt es einen Segfault in
tools.c, Zeile 1927
Code
int cListObject::Index(void) const
{
cListObject *p = prev;
int i = 0;
while (p) {
i++;
p = p->prev; //das ist die Zeile 1927
}
return i;
}
Alles anzeigen
Was ist da falsch? Kann jemand mir einen Tip geben?
Gruß,
Lado