Absturz wegen cEvent::title == NULL - Warum???

  • Ich habe exemplarisch mal ein wenig in Live herumgestöbert und frage mich, ob zum Beispiel hier:

    ...

    … nicht auch noch ein LOCK_SCHEDULES_READ gebräucht würde.

    Die Funktion bekommt ja 'schedules' übergeben, welches nur über einen Lock erhalten werden konnte.

    Also nein.

    Heißt das, dass man keine Locks setzen muss, solange man den zugeordneten Pointer (Timers, Channels, Schedules, Recordings) im Code nicht benötigt?

    So ist es.

    Welche indirekte Abhängigkeiten gibt es diesbezüglich? Wie etwa die folgenden:

    Du musst nur die Listen locken, mit denen du arbeiten möchtest. Wenn du mit mehreren Listen gleichzeitig arbeiten möchtest, musst du sie alle locken, und zwar in genau der genannten Reihenfolge, da es sonst zu Verklemmungen kommen könnte, wenn mehrere Threads auf mehrere Listen warten, sie aber in unterschiedlicher Reihenfolge locken.

  • Auch wenn die meisten davon vermutlich eher unkritisch sind, sollte man sie bei dieser Gelegenheit wohl besser doch auf potentielle Race conditions bzw. Use-after-free-Szenarien überprüfen.

    Werde ich selber aus Zeitgründen nicht machen, bin aber natürlich für jeden Bug-Report dankbar.

  • Ich denke, hier wäre zusätzliche Dokumentation hilfreich.

    Ist generell ein lesender Zugriff auf ein cEvent nur dann erlaubt, wenn ein read lock auf schedules gehalten wird?

    Oder: Darf ich auf bestimmte Methoden eines cEvent zugreifen, ohne einen read lock auf schedules? Z.B. auf EventID()?

    Und brauche den read lock auf schedules nur beim Zugriff auf "kritische" Methoden, z.B. Title(), ShortText(), ...?

    ~ 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

  • MarkusE Sobald ein Pointer auf ein Objekt in einer dieser Listen dereferenziert wird, muss ein entsprechender Lock bestehen.

    Siehe auch tools.h:

  • Es gibt noch eine Stelle, an der ich mich nicht an meine eigene Vorgabe gehalten habe ;)

    Diff
    --- skinlcars.c 2024/09/21 10:53:07     5.7
    +++ skinlcars.c 2024/12/02 14:15:55
    @@ -1259,6 +1259,7 @@
          int NumDevices = 0;
          int y = ys04;
          // Timers and recording devices:
    +     LOCK_SCHEDULES_READ;
          while (1) {
                int NumTimers = 0;
                const cDevice *Device = NULL;
  • Sobald ein Pointer auf ein Objekt in einer dieser Listen dereferenziert wird, muss ein entsprechender Lock bestehen.

    Danke dir. Ich hatte so eine Antwort erwartet bzw. befürchtet. Da wird wohl in machen Plugins noch einiges zu berichtigten sein…

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Heißt das, dass man keine Locks setzen muss, solange man den zugeordneten Pointer (Timers, Channels, Schedules, Recordings) im Code nicht benötigt?

    So ist es.

    und

    Sobald ein Pointer auf ein Objekt in einer dieser Listen dereferenziert wird, muss ein entsprechender Lock bestehen.

    Ist für mich gerade irgendwie ein Wiederspruch.

    Beispiel:

    Code
    bool cEpgHandlerMarkad::HandleEvent(cEvent *Event) {
    ... irgendwelcher Code
        if (Event->RunningStatus() <= 0) return false;

    Brauche ich da einen LOCK_SCHEDULES_READ oder kann ich davon ausgehen, dass das Objekt für die Dauer des Aufrufes unverändert bleibt ?

    Ich nutze ja nicht die Liste, sondern nur ein einzelnes Objekt davon.

    VDR

    Server: Ubuntu 24.04 headless VDR im LXC Container, Plugins: satip (Octopus NET SL SX8), live, epgsearch, epg2vdr, markad

    Clients: LibreELEC auf RasPi3 und RasPi 3+

  • Ich nutze ja nicht die Liste, sondern nur ein einzelnes Objekt davon.

    … das sich zwischen den Zeilen 1 und 3 ja inzwischen schon wieder geändert haben oder gar gelöscht worden sein könnte. Insofern wäre mir der Lock einsichtiger, aber irgendwie bin ich jetzt noch mehr verwirrt.

    Für mich stellt sich die Situation bislang so dar: Wann auch immer man auf eine der Listen zugreift (sprich: einen der besagten Pointer benötigt) oder (später) eines seiner Objekte referenziert, braucht man Locks auf die ursprüngliche Liste sowie die Listen aller Objekte, die davon direkt oder indirekt verlinkt sind.

    Liege ich jetzt damit richtig, oder ist das noch immer nicht die ganze Wahrheit?

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • … das sich zwischen den Zeilen 1 und 3 ja inzwischen schon wieder geändert haben oder gar gelöscht worden sein könnte.

    Nein, kann es nicht, da:

    Wenn du ein Objekt übergeben bekommst, ist dessen Liste gelockt.

    VDR

    Server: Ubuntu 24.04 headless VDR im LXC Container, Plugins: satip (Octopus NET SL SX8), live, epgsearch, epg2vdr, markad

    Clients: LibreELEC auf RasPi3 und RasPi 3+

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!