vdr-plugin-dynamite: bug fix

  • Hallo,


    In https://github.com/MarkusEh/vd…amite/tree/markus/patches ist vdr-2.6.3-dynamite.patch .

    In diesem Patch ist ein Fehler korrigiert, der (vermutlich) in allen anderen Versionen des Patches ist.

    Zum Update:

    • Den alten Patch entfernen, und mit vdr-2.6.3-dynamite.patch patchen. Dieser Patch sollte im Prinzip auch für vdr 2.4.x funktionieren.
    • Wer vorher vdr-2.4.6-dynamite.diff hatte, braucht die Plugins nach dem upgrade auf vdr-2.6.3-dynamite.patch nicht neu zu übersetzen, da sich das VDR Interface dadurch nicht ändert.


    Zum Fehler:

    Warum ein so alter Fehler bisher nicht gefunden wurde?

    Da kann ich nur spekulieren. Vermutlich, weil er nur selten auftritt. Und weil bei "video data stream broken" erstmal niemand den Fehler im dynamite Patch sucht.


    ~ 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

    • Offizieller Beitrag

    Rein aus Interesse: Magst du mir beschreiben, was du im Patch geändert hast?

  • Alt (also mit dem "alten" Patch):

    Code
    void cDevice::DetachAllReceivers(void)                                                                                  {                                                                                                                                                                                         cMutexLock MutexLock(&mutexReceiver);                                                                                   for (int i = 0; i < MAXRECEIVERS; i++)
          Detach(receiver[i], false);
      ReleaseCamSlot();
    }


    Neu (also mit dem korrigierten Patch)


    Code
    void cDevice::DetachAllReceivers(void)                                                                                  {                                                                                                                         if (parentDevice)                                                                                                         return parentDevice->cDevice::DetachAllReceivers();                                                                   cMutexLock MutexLock(&mutexReceiver);                                                                                   for (int i = 0; i < MAXRECEIVERS; i++)
          Detach(receiver[i], false);
      ReleaseCamSlot();
    }

    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

  • Hi,

    Hmm für mich sehen beide Einträge gleich aus.

    MfG Stefan

    Test-VDR1: HP rp5700 Fertigsystem, Core2Duo E6400, 2GB RAM, FF-SD C-2300, nvidia Slim-GT218 x1 | easyVDR 2.0 64Bit
    VDR3: in Rente

    VDR4: MSI G31M2 v2, Digitainer2-Geh., t6963c 6" gLCD, E5200, 2GB, 3TB WD Red, GT730, 2x TT S2-3200; easyVDR 3.5 64bit
    VDR5: Gigabyte
    GA-G31M-S2L, Intel E2140, Zotac GT730 passiv, Digitainer2-Geh., t6963c 6 " gLCD, 2 TB WD Red, 2x TT S2-3200 (an 1 Kabel) easyVDR 3.5 64bit
    VDR6:
    Intel E5200, GT630 passiv, F1 750 GB, t6963c gLCD, 2x TT S2-3200 | easyVDR 3.5 64bit
    VDR-User #1068
    www.easy-vdr.de

  • Code
    if (parentDevice)                                                                                                         return parentDevice->cDevice::DetachAllReceivers();   

    hat gefehlt.

    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

  • Wer es testen / ausprobieren möchte:

    1. Aufzeichnung auf sat1 starten, prio 50
    2. Aufzeichnung auf tele5 starten, prio 51
    3. Aufzeichnung auf ARD starten, prio 52
    4. ...

    Weitermachen, bis kein Empfänger mehr frei ist. Also wer 2 Empfänger hat, startet 3 Aufzeichnungen.


    Korrektes Verhalten:

    VDR beendet ("stopped") die Aufzeichnung auf sat1.


    Fehlerhaftes Verhalten:

    VDR beendet ("stopped") die Aufzeichnung auf sat1 nicht, schaltet aber den Empfänger auf ARD. -> "video data stream broken"

    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

  • Aus reiner Neugierde:

    Der Fehler kam mit vdr-1.7.39-dynamite.patch .

    In älteren Versionen des Patches (vdr-1.7.37-dynamite.patch und älter) war der noch nicht drin.

    Da stand noch

    Code
    +  if (parentDevice)
    +     return parentDevice->DetachAllReceivers();

    . Das funktioniert aber mit der aktuellen Version des Plugins nicht mehr.

    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

    • Offizieller Beitrag

    Vielleicht hatte es einen Grund, dass das raus fiel, vielleicht war es aber auch einfach ein Fehler...

  • Hi,


    > Vielleicht hatte es einen Grund, dass das raus fiel, vielleicht war es aber auch einfach ein Fehler...

    Kurzfassung:

    Ja, es gab einen Grund. Dieser ist mit vdr-2.6.3-dynamite.patch beseitigt :)


    Für die Entwickler:

    In neueren Versionen des dynamite plugins:

    Code
    void cDynamicDevice::DetachAllReceivers(void)                                                                                                 
    {                                                                                                                                             
      if (subDevice)                                                                                                                              
         return subDevice->DetachAllReceivers();                                                                                                  
      cDevice::DetachAllReceivers();                                                                                                              
    }  


    Mit vdr-1.7.37-dynamite.patch:

    Code
    void cDevice::DetachAllReceivers(void)
    {
      if (parentDevice)
        return parentDevice->DetachAllReceivers();
    ...
    }

    Führt das zu einem "endlosen" gegenseitigen Aufruf. Bis der Stack voll ist, und der Kernel VDR beendet.

    Das Entfernen von "if (parentDevice) DetachAllReceivers();" in "cDevice::DetachAllReceivers" verhindert zwar den "endlosen" gegenseitigen Aufruf :) . Führt aber dazu, dass die Receiver nicht mehr gelöscht werden :( . Mit den oben beschriebenen Folgen.

    Deshalb steht in vdr-2.6.3-dynamite.patch auch:

    Code
    void cDevice::DetachAllReceivers(void)
    {
      if (parentDevice)
        return parentDevice->cDevice::DetachAllReceivers();
    ...
    }

    Damit wird der "endlose" gegenseitige Aufruf verhindert, und alle Receiver werden gelöscht :) .



    ~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

  • Ich habe den Patch mal in https://launchpad.net/~seahawk…archive/ubuntu/vdr-2.6.4/ eingebaut.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

Jetzt mitmachen!

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