Unterschiedliches Verhalten g_idle_add() unter x86_64 & armhf



  • Liebes Forum,
    ich hoffe, die Frage ist hier richtig. Ich habe folgendes Problem:

    Ich programmiere einen GUI unter linux mit gtk-4/glib2.0. In der "activate"-Funktion lasse ich eine Funktion "my_func" mit

    g_idle_add ( G_CALLBACK (my_func), pointer_data );

    regelmäßig durch den main_loop (g_application_run() ) aufrufen.

    Das ganze klappt auch unter x86_64 prima, die Funktion "my_func" wird regelmäßig aufgerufen.
    Unter ARM jedoch wird die "my_func"-Funktion lediglich einmal aufgerufen und dann nicht mehr angesprungen. Funktionen, die per Button-Callback aufgerufen werden, funktionieren jedoch zu jedem Zeitpunkt, auch wenn die g_idle_add bereits aufgerufen wurde.

    Hat jemand eine Erklärung für das unterschiedliche Verhalten in beiden Architekturen?

    Ich hoffe, mein Posting enthält genug Infos, wenn nicht, ich liefere gerne weitere Infos.

    Viele Grüße
    und danke fürs Lesen
    und die Mühe
    Paule



    • Ändere den Typ von my_func so dass er 1:1 mit dem erwarteten Prototyp übereinstimmt
    • Lass die Funktion G_SOURCE_CONTINUE zurückgeben
    • Entferne den unnötigen cast beim Aufruf von g_idle_add


  • Vielen dank für die Antwort,

    ich habe
    die Vorgehensweise hat funktioniert. Aber die Frage ist, soll das so sein, dass das unter ARM so funktioniert?

    ich habe die Funktion my_func abgeändert in:

    static gboolean my_func ( type *data ){
    ...
    return G_SOURCE_CONTINUE;
    }

    und rufe die Funktion direkt auf

    ...
    g_idle_add ( my_func, data );
    ...

    Jetzt funktioniert es, aber die Frage ist, soll das so sein? Eigentlich sollte es ja auf verschiedenen Architekturen gleich funktionieren. Ist das ein Bug?

    Viele Grüße
    und danke für den Rat
    Paule



  • @paule sagte in Unterschiedliches Verhalten g_idle_add() unter x86_64 & armhf:

    Jetzt funktioniert es, aber die Frage ist, soll das so sein? Eigentlich sollte es ja auf verschiedenen Architekturen gleich funktionieren. Ist das ein Bug?

    Achje 🙂
    Was richtig ist, ist eh auf allen Plattformen gleich.
    Dein originaler Code war auf allen Plattformen falsch.
    Der neue Code ist für alle Plattformen richtig.

    Dass der alte Code auf einer anderen Plattform trotzdem funktioniert hat, ist einfach Zufall.

    Die Funktion die an g_idle_add übergeben wird muss als Returntyp immer gboolean haben und immer genau einen Parameter vom Typ gpointer haben. Denn so wird sie von der GLib aufgerufen.

    Wenn du aber eine Funktion übergibst die gar keinen Wert zurückgibt, dann kann das nicht richtig funktionieren. GLib weiss ja nichts davon dass die Funktion nichts zurückgibt. D.h. GLib schaut dann einfach an der Stelle nach wo der Returnwert sein sollte - was meistens ein CPU Register ist. Und wenn an der Stelle 0 steht (G_SOURCE_REMOVE), dann wird die Funktion entfernt und nicht mehr aufgerufen. Und wenn da auf x86 nach dem Aufruf der Funktion halt nie 0 drin war, dann hat es auf x86 halt zufällig funktioniert. Aber falsch war es trotzdem.

    An diesen Umstand, also dass "funktioniert" nicht "ist richtig" bedeutet, musst du dich bei C gewöhnen. D.h. du musst wissen was du tust, sonst ist die Chance dass dir sowas wieder passiert sehr hoch.



  • Hallo,

    @hustbaer sagte in Unterschiedliches Verhalten g_idle_add() unter x86_64 & armhf:

    Die Funktion die an g_idle_add übergeben wird muss als Returntyp immer gboolean haben und immer genau einen Parameter vom Typ gpointer haben. Denn so wird sie von der GLib aufgerufen.

    Wenn du aber eine Funktion übergibst die gar keinen Wert zurückgibt, dann kann das nicht richtig funktionieren. ...

    Ich muss zugeben, ich hatte den Code aus einem Forum zusammengesammelt, als ich nach dem suchte, was g_idle_add oder g_timeout_add macht.
    Ich dachte, der Cast sorgt automatisch dafür, dass G_SOURCE_CONTINUE zurückgegeben wird, unabhängig, was die Funktion zurückgibt (in meinem Fall eben nichts).

    @hustbaer sagte in Unterschiedliches Verhalten g_idle_add() unter x86_64 & armhf:

    An diesen Umstand, also dass "funktioniert" nicht "ist richtig" bedeutet, musst du dich bei C gewöhnen. D.h. du musst wissen was du tust, sonst ist die Chance dass dir sowas wieder passiert sehr hoch.

    Das das bei C so ist, war mir klar :). ich bin nur noch recht frisch in GTK/Glib/GObject und mir brummt der Kopf von den ganzen (zum Teil automatisch generierten) Casts, Macros, Funtionen etc. Auf jeden Fall danke dafür, das Dickicht etwas zurechtzuschneiden.

    Viele Grüße
    und danke
    Paule

    An diesen Umstand, also dass "funktioniert" nicht "ist richtig" bedeutet, musst du dich bei C gewöhnen. D.h. du musst wissen was du tust, sonst ist die Chance dass dir sowas wieder passiert sehr hoch.


Anmelden zum Antworten