Browse Source

+ test for proper freeing of thread resources

git-svn-id: trunk@10325 -
Jonas Maebe 17 years ago
parent
commit
990fb69d19
2 changed files with 75 additions and 0 deletions
  1. 1 0
      .gitattributes
  2. 74 0
      tests/webtbs/tw10815.pp

+ 1 - 0
.gitattributes

@@ -7980,6 +7980,7 @@ tests/webtbs/tw10790.pp svneol=native#text/plain
 tests/webtbs/tw10800.pp svneol=native#text/plain
 tests/webtbs/tw10807.pp svneol=native#text/plain
 tests/webtbs/tw1081.pp svneol=native#text/plain
+tests/webtbs/tw10815.pp svneol=native#text/plain
 tests/webtbs/tw1090.pp svneol=native#text/plain
 tests/webtbs/tw1092.pp svneol=native#text/plain
 tests/webtbs/tw1096.pp svneol=native#text/plain

+ 74 - 0
tests/webtbs/tw10815.pp

@@ -0,0 +1,74 @@
+{ %skiptarget=go32v2 }
+
+program MaxThread;
+
+{$mode objfpc}{$H+}
+
+uses
+ {$ifdef unix}
+ cthreads,
+ {$endif}
+ Classes, SysUtils;
+ { add your units here }
+
+
+type
+ ThProva = class(TThread)
+ private
+   Number: Integer;
+ protected
+   procedure Execute; override;
+ public
+   constructor Create(ThreadNumber: Integer);
+ end;
+
+var
+ threadsfinished: Integer;
+
+
+constructor ThProva.Create(ThreadNumber: Integer);
+begin
+ self.Number:= ThreadNumber;
+ self.FreeOnTerminate:= true;
+ inherited Create(true);
+end;
+
+procedure ThProva.Execute;
+begin
+ WriteLn('I am the thread number '+ IntToStr(Number));
+ Terminate;
+ { not exactly finished yet, but good enough }
+ interlockedincrement(threadsfinished);
+end;
+
+
+var
+ ThreadNumber: Integer;
+ thr: thprova;
+begin
+ ThreadNumber:= 0;
+ WriteLn('Begin');
+ { needs to be > 410 because at least on Mac OS X and Linux you can start }
+ { about 400 threads before you run into trouble if they aren't finished  }
+ while (threadnumber < 500) do
+   begin
+     try
+       Inc(ThreadNumber);
+       thr:=ThProva.Create(Threadnumber);
+       thr.resume;
+     Except on e: Exception do
+       begin
+         WriteLn(e.Message);
+         halt(1);
+       end;
+     end;
+     if (threadnumber mod 16) = 0 then
+       while (threadsfinished<>threadnumber) do
+         { let the started threads to finish }
+         sleep(70);
+   end;
+  while (threadsfinished<>threadnumber) do
+    { give some time to the started threads to finish }
+    sleep(100);
+  sleep(200)
+end.