plugin '<no name given>' called cPlugin::ConfigDirectory(), which is not thread safe!

  • Moin


    nachdem der VDR lange ohne Murren seinen Dienst versah, musste ich vor ein paar Tagen festellen, das er mir messages mit folgender Meldung zumüllt (messages mehrere MB groß):


    plugin '<no name given>' called cPlugin::ConfigDirectory(), which is not thread
    safe!


    Habe schon einges probiert, bekomme es aber nicht weg.


    Hat zufällig jmd ähnliches Problem gehabt oder ne Idee, was ich mal ausprobieren könnte ?


    LG


    Thorsten

    --
    Celeron 700, 512 MB, 80 GB + 60 GB (Video), 2 GB (mpeg), 1 Nexus, [VDR, Router, Fileserver, Printserver, Samba, Apache, Mysql]

  • Irgend ein Plugin erfragt mittels ConfigDirectory() das aktuelle Konfigurations-Verzeichnis von VDR, und das aus einem Hintergrund-Thread heraus. Diese Funktion ist aber nicht thread-safe, und das kann zu Abstürzen, in falsche Verzeichnisse gespeicherte Dateien, oder (schlimmstenfalls, extrem selten) zu Datenverlusten im Configverzeichnis führen.


    Erster Schritt ist, durch try-and-error (genauer, try-and-no-error ;) ) das Plugin herauszufinden, das das Problem auslöst. Dann: Wenn möglich updaten oder Autor verständigen.


    Die beste Lösung (für Programmierer) ist: Statt ConfigDirectory() immer wieder aufzurufen, sollte das Plugin beim Initialisieren ein strdup(ConfigDirectory()) speichern, und nur diese 'eigene Kopie' im Thread benutzen.


    Gruß,


    Udo

  • Ehm... Danke!


    Genau dieses Problem habe ich gerade und komme allerdings trotzdem nicht weiter. Ich habe bei mir das ConfigDirectory als statische Klassenvariable angelegt, die beim init() des Plugins erstmalig abgerufen und dementsprechend definiert wird. Aber anstatt das Verzeichnis zu bekommen erhalte ich "(null)/plugins/", was sicherlich auch nicht im Sinne des Erfinders ist. Wann beziehungsweise wo wird das Verzeichnis denn ordnungsgemäß angelegt?


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

  • Das Plugin-Verzeichnis muss erst gesetzt sein, vorher funktioniert der Aufruf noch nicht. Deswegen ist im Konstruktor und in ProcessArgs() der Aufruf von ConfigDirectory() tabu. Dagegen sollte ein Aufruf innerhalb von Initialize() oder Start() kein Problem darstellen.


    Gruß,


    Udo

  • Auch problematisch ist, dass der Aufruf synchronisiert werden muss. Ich habe das Verzeichnis in einem anderen Thread abfragen wollen, wo es noch nicht gültig war, obwohl eigentlich der Start des Threads viel später stattfand als das Starten des Plugins selber. Nur ist der nebenläufige Thread schneller gewesen. Mit einer globalen CondWait mit Wait im anfragenden Thread und Signal im Plugin-Initialize und die Sache funktioniert.


    Medion Digitainer; AsRock B75 Pro3-M, Celeron G540; Kingston Value 4GB
    Samsung SpinPoint 250GB 2,5"; Samsung WriteMaster DVD-Brenner;
    TT-S2-6400, 2x TT-S2-1600, Ubuntu 12.04 mit YaVDR-Paketen. VDR 1.7.27, UPnP/DLNA-Plugin

Jetzt mitmachen!

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