[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