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@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to