OE2.2: FATAL!: addTimer must be called from thread ...

  • Hallo,


    mit einem der letzten Updates der DM7080HD hat sich ein Threading Fehler eingeschlichen bzw. es wird restriktiver geprüft.



    Im Code des SeriesPlugin wird hier keine Funktion addTimer verwendet.
    Meine Vermutung, es wird die C-Funktion des eTimers im falschen Thread aufgerufen.
    Aber ein Timer wird vom Plugin auch nicht verwendet.


    Für das Threading wird das Toolkit SimpleThread verwendet.



    Beim Netatmo Plugin scheint es, das gleiche Problem zu geben.



    Danke

    • Offizieller Beitrag

    Hi,


    naja.. der Fehler ist aber schon sehr eindeutig und bedeutet definitiv, dass irgendwo ein eTimer vom falschen Thread gestartet wird.


    Die funktion addTimer selber wird zwar nicht von python aufgerufen... wird intern aber aufgerufen sobald irgendwo "start", "startLongTimer oder "changeInterval" aufgerufen wird.. also diese Methoden vom eTimer...


    Das ganze ist übrigens in OE2.2 nicht restriktiver als in OE2... da ist der check genauso drinn. (und das ist auch okay)


    Änderungen gab es da von unserer Seite auch seit längerem nicht mehr.


    cu

    • Offizieller Beitrag

    Es muss übrigens nichtmal ein direkter Aufruf der Timer funktion an der stelle in python stehen.


    Es reicht wenn du aus einem python thread irgendeine enigma2 funktion aufrufst... enigma2 ist nicht wirklich thread sicher... deshalb darf man in python threads keine enigma2 funktionen aufrufen.. oder nur sehr wenige.


    Es könnte als auch sein, dass dort irgendeine andere enigma2 funktion aufgerufen wird, die dann intern einen Timer startet.. das passiert dann ja ebenfalls aus dem falschen thread.


    Vermutlich irgendwas mit GUI... also eine setText funktion.. oder sowas. Oder show/hide von einem Dialog..


    Schwer zu sagen ohne nun die SOurcen gesehen zu haben.


    cu

  • Erstmal, Danke das du dich am Feiertag dazu meldest.


    Beim Netatmo Plugin vermute ich mal, es liegt am Aufruf des AddPopup.
    Bei meinem SeriesPlugin, muss ich erstmal nachforschen.

  • Ghost
    Ich hab dir diesbezüglich schon ein Mail geschickt, wo ich dieses Thema ansprach - das Problem mit dem addTimer in der AdvancedMovieSelection (2x Crashlog)


    Das selbe Problem tritt im Netatmo plugin auf - ist auch von mir :winking_face:
    Im netatmo waren die einzigen methoden die von einem anderen Thread aufgerufen wurden die config Parameter und die Translations from __init__ import _
    Die config habe ich versuchsweise schon entfernt (keine Verbesserung) - 2 Übersetzungen sind im core von Netatmo noch drin, die beim aktualisieren von einem nicht e2 Thread aufgerufen werden!
    Die _(xyz) wird aber nicht in der GUI aktualisiert sondern nur als string gespeichert und der wird von einem screen Label oder converter/renderer angezeigt.


    Für uns wäre auch hilfreich, wenn die Thread ID von python oder die __repr__() ausgegeben würde, weil mit der derzeitigen ID können wir wenig anfangen.


    Dec 21 13:43:11 dm7080 enigma2[177]: [Netatmo] thread info: <NetatmoUpdateThread(NetatmoUpdateThread, started 1622545472)>
    Dec 21 13:43:11 dm7080 enigma2[177]: FATAL!: addTimer must be called from thread 177 but is called from thread 4777


    Die show popup methode wird von einem eTimer aufgerufen und alle Werte werden von einem Objekt abgefragt, welches von einem externen python Thread aktualisiert wird.


    Es gibt übrigens bei Netatmo und AdvancedMovieSelection keine Probleme unter oe2.0 (beim SeriesPlugin glaube auch nicht).

  • Ja, die entsprechende Thread ID hab ich auch lange gesucht.


    Hab hier auch schon alles versucht:
    currentThread(), _get_ident(), self.ident, os.getpid()


    Aus den OpenEmbedded Sourcen hab ich mir dann das hier abgeleitet:
    from ctypes import CDLL
    SYS_gettid = 4222
    libc = CDLL("libc.so.6")
    tid = libc.syscall(SYS_gettid)
    print "Thread id: " + tid


    Fehler nochmal nachgestellt:
    FATAL!: addTimer must be called from thread 5532 but is called from thread 7135


    MainThread ist 5532
    WorkerThread ist 7135


    Wir haben also definitif ein Problem in den Threads


    Aktuell liegt meine Vermutung bei ePythonMessagePump

    Einmal editiert, zuletzt von betonme ()

  • Ich hänge mich mal hier mit rauf.


    Habe nun auch den selben Fehler.

    "Code"
    Dec 29 16:51:07 Wohnstube enigma2[15339]: FATAL!: addTimer must be called from thread 15339 but is called from thread 1290
    Dec 29 16:51:07 Wohnstube enigma2[15339]: Python stack trace:
    Dec 29 16:51:07 Wohnstube enigma2[15339]: /usr/lib/python2.7/soundcloud/resource.py(26): __getattr__
    "Code"


    Ich habe ein 'BlinkingLabel' in den Screen eingebaut vorgestern. :confused_face: Da läuft ja ein Timer intern. Das BlinkingLabel wird am Ende des Threads duch den Messagepump beendet.... Ich teste heute abend nochmal. Vielleicht ist es ja daher.


    Mfg.

    Die meisten Probleme macht man sich selber!

  • grade war es mal wieder soweit, Crashlog wurde leer angelegt. enigma ist der aktuelle Stand:

  • Jup project-valerie nun auch.


    Fehler tritt auf wenn von einem anderen Thread die folgende Funktion über einen Callback handler aufgerufen wird.

    Code
    def _appendLog(self, text):		self["console"].appendText(text + "\n")
    • Offizieller Beitrag

    Hi,


    Bobo71:


    das mit dem BlinkingLabel ist mal ein Ansatz. In welchem Plugin hast Du das eingebaut und wo?


    Und lässt es sich damit gut nachstellen?


    Also ich bräuchte irgendein Plugin mit dem man das Problem recht schnell nachstellen kann. Aber bitte ein halbwegs überschaubares Plugin :winking_face:


    Hmm und weiss denn jemand ungefähr seit welcher Version es auftritt? Weil direkt sehe ich leider keine Changes bei uns im Code die was damit zu tun haben könnten.


    Was nicht heissen soll, dass da nix ist.


    cya

    • Offizieller Beitrag

    Ich habe das Problem nun zumindest in dem Code von Bobo71 gefunden..


    Ich habe die Vermutung es könnte bei den anderen Plugins die Probleme machen etwas ähnliches sein.


    Wenn man non modale Dialoge benutzt sprich dialoge die mit self.session.instantiateDialog erzeugt wurden. Dann muss man zwingend wenn man diese nicht mehr braucht sie mit self.session.deleteDialog(self.dlg) löschen... im Falle von Bobo71 wurde dann einfach self.dlg.doClose() aufgerufen. Dieses ist aber verboten... und genau dadurch entsteht dann dieses Problem. in Zukunft wird es in solchen fällen eine Warning in den debug Ausgaben geben.. es wird aber eine Zeit lang noch funktionieren. Bis wir die Funktion dann endgültig entfernen werden. Sieht dann etwa so aus:

    Code
    WARNING: NEVER call Screen.doClose directly!!! You have to use Session.deleteDialog(screen)
    This function is deprecated and will be removed in the future
    Please report!
      File "/usr/lib/enigma2/python/Plugins/Extensions/MusicCenter/MusicCenter.py", line 1934, in __onClose
        self.player.doClose()
      File "/usr/lib/enigma2/python/Screens/Screen.py", line 113, in doClose
        traceback.print_stack(limit = 2)


    Bitte mal prüfen ob es vllt in den anderen Plugins die Probleme machen dasselbe sein könnte.


    cya

  • Hallo Ghost,


    ich habe das self.session.deleteDialog(self.dlg) eingebaut.


    Eben aber dieser Crash:


    :confused_face:
    Edit: Wieder beim Login...

    Die meisten Probleme macht man sich selber!

  • Ich habe alle angepasst! :confused_face:


    Die meisten Probleme macht man sich selber!