Quellcode durchsuchen

* honour the specified stack size when creating new threads on unix
platforms + test (mantis #12942)

git-svn-id: trunk@12527 -

Jonas Maebe vor 16 Jahren
Ursprung
Commit
1a1fc1357d

+ 1 - 0
.gitattributes

@@ -8716,6 +8716,7 @@ tests/webtbs/tw1279.pp svneol=native#text/plain
 tests/webtbs/tw1283.pp svneol=native#text/plain
 tests/webtbs/tw1283.pp svneol=native#text/plain
 tests/webtbs/tw1284.pp svneol=native#text/plain
 tests/webtbs/tw1284.pp svneol=native#text/plain
 tests/webtbs/tw1286.pp svneol=native#text/plain
 tests/webtbs/tw1286.pp svneol=native#text/plain
+tests/webtbs/tw12942.pp svneol=native#text/plain
 tests/webtbs/tw1295.pp svneol=native#text/plain
 tests/webtbs/tw1295.pp svneol=native#text/plain
 tests/webtbs/tw1299.pp svneol=native#text/plain
 tests/webtbs/tw1299.pp svneol=native#text/plain
 tests/webtbs/tw1310.pp svneol=native#text/plain
 tests/webtbs/tw1310.pp svneol=native#text/plain

+ 2 - 0
rtl/darwin/pthread.inc

@@ -47,6 +47,8 @@ function  pthread_attr_init           (p : ppthread_attr_t):cint; cdecl; externa
 function  pthread_attr_setinheritsched(p : ppthread_attr_t;i:cint):cint; cdecl; external 'c';
 function  pthread_attr_setinheritsched(p : ppthread_attr_t;i:cint):cint; cdecl; external 'c';
 function  pthread_attr_setscope      (p : ppthread_attr_t;i:cint):cint;cdecl;external 'c';
 function  pthread_attr_setscope      (p : ppthread_attr_t;i:cint):cint;cdecl;external 'c';
 function  pthread_attr_setdetachstate (p : ppthread_attr_t;i:cint):cint;cdecl;external 'c';
 function  pthread_attr_setdetachstate (p : ppthread_attr_t;i:cint):cint;cdecl;external 'c';
+function  pthread_attr_setstacksize(p: ppthread_attr_t; stacksize: size_t):cint;cdecl;external 'c';
+
 function  pthread_create ( p: ppthread_t;attr : ppthread_attr_t;f:__startroutine_t;arg:pointer):cint;cdecl;external 'c';
 function  pthread_create ( p: ppthread_t;attr : ppthread_attr_t;f:__startroutine_t;arg:pointer):cint;cdecl;external 'c';
 procedure pthread_exit  ( p: pointer); cdecl;external 'c';
 procedure pthread_exit  ( p: pointer); cdecl;external 'c';
 function  pthread_self:pthread_t; cdecl;external 'c';
 function  pthread_self:pthread_t; cdecl;external 'c';

+ 1 - 0
rtl/freebsd/pthread.inc

@@ -48,6 +48,7 @@ function  pthread_attr_init           (p : ppthread_attr_t):cint; cdecl; externa
 function  pthread_attr_setinheritsched(p : ppthread_attr_t;i:cint):cint; cdecl; external;
 function  pthread_attr_setinheritsched(p : ppthread_attr_t;i:cint):cint; cdecl; external;
 function  pthread_attr_setscope      (p : ppthread_attr_t;i:cint):cint;cdecl;external;
 function  pthread_attr_setscope      (p : ppthread_attr_t;i:cint):cint;cdecl;external;
 function  pthread_attr_setdetachstate (p : ppthread_attr_t;i:cint):cint;cdecl;external;
 function  pthread_attr_setdetachstate (p : ppthread_attr_t;i:cint):cint;cdecl;external;
+function  pthread_attr_setstacksize(p: ppthread_attr_t; stacksize: size_t):cint;cdecl;external;
 function  pthread_create ( p: ppthread_t;attr : ppthread_attr_t;f:__startroutine_t;arg:pointer):cint;cdecl;external;
 function  pthread_create ( p: ppthread_t;attr : ppthread_attr_t;f:__startroutine_t;arg:pointer):cint;cdecl;external;
 procedure pthread_exit  ( p: pointer); cdecl;external;
 procedure pthread_exit  ( p: pointer); cdecl;external;
 function  pthread_self:pthread_t; cdecl;external;
 function  pthread_self:pthread_t; cdecl;external;

+ 1 - 0
rtl/haiku/pthread.inc

@@ -49,6 +49,7 @@ function  pthread_attr_init           (p : ppthread_attr_t):cint; cdecl; externa
 function  pthread_attr_setinheritsched(p : ppthread_attr_t;i:cint):cint; cdecl; external;
 function  pthread_attr_setinheritsched(p : ppthread_attr_t;i:cint):cint; cdecl; external;
 function  pthread_attr_setscope      (p : ppthread_attr_t;i:cint):cint;cdecl;external;
 function  pthread_attr_setscope      (p : ppthread_attr_t;i:cint):cint;cdecl;external;
 function  pthread_attr_setdetachstate (p : ppthread_attr_t;i:cint):cint;cdecl;external;
 function  pthread_attr_setdetachstate (p : ppthread_attr_t;i:cint):cint;cdecl;external;
+function  pthread_attr_setstacksize(p: ppthread_attr_t; stacksize: size_t):cint;cdecl;external;
 {$endif}
 {$endif}
 function  pthread_create ( p: ppthread_t;attr : ppthread_attr_t;f:__startroutine_t;arg:pointer):cint;cdecl;external;
 function  pthread_create ( p: ppthread_t;attr : ppthread_attr_t;f:__startroutine_t;arg:pointer):cint;cdecl;external;
 procedure pthread_exit  ( p: pointer); cdecl;external;
 procedure pthread_exit  ( p: pointer); cdecl;external;

+ 2 - 0
rtl/linux/pthread.inc

@@ -203,6 +203,7 @@ Var
     pthread_attr_getscope : Function(__attr:ppthread_attr_t; __scope:plongint):longint;cdecl;
     pthread_attr_getscope : Function(__attr:ppthread_attr_t; __scope:plongint):longint;cdecl;
     pthread_setschedparam : Function(__target_thread:pthread_t; __policy:longint; __param:psched_param):longint;cdecl;
     pthread_setschedparam : Function(__target_thread:pthread_t; __policy:longint; __param:psched_param):longint;cdecl;
     pthread_getschedparam : Function(__target_thread:pthread_t; __policy:plongint; __param:psched_param):longint;cdecl;
     pthread_getschedparam : Function(__target_thread:pthread_t; __policy:plongint; __param:psched_param):longint;cdecl;
+    pthread_attr_setstacksize : Function(p: ppthread_attr_t;s:size_t):cint;cdecl;
     pthread_mutex_init : Function(__mutex:ppthread_mutex_t; __mutex_attr:ppthread_mutexattr_t):longint;cdecl;
     pthread_mutex_init : Function(__mutex:ppthread_mutex_t; __mutex_attr:ppthread_mutexattr_t):longint;cdecl;
     pthread_mutex_destroy : Function(__mutex:ppthread_mutex_t):longint;cdecl;
     pthread_mutex_destroy : Function(__mutex:ppthread_mutex_t):longint;cdecl;
     pthread_mutex_trylock : Function(__mutex:ppthread_mutex_t):longint;cdecl;
     pthread_mutex_trylock : Function(__mutex:ppthread_mutex_t):longint;cdecl;
@@ -279,6 +280,7 @@ begin
   Pointer(pthread_attr_getinheritsched) := dlsym(PthreadDLL,'pthread_attr_getinheritsched');
   Pointer(pthread_attr_getinheritsched) := dlsym(PthreadDLL,'pthread_attr_getinheritsched');
   Pointer(pthread_attr_setscope) := dlsym(PthreadDLL,'pthread_attr_setscope');
   Pointer(pthread_attr_setscope) := dlsym(PthreadDLL,'pthread_attr_setscope');
   Pointer(pthread_attr_getscope) := dlsym(PthreadDLL,'pthread_attr_getscope');
   Pointer(pthread_attr_getscope) := dlsym(PthreadDLL,'pthread_attr_getscope');
+  Pointer(pthread_attr_setstacksize) := dlsym(PthreadDLL,'pthread_attr_setstacksize');
   Pointer(pthread_setschedparam) := dlsym(PthreadDLL,'pthread_setschedparam');
   Pointer(pthread_setschedparam) := dlsym(PthreadDLL,'pthread_setschedparam');
   Pointer(pthread_getschedparam) := dlsym(PthreadDLL,'pthread_getschedparam');
   Pointer(pthread_getschedparam) := dlsym(PthreadDLL,'pthread_getschedparam');
   Pointer(pthread_mutex_init) := dlsym(PthreadDLL,'pthread_mutex_init');
   Pointer(pthread_mutex_init) := dlsym(PthreadDLL,'pthread_mutex_init');

+ 1 - 0
rtl/solaris/pthread.inc

@@ -84,6 +84,7 @@ function  pthread_attr_init           (p : ppthread_key_t):cint; cdecl; external
 function  pthread_attr_setinheritsched(p : ppthread_attr_t;i:cint):cint; cdecl; external 'c';
 function  pthread_attr_setinheritsched(p : ppthread_attr_t;i:cint):cint; cdecl; external 'c';
 function  pthread_attr_setscope      (p : ppthread_attr_t;i:cint):cint;cdecl;external 'c';
 function  pthread_attr_setscope      (p : ppthread_attr_t;i:cint):cint;cdecl;external 'c';
 function  pthread_attr_setdetachstate (p : ppthread_attr_t;i:cint):cint;cdecl;external 'c';
 function  pthread_attr_setdetachstate (p : ppthread_attr_t;i:cint):cint;cdecl;external 'c';
+function  pthread_attr_setstacksize(p: ppthread_attr_t; stacksize: size_t):cint;cdecl;external 'c';
 function  pthread_create ( p: ppthread_t;attr : ppthread_attr_t;f:__startroutine_t;arg:pointer):cint;cdecl;external 'c';
 function  pthread_create ( p: ppthread_t;attr : ppthread_attr_t;f:__startroutine_t;arg:pointer):cint;cdecl;external 'c';
 procedure pthread_exit  ( p: pointer); cdecl;external 'c';
 procedure pthread_exit  ( p: pointer); cdecl;external 'c';
 function  pthread_self:pthread_t; cdecl;external 'c';
 function  pthread_self:pthread_t; cdecl;external 'c';

+ 5 - 1
rtl/unix/cthreads.pp

@@ -286,7 +286,11 @@ Type  PINTRTLEvent = ^TINTRTLEvent;
       // don't create detached, we need to be able to join (waitfor) on
       // don't create detached, we need to be able to join (waitfor) on
       // the newly created thread!
       // the newly created thread!
       //pthread_attr_setdetachstate(@thread_attr, PTHREAD_CREATE_DETACHED);
       //pthread_attr_setdetachstate(@thread_attr, PTHREAD_CREATE_DETACHED);
-      if pthread_create(ppthread_t(@threadid), @thread_attr, @ThreadMain,ti) <> 0 then
+
+      // set the stack size
+      if (pthread_attr_setstacksize(@thread_attr, stacksize)<>0) or
+         // and create the thread
+         (pthread_create(ppthread_t(@threadid), @thread_attr, @ThreadMain,ti) <> 0) then
         begin
         begin
           dispose(ti);
           dispose(ti);
           threadid := TThreadID(0);
           threadid := TThreadID(0);

+ 32 - 0
tests/webtbs/tw12942.pp

@@ -0,0 +1,32 @@
+{ %skiptarget=go32v2 }
+
+{$mode objfpc}
+{$s+}
+
+uses
+{$ifdef unix}
+  cthreads,
+{$endif}
+  classes;
+
+type
+  tmythread = class(tthread)
+    procedure execute; override;
+  end;
+
+procedure tmythread.execute;
+var
+  a: array[0..1024*1024-1] of byte;
+begin
+  fillchar(a,sizeof(a),123);
+end;
+
+var
+  t: tmythread;
+begin
+  t:=tmythread.create(false,1024*1024+128*1024);
+  t.waitfor;
+  if assigned(t.fatalexception) then
+    halt(1);
+  t.free;
+end.