handle deprecated functions? (readdir_r, auto_ptr)

  • Hallo,


    das Problem wird wohl bei dem ein oder anderen VDR Projekt auftauchen, da "readdir_r" ab glibc 2.24 von 2016 als deprecated markiert wurde.


    - https://lwn.net/Articles/696474/
    - https://linux.die.net/man/3/readdir_r


    So weit so gut, habe ich das nach lesen verschiedener Quellen in text2skin korrigiert:


    Nun kam die Frage auf wie weit zurück gibt es damit kein Problem?


    Nach meinem Verständnis galt "readdir_r" als "thread safe" und "readdir" nicht, wobei das wohl eine zu einfache Erklärung war. "readdir" war scheinbar keine "reentrant function" und damit mittelbar per Definition nicht "thread safe".


    Lt. dieser Diskussion von 2011:


    - https://stackoverflow.com/ques…-the-static-allocated-res


    wurde der Missstand schon vor langer Zeit behoben, Posix 2008, daher habe ich für mich mitgenommen, kein Problem, auch wenn die verwendete glibc etwas älter ist.


    Was meinen die C/C++ Profis dazu?


    Gruß
    Frank

    HowTo: APT pinning

    2 Mal editiert, zuletzt von fnu ()

  • Ich habe bei osd2web vor dem selben Problem gestanden. Ja verstehe es auch so dass readdir in den neueren glibc Versionen reentrant ist. Ich weiß nicht zu 199% ob ich es richtig getroffen habe aber schau mal nach den ifdefs drum rum in osd2web


    Grüße Jörg

  • Ja verstehe es auch so dass readdir in den neueren glibc Versionen reentrant ist.

    Ich verstehe/interpretiere das anders, "readdir ist schon lange reentrant" und jetzt wo es gesichert und getestet ist/wurde, wird "readdir_r" als DEPRECATED markiert ... ?(


    Meine Änderungen laufen auch nach ausgiebigen Tests unter Ubuntu Xenial, also "älterer" glibc perfekt. Bemängelt wird das aber eh erst ab Ubuntu Zesty und höher ...


    Gruß
    Frank

    HowTo: APT pinning

    Einmal editiert, zuletzt von fnu ()

  • Okay oder schon länger das hatte ich nicht beleuchtet

  • Na, mal hören was es noch für Meinungen, Aussagen oder Interpretationen gibt ... ^^

    HowTo: APT pinning

  • So wie ich das verstehe, kann es eigentlich nur dann ein Problem geben, wenn verschiedene Threads gleichzeitig das gleiche Verzeichnis auslesen. Ich vermute mal, der Skin-Loader im Plugin wird nur einmal gestartet und nicht mehrmals/parallel? Dann sollte es kein Problem geben.


    Lars

  • Ja, evtl. hast Du Recht ... aber das Problem mit "readdir" soll ja gewesen sein, das es nicht re-entrant gewesen "war". Da geht es gar nicht um mehrfach Zugriffe.


    Sondern darum, das die Routine vor Beendigung seiner Aufgaben abgebrochen wird, wurde, könnte und dann erneut ohne weiteren Impakt erneut aufgerufen werden kann. Routinen, die das nicht beherrschen gelten dann dadurch als nicht "thread safe" so mein Verständnis des Geschriebenen.


    "readdir_r" galt als re-entrant und somit "thread safe" und wird ab glibc 2.24 als DEPRECATED markiert, heißt "readdir" ist gut für alles. Aber ist das eine Aufräumarbeit oder eine harter Schnitt ... ?


    Diese gibt die Warnung ja auch beim VDR selbst:


    Regards
    fnu

    HowTo: APT pinning

  • re-entrant heißt, dass es mehrmals gleichzeitig auch vom gleichen Thread aufgerufen werden kann. Das konnte es früher nicht, weil sich durch erneutes aufrufen der Funktion der (eine) Buffer, der für die Rückgabe benutzt wird, wiederverwendet wurde. Wenn man also die Funktion nur einmal aufruft, die Daten aus der Rückgabe in eigene Buffer/Strings kopiert und sie dann wieder aufruft, ist alles ok.


    Gegenbeispiel wären z.B. verschachtelte Schleifen, ggf. rekursiv, die ein Verzeichnis inkl. Unterverzeichnisse durchlaufen und den Buffer nicht vor dem Aufruf entsprechend kopieren.


    Re-entrant und threadsafe sind nicht das gleiche, aber sehr ähnlich. Auch wenn eine Funktion threadsafe ist, muss sie nicht gleich re-entrant sein.


    Lars

  • Bei readdir_r hat man den Buffer für die Rückgabe selbst erstellt und an die Funktion gegeben, deshalb ist sie sowohl re-entrant als auch threadsafe.


    Lars

  • Auch wenn eine Funktion threadsafe ist, muss sie nicht gleich re-entrant sein.

    Ja, das meinte ich mit "die Erklärung ist nicht thread safe scheint wohl zu einfach" ...


    Aber wie damit umgehen, umschiffen mit ifdefs, wenn überhaupt möglich, einfach umsetzen in der Hoffnung keiner hat eine so alte glibc mehr im Einsatz ... ?


    Oben hatte ich eine Diskussion von 2011 zu dem Thema verlinkt, wo schon angemerkt wurde, das wäre damals schon kein Problem mehr.


    Regards
    fnu

    HowTo: APT pinning

  • Bei readdir_r hat man den Buffer ...

    Aber das macht man doch bei readdir auch, oder?

    HowTo: APT pinning

    Einmal editiert, zuletzt von fnu ()

  • readdir gibt einen Pointer auf einen Buffer zurück, über den man keine Kontrolle hat. Deshalb sollte man die Daten, die einen interessieren, vor dem nächsten Aufruf kopieren. Wird bei dem Code ja gemacht.


    Ich würde keine ifdefs machen, man muss nicht zu allem und jeden kompatibel sein. Ein Hinweis im readme auf Mindestversionen sollte reichen.


    Und vermutlich wird dieser spezielle Code auch mit älteren glibc kein Problem haben, weil er weder re-entrant noch threadsafe benötigt. Um sicher zu gehen, müsstest du schauen, ob dieser Thread überhaupt mehrfach gestartet wird. Wenn nicht, ist alles gut.


    Lars

  • Ein Hinweis im readme auf Mindestversionen sollte reichen.

    Genau um den Punkt geht es mir hier eigentlich, welche Version/Zeitpunkt wäre das ... ?


    glibc 2.24 läuft so langsam in die verschiedenen Linux Distros, "readdir_r" ist darin als DEPRECATED markiert. "readdir" ist meiner Lesart nach schon länger in der Lage "readdir_r" sicher zu ersetzen ... aber ich bin da sicher nicht relevant.


    Hat jemand dazu Erkenntnisse?


    Gruß
    Frank

    HowTo: APT pinning

  • Scheinbar ist "auto_ptr" auch deprecated, aus dem vdr-plugin-live Buildlog mit Ubuntu Zesty:



    Regards
    fnu

    HowTo: APT pinning

  • Ich hab mir jetzt man die manpages von readdir auf zweien meiner Systeme angeschaut. Da heißt es auf dem einen


    und auf dem anderen


    Das zweite System hab ich erst vor wenigen Monaten aufgesetzt (openSUSE Leap 42.2).
    Für mich sieht das nicht so aus, als könne man problemlos auf readdir() umsteigen.


    Klaus

  • Pauschal kann man sicherlich nicht umsteigen, im Fall von text2skin von fnu für diese Stelle aber schon.
    Da, wo es möglich ist, sollte man es sicherlich tun. Und solange es readdir_r noch gibt, kann man es ja auch verwenden.


    Lars

  • Und solange es readdir_r noch gibt, kann man es ja auch verwenden.

    Und danach, wenn readdir nicht taugt?

    HowTo: APT pinning

  • Danach müsste man versionsabhängige ifdefs verwenden oder alte Versionen nicht mehr zulassen. Ich bin mir sicher, in der glibc gibt es was analoges zu VDRVERSNUM.


    Lars.

Jetzt mitmachen!

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