Eingebette Funktionen und TThreadMethod [gelöst]

Alle Fragen zur Netzwerkkommunikation
Antworten
Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Eingebette Funktionen und TThreadMethod [gelöst]

Beitrag von Socke »

Hallo,
ich hab mal wieder eine etwas exotischere Frage: Kann ich eingebettete Funktionen als TThreadMethod aufrufen, oder zerschießt mir das den Stack?

Code: Alles auswählen

// TThreadMethod aus unit Classes;
TThreadMethod = procedure of object;
// meine Funktionen 
function TFileThread.CancelJob(AJob: TJob): Boolean;
  procedure InvalidJobError;
  begin
    TAsyncCallObject.CreateDebugLogError(Format(rsCancelJobNotFound,[PtrInt(AJob)]));
  end;
// und so solls aufgerufen werden
Synchronize(@InvalidJobError);

Wie man sieht, greift die eingebettete Funktion auf keine Variable zu und könnte also auch ohne Stackframe-Pointer auskommen. Wenn der aber nicht übergeben wird fehlt er wird aber trotzdem wieder vom Stack entfernt -> Stack kaputt. Dazu kommt noch, dass die Aufrufkonvention register ist (default), was heißt, es wird gar nichts auf dem Stack abgelegt (Self + StackFrame = 2; 2 < 3 = nichts auf den Stack), sodass der garnicht zerschossen werden kann. Bzw. wie wäre das mit Cdecl oder oldfpccall, wo die aufrufende Funktion den Stack bereinigt, und die weiß, dass nichts übergeben wurde?

Was haltet ihr davon?
Zuletzt geändert von Socke am Sa 17. Okt 2009, 21:56, insgesamt 2-mal geändert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Eingebette Funktionen und TThreadMethod

Beitrag von mschnell »

Der Stack mag ja (defaultmäßig) bei einem Thread kleiner sein als beim Mainthread, Aber die paar Byte, die als overhead bei eingebetteten Funktionen entstehen, wird er wohl noch verkraften.

Eine Eingebettete Funktion kann man aber nur aus der umgebenden Funktion aufrufe. Nicht mit Synchronize.

Geht das denn über den Compiler ?

-Michael

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Eingebette Funktionen und TThreadMethod

Beitrag von Socke »

mschnell hat geschrieben:Der Stack mag ja (defaultmäßig) bei einem Thread kleiner sein als beim Mainthread, Aber die paar Byte, die als overhead bei eingebetteten Funktionen entstehen, wird er wohl noch verkraften.

Eine Eingebettete Funktion kann man aber nur aus der umgebenden Funktion aufrufe. Nicht mit Synchronize.

Geht das denn über den Compiler ?

-Michael

Der Compiler sagt gar nichts und schluckt alles. Es geht mir auch nicht darum, dass der Stack zu groß wird, sondern darum, dass Synchronize den versteckten Stackframe-Pointer nicht übergibt.
Das Aufrufen geht von überall aus, wenn du eine Adresse hast :D Synchronize(@InvalidJobError) muss nur innerhalb der umgebenden Funktion aufgerufen werden, stellt aber kein Problem dar (und ist auch so angedacht).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Eingebette Funktionen und TThreadMethod

Beitrag von mschnell »

Socke hat geschrieben:
mschnell hat geschrieben: Es geht mir auch nicht darum, dass der Stack zu groß wird, sondern darum, dass Synchronize den versteckten Stackframe-Pointer nicht übergibt.
Es wäre ja auch katastrophal, wenn Synchronize den Stack-Frame-Pointer übergeben würde. Der Stack könnte im Thread abgebaut werden und der Pointer ins Leere zeigen.

-Michael

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Eingebette Funktionen und TThreadMethod

Beitrag von Socke »

Da der Stack-Pointer nicht gebraucht wird, wäre das aber so ziemlich egal.
Edit: Wie blöd bin ich eigentlich? Ich habe mich gewundert, weshalb der Compiler mein {$FATAL ...} schluckt. Und siehe da, er kompiliert die unit gar nicht, da nicht gebraucht. Ergebnis:

Code: Alles auswählen

Error: Incompatible type for arg no. 1: Got "<address of local procedure;Register>", expected "<procedure variable type of procedure of object;Register>"
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten