[epg2vdr] Invalid lock sequence?

  • Hi,


    Vermutlich reden wir gerade aneinander vorbei.


    Es gibt verschiedene Möglichkeiten, deadlocks zu verhindern.

    Klaus hat sich entschieden, dass sich in VDR jeder thread an eine vorgegebene Reihenfolge halten muss.

    1. Wenn sich jeder thread an diese Reihenfolge hält, kann es keine deadlocks geben
    2. Wenn sich ein thread nicht an diese Reihenfolge hält, kann es deadlocks geben.
    3. VDR kann prüfen, ob sich die threads an diese Reihenfolge halten.
    4. Nur wenn VDR bei dieser Prüfung feststellt, dass sich ein thread nicht an diese Reihenfolge hält, gibt VDR den "invalid lock sequence report" aus.
    5. Wenn VDR den "invalid lock sequence report" ausgibt, hält sich mindestens ein thread nicht an die Reihenfolge. Damit kann es deadlocks geben (siehe Punkt 2).

    Die Praxis hat gezeigt, dass, wenn es deadlocks geben kann, es normalerweise auch deadlocks gibt. Je nach dem, wie häufig das passiert, restartet der User dann die Anwendung und kann damit leben. Sehr wenige User haben die Fähigkeit und die Zeit, in so einem Fall nach der Ursache zu suchen.

    Ob man das dann als einen Fehler empfindet, der behoben werden muss, oder einfach akzeptiert? Das darf jeder anders sehen.


    ~ Markus

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Komm da nicht raus...

    Da ich die Programmübersicht von epg2vdr eh nicht verwende und sonst ja nirgends die LOCK-Warnungen kommen, werde ich das erst mal lassen müssen...

  • Denke nicht, dass wir aneinander vorbei geredet haben.

    Die Praxis hat gezeigt, dass, wenn es deadlocks geben kann, es normalerweise auch deadlocks gibt.

    Normalerweise schon, aber in seltenen Fällen halt nicht. Darauf wollte ich hinweisen.

    Und Deadlocks sind für mich nicht akzeptabel, auch wenn's ein Hobbyprojekt ist. Da muss dann der jeweilige Entwickler ran.

  • Komm da nicht raus...

    Der angehängte Patch sollte das Problem lösen, ich habe es aber selbst nicht getestet.


    Außerdem gab es beim make einen Fehler. Du hattest da ein "int w = 0;" vergessen. das ist in dem Patch mit drin.


    Ansonsten kannst Du da im skinflatplus nicht viel machen, da das in dem Falle alles LOCKs von außerhalb sind.


    Grüße

    kamel5

  • Klasse! Vielen Dank, dass Du Zeit in ein fremdes Projekt investierst. :lovevdr


    Habe den Patch mal eingebaut. Leider erscheint nun die Anzeige für den freien Platz auf der Platte etwa zwei Sekunden verzögert.


    Ich verstehe auch nicht, warum TopBarEnableDiskUsage(); für die LOCK Warnungen schuld sein soll. In der Funktion gibt es doch gar keine LOCK-Makros. Di eFunktion wird auch noch ein paar mal in baserender.c aufgerufen.

  • Leider erscheint nun die Anzeige für den freien Platz auf der Platte etwa zwei Sekunden verzögert.

    Das kann schon passieren. Um das zu verstehen, müsste man analysieren, wie der Programmablauf in skinflatplus ist, und ob da nicht noch an anderer Stelle z.B. ein Flush gemacht wird. Konsequenterweise sollte es erst dann ein Flush geben, wenn alles abgearbeitet ist...


    Ich verstehe auch nicht, warum TopBarEnableDiskUsage(); für die LOCK Warnungen schuld sein soll. In der Funktion gibt es doch gar keine LOCK-Makros. Di eFunktion wird auch noch ein paar mal in baserender.c aufgerufen.

    Das liegt daran, das von epg2vdr bereits LOCKs in cFlatDisplayMenu::SetTitle() vorhanden sind und dann in TopBarEnableDiskUsage() die Funktion cVideoDiskUsage::HasChanged() vom VDR in videodir.c aufgerufen wird, und dort wird dann ein LOCK_RECORDINGS_READ gemacht.

    Das kannst Du nur beheben, wenn Du TopBarEnableDiskUsage() aus SetTitle() heraus nimmst und z.B. in Flush() unterbringst.


    Im Endeffekt müsste man sich mal epg2vdr ansehen und versuchen, die LOCKs etwas anders zu gestalten...


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Vielen Dank für die gute Erklärung!


    Kann man nicht einfach cVideoDiskUsage::HasChanged() und cVideoDiskUsage::UsedPercent() (Macht das auch einen LOCK?) auslagern? Die Werte könnte man Global speichern. Oder würde das zu häufigen unnötigen Aufrufen führen?

  • Kann man nicht einfach cVideoDiskUsage::HasChanged() und cVideoDiskUsage::UsedPercent() (Macht das auch einen LOCK?) auslagern?

    cVideoDiskUsage::UsedPercent() und auch die restlichen cVideoDiskUsage::* haben keinen LOCK.


    Ich habe gerade in meinem skinlcarsng noch mal nachgesehen. Du brauchst das cVideoDiskUsage::HasChanged() eigentlich gar nicht, da das direkt vom VDR gehändelt wird.

    Komentiere doch einfach mal die Zeile mit dem cVideoDiskUsage::HasChanged() aus, und schaue was dann passiert.

    Den Patch kannst Du dann wieder entfernen.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Du brauchst das cVideoDiskUsage::HasChanged() eigentlich gar nicht,

    OK, noch genauer:

    Das cVideoDiskUsage::HasChanged() wird nur gebraucht, wenn die abgefragten Werte ganz aktuell sein sollen.

    Du kannst das cVideoDiskUsage::HasChanged() auch in Flush() unterbringen, da die Werte eh nur alle 5s vom VDR aktualisiert werden, sollte das keine zusätzliche Last bedeuten.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Wenn man sich damit beschäftigt... ;)


    Wenn ich das richtig verstehe, wird im skinflafplus der freie Plattenplatz eh nur einmalig bei Aufruf von SetTitle() angezeigt, d.h. diese Anzeige wird auch nicht aktualisiert, solange SetTitle() nicht erneut aufgerufen wird.

    Da das dann eh nur eine ungefähre Anzeige ist, würde ich das cVideoDiskUsage::HasChanged() doch eher ganz weglassen, da das Unterbringen in Flush() keine wirkliche Verbesserung bedeutet.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Cool! Das probiere ich dann mal aus. Wenn der VDR das eh selber aktualisiert, kann das bestimmt weg ;) So genau braucht die Anzeige nicht sein. Selbst wenn mehrere Aufnahmen laufen sollten, ändert sich da nicht wirklich viel

  • Wenn ich die Zeile auskommentiere wird 100% frei angezeigt...


    Ich bau das jetzt mal im Flush ein...

  • Wenn ich die Zeile auskommentiere wird 100% frei angezeigt...

    OK, dann muss das der Skin doch mindestens einmalig aufrufen.

    Das in Flush() könnte aber auch zu spät sein...

    Wenn das in Flush() nichts bringt, kannst Du es auch in cFlatDisplayMenu::cFlatDisplayMenu() mit ans Ende einfügen, das sollte auch keine Problem machen.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Du hast natürlich recht. Im Flush() wurde erst mal 100% frei gezeigt. In cFlatDisplayMenu::cFlatDisplayMenu() scheint es gut aufgehoben zu sein ;)


    Vielen Dank für die Hilfe und die Vorschläge.

  • OK, sehr schön.


    Jetzt könnte man auch noch dafür sorgen, das diese Anzeige bei Änderungen aktualisiert wird.

    Dazu könntest Du in Flush() noch folgendes eintragen:

    Code
        if (cVideoDiskUsage::HasChanged(VideoDiskUsageState))
            TopBarEnableDiskUsage();

    Damit wird geprüft, ob es eine Änderung des freien Speicherplatzes gibt und nur dann wird auch die Anzeige aktualisiert.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Dazu könntest Du in Flush() noch folgendes eintragen:

    Code
        if (cVideoDiskUsage::HasChanged(VideoDiskUsageState))
            TopBarEnableDiskUsage();

    Damit wird geprüft, ob es eine Änderung des freien Speicherplatzes gibt und nur dann wird auch die Anzeige aktualisiert.

    Super! Das übernehme ich natürlich ;)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!