[fpc-devel] Segmentation fault for Firebird exception inside thread

LacaK lacak at zoznam.sk
Tue Oct 25 13:10:33 CEST 2011


May be that is is (or not ;-)) related to 
http://bugs.freepascal.org/view.php?id=17360
-Laco.
> Hello, this is my first post and I hope this is the correct list for 
> my question.
>
> I'm getting a segmentation fault ('violaciĆ³n de segmento' in spanish)
> when running the code from below on a Linux 64-bit machine (OpenSuse 
> 10.2 64-bits).
>
> I'm using FPC 2.2.5, so perhaps the error is already known, but I did 
> not find any solution in the web.
>
> I tested the code on Windows 32 bits and Linux 32 bits too, but there 
> everything seems ok.
>
> The example is about opening a Firebird connection in a thread.
> When there is a Firebird exception inside this connection,
> the application terminates with the segmentation fault.
>
> Does anyone know about this error, or can anyone give me a hint, where 
> to look for a solution?
>
> This is the example code:
>
> <code>
> program fbthreadtest;
> {$IFDEF FPC}
>   {$MODE DELPHI}{$H+}
> {$ENDIF}
>
> {$APPTYPE CONSOLE}
>
> uses
>   {$IFDEF UNIX}
>   cthreads,
>   cwstring,
>   {$ENDIF}
>   Classes,
>   IBConnection, sqldb;
>
> type
>   TFBThread = class(TThread)
>   private
>   protected
>     procedure Execute; override;
>   public
>     constructor Create;
>   end;
>
> constructor TFBThread.Create;
> begin
>   inherited Create(True);
>   FreeOnTerminate := False;
>   Resume;
> end;
>
> procedure TFBThread.Execute;
> var
>   db: TIBConnection;
>   tr: TSQLTransaction;
>   q: TSQLQuery;
> begin
>   db := TIBConnection.Create(nil);
>   try
>     db.DatabaseName := 'localhost:/home/data/Database/ssstst.gdb';
>     db.LoginPrompt := False;
>     db.HostName := '';
>     db.UserName := 'SYSDBA';
>     db.Password := 'masterkey';
>     db.Connected := TRUE;
>     tr := TSQLTransaction.Create(nil);
>     try
>       tr.DataBase := db;
>       tr.Action   := caCommit;
>       tr.Params.Clear;
>       tr.Params.Add('isc_tpb_read_committed');
>       tr.Params.Add('isc_tpb_rec_version');
>       tr.Params.Add('isc_tpb_nowait');
>       db.Transaction := tr;
>       tr.Active := True;
>       q := TSQLQuery.Create(nil);
>       try
>         q.Database    := db;
>         q.Transaction := tr;
>
>         try
>           Writeln('select...');
>           // the following line raises an exception because 
> rdb$databases doesn't exist.
>           q.SQL.Text := 'select count(*) from rdb$databases';
>           q.Prepare;
>         except
>           Writeln('...exception');
>         end;
>       finally
>         q.Free;
>       end;
>     finally
>       tr.Commit;
>       tr.Free;
>     end;
>   finally
>     db.Connected := False;
>     db.Free;
>   end;
> end;
>
> begin
>   with TFBThread.Create do begin
>     WaitFor;
>     Free;
>   end;
> end.
> </code>
>
> Thanks,
>
> Stefan
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
>




More information about the fpc-devel mailing list