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)16 process (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)28 main (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