softhddevice bug ( X Speicherzugriff auf VDR )

  • Hallo alle zusammen,


    ich habe in meinem VDR 2.1.6 das softhddevice in der Version: softhddevice (0.6.1rc1-GITa3c0052) installiert.


    Hiermit ergibt sich folgendes Fehlerbild.


    Es werden von VDR keine Tuningbefehle an meine Sundtek Tuner übermittelt. Dementsprechend ist ein umschalten der Kanäle nicht möglich.


    Das ganze macht im Logfile mit folgendem Eintrag auf sich aufmerksam:


    ERROR: set frontend/here 0/0: Unpassender IOCTL (I/O-Control) für das Gerät


    Ich habe mich mit diesem Problem an den Sundtek Support gewendet und bin hier hervorragend unterstützt worden.


    Der Fehler liegt hier:


    http://projects.vdr-developer.…it/tree/softhddev.c#n3095


    Das ist der Übeltäter
    Mit vfork öffnet das softhddevice einen 2. Prozess
    Wenn jetzt im 2. Prozess das Frontend geschlossen wird, wird es auch für den ursprünglichen Prozess geschlossen
    Weil diese sich ja den gleichen Speicherbereich teilen.
    Mit fork() (nicht vfork()) werden die Speicherbereiche kopiert und da hat der 2. Prozess dann keinen zugriff mehr auf den 1. (also VDR), so sollte das auch sein.


    In dieser besagten Zeile sollte anstelle von vfork, nur fork stehen. Dann funktionert das Softhddevice wie zu erwarten.


    Ich hoffe ich habe mich verständlich ausgedrückt.


    Viele Grüße
    Kai

  • Richtiger und besserer Stil wäre es gewesen das im zugehörigen Bugtracker zu melden: http://projects.vdr-developer.…s/plg-softhddevice/issues


    Oder per PN an den Autor ...


    Regards
    fnu

    HowTo: APT pinning

  • Es tut mir leid wenn ich jemandem auf die Füsse getreten bin. Ich bin ich solchen Dingen nicht sehr Firm. Mir war so als sei ich an der richtigen Stelle.
    Aber ich werde mir deinen Hinweis zu Herzen nehmen und für diesen und zukünftige Fälle befolgen.

  • Naja, Du hast ja eine sehr konkrete Vermutung, die tütet man dann auch direkt entsprechend ein.


    Wie dann die Fehlerbehebung auch immer am Ende aussieht, ich vermute "johns" hatte Grund hier "vfork" zu nutzen, bisher hat diesen Umstand wohl noch niemand sonst gemeldet.


    Wenn Du noch nicht gewusst hättest wo das Probleme liegt und Diskussionspartner dazu gesucht hättest, wäre das schon hier richtig gewesen.


    Regards
    fnu

    HowTo: APT pinning

  • Im Prinzip ist es egal wo der Fehler gemeldet wird, im vdr-developer geht er halt nicht unter.


    Wobei ich das ganze Problem noch nicht verstehe. Laut man-page soll man vfork verwenden, wenn
    man exec macht.


    Das hier:

    Code
    // close all open file-handles
        maxfd = sysconf(_SC_OPEN_MAX);
        for (fd = 3; fd < maxfd; fd++) {    // keep stdin, stdout, stderr
            close(fd);                      // vdr should open with O_CLOEXEC
        }


    schliesst alle Filehandle. Dies ist zusätzlich dazugekommen und war in meiner ursprünglichen Version nicht.
    Dies gefällt mir nicht und ist die Holzhammermethode.


    Trotzdem close ist ein Systemcall und greift auf keinen Speicher zu.
    Kann es sein das Sundtek den Systemcall "close" umlenkt?


    Ich empfehle X selber zustarten und nicht über das Plugin.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Wir haben ja Applikationsbasierte Treiber, open/close wird beim Frontend umgelenkt, und dort wird ein "Accounting" für die Zugriffe gemacht.
    Das Accounting wird natürlich im Speicher abgelegt. Nun teilen sich beide Prozesse mit vfork() den Speicher (wie bei Threads). Demnach schliesst der 2. Prozess dann in diesem Fall das Frontend für den ersten Prozess.
    Dennoch um Problemen aus dem Weg zu gehen würde ich im Allgemeinen eher fork() verwenden, wer weiss ob es da nicht nach einiger Zeit eine Änderung gibt und das jemand wieder vergisst.
    Die Performanceunterschiede sind für einen Menschen an der Stelle auch nicht nachvollziehbar, wohl eher im Nanosekundenbereich.

  • Dann wird die Sache klarer.


    open und close umändern ist zwar nicht sauber und schlecht für die Performance.
    Aber dies ist nicht meine Baustelle.


    Ich werde demnächst den "vfork" in "fork" abändern.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Die open/close Performance ist ziemlich nebensächlich, alles was im Nanosekundenbereich liegt ist vernachlässigbar, selbst auf den langsamsten embedded Krücken ist das nicht spürbar, ausserdem ist das ohnehin nur bei Frontend/DVR Zugriffen anders.
    Dafür werden die Daten bei uns zwischen Treiber und Applikation mit Shared Memory Segmenten übertragen was dann wieder einiges an Kopiererei spart.
    Danke das du das trotzdem abänderst :)

Jetzt mitmachen!

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