Giuliano Colla wrote:
> Al Boldi ha scritto:
> > I played with this some more, and it turns out that not only is
> > FreeOnTerminate completely broken but Free only frees the OS-thread
> > memory if the thread is still running or is preceded by a WaitFor.  This
> > is on fpc2.0.2/linux.  Maybe this has been fixed in 2.2.0?
> >
> > Below is the test-code.
> >
> > Can somebody confirm this on other platforms/fpcVersions.
>
> I've made some quick tests, with what I have ready at hand and with my
> test app. Not so different from yours, except that it allows me more
> options. Platform Linux, fpc 2.0.4 and 2.2.0, Lazarus.fixes and Lazarus
> trunk latest svn. Widgetset gtk1.
>
> With fpc 2.0.4, FreeOnTerminate leaks memory whatever I've tried.

Ok, same here.

> With fpc 2.2.0, using Synchronize, I've been unable to get rid of memory
> leaks if the thread is terminated within an OnClose event.
> If the thread is terminated before closing the form, it behaves properly.
>
> With fpc 2.2.0, if I don't use Synchronize, but rather a message queue
> processed by the OnIdle handler, then I don't experience any memory
> leak, whatever is the thread termination.
>
> My conclusion: fpc 2.0.4 has almost certainly some bug on
> FreeOnTerminate. In many cases it segfaults, meaning, I guess, that
> there's some NilAndFree in place of FreeAndNil :-)
>
> With fpc 2.2.0 it's harder to tell at first glance, but one would say
> that the problem is on Lazarus side, because the fpc rtl Syncronize
> provide just a thread safe frame, and leaves all the work to the main
> thread loop.
>
> Synchronize is heavily widgetset dependent. That's why I only report
> gtk1 results. With gtk2 I've met inconsistent results from one revision
> to the next, with qt synchronize for me doesn't work at all.

Ok, synchronize is another problem, which I would like to deal with 
separately.

For now, when you start a thread non-suspended, TThread.Execute(false), can 
you see the memory increase for your project1 app when checking with top?  
Then, when you TThread.WaitFor/TThread.Free, does it decrease?  And by how 
much?

Below is the simplified console app.


Thanks for the feedback!

--
Al

---
program threadbug;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes
  { add your units here };

type

  { TThreadBug }

  TThreadBug=class(TThread)
    procedure Execute; override;
  end;

{ TThreadBug }

procedure TThreadBug.Execute;
begin
  writeln('just ran a thread... done!');
end;

var t1:TThreadBug; ans:string;

begin
  t1:=TThreadBug.Create(false);

  writeln('WaitFor? [y/N]');
  readln(ans);
  if ans='y' then begin
    t1.WaitFor;
    writeln('OS thread memory released.');
  end else
    writeln('OS thread memory left dangling.');

  t1.Free;
  writeln('Confirm with top now!');
  readln;
end.


_________________________________________________________________
     To unsubscribe: mail [EMAIL PROTECTED] with
                "unsubscribe" as the Subject
   archives at http://www.lazarus.freepascal.org/mailarchives

Reply via email to