Beiträge von wirbel

    M-Reimer - danke! Sehe ich ganz genau so, ich hatte das schon gar nicht mehr auf dem Schirm.

    Dieser Patch von MarkusE+SHF sollte auf jeden Fall in die nächste VDR Version.


    Habe ich in mein temporäres git aufgenommen.

    Um so mehr hat RHS mit seinem Kommentar/Nachfrage recht..

    Hallo RHS,


    ja, das macht definitiv Sinn, Klarheit über die Teststände ist essentiell.

    Aber ohne deine intensiven Tests gäbe es keinen Fortschritt bei vnsi, danke dafür.

    Ich packe das mal in zwei temporäre github repos auf meinem Account, das macht es leichter für dich.


    ------------------------------------------------------------------------------------

    für vnsiserver bitte das hier verwenden:

    GitHub - wirbel-at-vdr-portal/vdr-plugin-vnsiserver-crashes: VDR plugin to handle XBMC clients.
    VDR plugin to handle XBMC clients. Contribute to wirbel-at-vdr-portal/vdr-plugin-vnsiserver-crashes development by creating an account on GitHub.
    github.com

    git clone https://github.com/wirbel-at-v…in-vnsiserver-crashes.git


    identisch zu:

    Commits · vdr-projects/vdr-plugin-vnsiserver
    VDR plugin to handle XBMC clients. Contribute to vdr-projects/vdr-plugin-vnsiserver development by creating an account on GitHub.
    github.com

    + processChannels_GetChannels_StateKey.diff

    -----------------------------------------------------------------------------------


    -----------------------------------------------------------------------------------

    für VDR bitte das hier verwenden:

    GitHub - wirbel-at-vdr-portal/vdr-cChannel-Name: temporary git repo for debugging cChannel::Name()
    temporary git repo for debugging cChannel::Name(). Contribute to wirbel-at-vdr-portal/vdr-cChannel-Name development by creating an account on GitHub.
    github.com

    git clone https://github.com/wirbel-at-v…tal/vdr-cChannel-Name.git


    identisch zu:

    vdr-2.6.6 (ohne Patches)

    + changes in cChannels.c for cChannel::Name() (wirbel + kls)

    -----------------------------------------------------------------------------------


    Du kannst aus beiden repos auch einfach die letzten commits als Patche downloaden..

    Gut wäre diese Zeile in vdr/channels.c:56ff noch hinzuzufügen.

    Ansonsten hat die Variable u.U. einen beliebigen Startwert.


    Egal ob mit oder ohne den Patch, die einfache Abfrage von cChannel::Name() ändert in jedem Fall cChannel::nameSource und ist damit immer ein Schreibzugriff.

    Und noch schlimmer - das bei jedem Zugriff auf cChannel::Name(), da die if Bedingung


    Code
    if (isempty(nameSource) || nameSourceMode != Setup.ShowChannelNamesWithSource) {

    niemals falsch ergeben kann. nameSourceMode wird immer '0' bleiben und Setup.ShowChannelNamesWithSource bleibt immer bei dem was der Nutzer einstellt, also hier '2'.



    Es fehlt also in jedem Fall ein Lock oder ähnliches. Aber dafür müsste nur cChannel gelockt werden, nicht die ganze Kanalliste.

    Wenn es satip ist, dann müsste die sources.conf editiert worden sein, um die Auswahl des Satelliten festzulegen. Wäre also auch mal interessant, die Datei zu sehen.



    Aber da wir immer über cChannel::Name stolpern:




    Was ich auch nicht so ganz verstehe, ist die Bedeutung der Variable nameSourceMode in vdr/channels.c.

    Diese Variable wird niemals initialisiert im Konstruktor, aber wird direkt in cChannel::Name verwendet. Ich hätte im Konstruktor erwartet

    Code
    nameSourceMode = Setup.ShowChannelNamesWithSource;


    Wenn nameSourceMode zugewiesen wird, wird immer der gleiche Wert '0' zugewiesen.

    Diese Variable ist also entweder uninitiatlisiert, oder gleich '0'. Kein anderer Wert.


    Ich hätte ja auch erwartet, dass diese Variable dann nach diesem Vergleich in channels.c:110 neu gesetzt wird:

    Code
         if (isempty(nameSource) || nameSourceMode != Setup.ShowChannelNamesWithSource) {
    ++      nameSourceMode = Setup.ShowChannelNamesWithSource;
            if (Setup.ShowChannelNamesWithSource == 1)
               nameSource = cString::sprintf("%s (%c)", name, cSource::ToChar(source));
            else
               nameSource = cString::sprintf("%s (%s)", name, *cSource::ToString(source));
            }


    Auch in cChannel::operator= wird der variable 0 zugewiesen, anstelle vom rhs Channel.nameSourceMode


    In cChannel::SetTransponderData wird dann nameSourceMode auf 0 gesetzt (warum nicht Setup.ShowChannelNamesWithSource?), wenn

    Code
    if (source != Source || frequency != Frequency || srate != Srate || strcmp(parameters, Parameters)) {

    Dabei lohnt sich das nur, wenn source != Source.. Jede einzelne Änderung an den Transponderdaten bewirkt Neuzweisung von nameSource, obwohl das gar nicht nötig wäre.


    Hat jemand ne Idee?

    Vielleicht wäre es hier sinnvoller, std::swap zu verwenden, dann ist der Pointer in der queue definitiv leer und kann ohne Nebenwirkungen weg.


    So etwas wie (ungetestet..)


    Ich glaube, so wäre korrekter

    Mir fällt gerade auf, dass diese Zeilen in vdr selbst nicht ok sind.


    sources.c:55


    Wenn snprintf hier einen Fehler hat, dann wird snprintf einen negativen return code geben.

    Dokumentation: "If an encoding error occurs, a negative number is returned."


    Danach würde u.U. die nächste Zeile an eine falsche Stelle im Speicher schreiben:

    Code
    *q++ = (n < 0) ? 'W' : 'E';

    Kann mal bitte jemand auflisten welche Patches aktuell sind? Dann würde ich die gegen Abend in einem neuen Branch mal einbauen.

    Ich denke


    #83 vnsiserver-gcc12.diff.txt


    und


    #115 responsepacket_realloc_3.diff.txt


    Sollten jetzt schon einmal in dein repo. Aber bitte erst taggen, wenn mehr user input kommt.

    Wenn du das buffern ausschaltest, dann wird bei jedem bisschen mehr CPU last oder kurzem Netzwerk Traffic Problem das Bild stottern.


    Zumindest war das damals beim analogtv Plugin und dessen Nachfolger pvrinput Plugin das große Problem.