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 15 int process(void * arg)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 27 int main(void)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