Aufruf einer Library innerhalb eines TThread

Antworten
piula
Beiträge: 12
Registriert: Sa 2. Jan 2016, 21:25

Aufruf einer Library innerhalb eines TThread

Beitrag von piula »

Ich habe ein etwas seltsames Problem beim Aufruf einer Library-Funktion innerhalb eines Threads. Hier ein Minimalbeispiel:

Code: Alles auswählen

 
library library1;
 
{$mode objfpc}{$H+}
 
uses
  cthreads;
 
procedure test (var result: integer); stdcall;
begin
  result:=42;
end;
 
exports
  test;
 
begin
end.
 


Code: Alles auswählen

 
program project1;
 
uses
  cthreads,
  classes,
  dynlibs;
 
type
  ttestproc = procedure (var result: integer); stdcall;
  tmythread = class(tthread)
    procedure execute; override;
    protected
    h: tlibhandle;
    f: ttestproc;
  end;
 
procedure tmythread.execute;
var i: integer;
begin
  h := loadlibrary ('./liblibrary1.so');
  f := ttestproc (getprocedureaddress (h, 'test'));
  f(i);
  unloadlibrary(h);
end;
 
var
  t:  tmythread;
  h1: tlibhandle;
 
begin
  h1 := loadlibrary ('./liblibrary1.so');
  t := tmythread.create(true);
  t.start;
  t.waitfor;
  unloadlibrary (h1);
end.
 


Ich habe eine Library, die im Speicher verbleiben muss. Sie wird deshalb zu Beginn des Hauptthreads geladen und erst dann wieder entladen, wenn der Hauptthread beendet wird. Funktionen dieser Library sollen in weiteren Threads aufgerufen werden.

Das ganze funktioniert unter Win32 und Linux64 ohne Probleme. Aber auf Linux32 ergibt sich ein Stack Overflow Error 202, sofern beim Compilieren der Library die Option "Stack Overflow Checking" aktiviert war. Der Stack Overflow passiert beim Aufruf der Library-Funktion in Zeile 22 des Hauptprogramms. Er tritt nur dann auf, wenn

a) Die Bibliothek schon zuvor geladen wurde (Zeile 31), d.h. das Handle nicht erstmalig angefordert wird, und
b) der Aufruf innerhalb eines Threads erfolgt. Ruft man nur den Code des Threads auf (ohne einen Thread zu starten), funktioniert alles normal.

Ich frage mich nun, ob es sich bei dem Verhalten um einen Compiler-Bug handelt, oder ob ich einen dummen Fehler in der Programmierung habe.

Die Tests mit dem oben gelisteten Beispiel erfolgten auf Ubuntu 15.10, Lazarus 1.4, FPC 2.6.4.


piula
Beiträge: 12
Registriert: Sa 2. Jan 2016, 21:25

Re: Aufruf einer Library innerhalb eines TThread

Beitrag von piula »



Das habe ich durchaus gelesen, allerdings in der englischen Version. Und dort heisst es: "stack checking under Windows". Deshalb mass ich dem nicht unbedingt viel Bedeutung bei, da es unter Windows ja funktioniert, nur unter Linux32 nicht.

Antworten