Hi,
Ist das folgende Problem bekannt bzw. gibt es schon eine Lösung?
Ab und an stürzt der VDR beim wiedergeben der Aufnahmen ab, da diese recht selten passiert (ca. 1-2x/Woche) konnte ich es noch nicht mit und ohne BigPatch testen. Diesen Crash gibt es nun schon seit einigen Versionen, da es recht selten auftritt habe ich es bislang nicht weiter verfolgt und kann auch nicht sagen seit welcher Version es existiert.
Ich habe den Backtrace bereits in der ML gepostet und dort den Hinweis erhalten, dass es recht sicher nicht vom VDR sondern von einem der Patches kommt, da der plain VDR cMarks::Get() nicht aus cDvbPlayer::Action() aufruft.
Der Backtrace aus dem core:
> #0 Get__6cMarksi (this=0x8621f10, Position=8780) at recording.c:1429
> 1429 if (mi->position == Position)
> (gdb) bt
> #0 Get__6cMarksi (this=0x8621f10, Position=8780) at recording.c:1429
> #1 0x080a3546 in Action__10cDvbPlayer (this=0x87a77b8) at dvbplayer.c:692
> #2 0x080ff884 in StartThread__7cThreadP7cThread (Thread=0x87a77c4) at
> thread.c:244
> #3 0xb7ee30ba in pthread_start_thread () from /lib/libpthread.so.0
in Zeile 1429 zeigt mi in den Wald => crash
Da fällt mir erst zunächst der Jump-Play Patch ein, der macht genau das:
+ if (Setup.PlayJump && marks) {
+ // check for end mark - jump to next start mark
+ cMark *m = marks->Get(readIndex);
+ if (m && (m->Index() & 0x01) != 0) {
+ m = marks->Next(m);
+ int Index;
+ if (m)
+ Index = m->position;
+ else if (total == index->Last())
Da hier vorher 'Setup.PlayJump' abgefragt wird sollte das deaktivieren im Setup zum eingrenzen genügen. Ich schalte das nun einmal ab und berichte ob es dann auch auftritt. Kann aber etwas dauern, da ich ab Mi. im Urlaub bin
Vieleicht solllte ich noch erwähnen, dass es nicht an einer Marke crashed sondern mitten im Film!
Auch wenn durch den Get() Aufruf durch das JumpPlay Pacht ausgelöst wird, sollte der VDR in der for Schleife in Get() doch keinen ungültigen mi Pointer liefern, oder?
cMark *cMarks::Get(int Position)
{
for (cMark *mi = First(); mi; mi = Next(mi)) {
if (mi->position == Position)
return mi;
}
return NULL;
}
- EDIT -
Nur so eine Idee, basteln hier möglicherweise zwei Threads gleichzeitig an marks, der eine löscht eine und der andere iteriert gerade in cMarks::Get() durch die Liste (oder so was ähnliches) !? Dann wüde Mutex helfen. (Sind aber ältere Aufnahmen, soll heißen noadd ist bei den Abstürzen nicht gleichzeitig daran am arbeiten)
Grüße Horchi