1/* Check that TRT happens when we reach the #threads implementation limit. 2#notarget: cris*-*-elf 3*/ 4 5#include <stddef.h> 6#include <stdlib.h> 7#include <stdio.h> 8#include <limits.h> 9#include <unistd.h> 10#include <sched.h> 11#include <errno.h> 12#include <sys/types.h> 13#include <sys/wait.h> 14 15int 16process (void *arg) 17{ 18 int i; 19 20 for (i = 0; i < 500; i++) 21 if (sched_yield ()) 22 abort (); 23 24 return 0; 25} 26 27int 28main (void) 29{ 30 int pid; 31 int i; 32 int stacksize = 16384; 33 34 for (i = 0; i < 1000; i++) 35 { 36 char *stack = malloc (stacksize); 37 if (stack == NULL) 38 abort (); 39 40 pid = clone (process, (char *) stack + stacksize - 64, 41 (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND) 42 | SIGCHLD, "ab"); 43 if (pid <= 0) 44 { 45 /* FIXME: Read sysconf instead of magic number. */ 46 if (i < 60) 47 { 48 fprintf (stderr, "Bad clone %d\n", pid); 49 abort (); 50 } 51 52 if (errno == EAGAIN) 53 { 54 printf ("pass\n"); 55 exit (0); 56 } 57 } 58 } 59 60 abort (); 61} 62