Only support ifunc in nptl/pt-vfork.c
[platform/upstream/linaro-glibc.git] / nptl / tst-basic7.c
1 #include <errno.h>
2 #include <pthread.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <unistd.h>
7 #include <sys/mman.h>
8 #include <sys/resource.h>
9
10 static void use_stack (size_t needed);
11
12 void (*use_stack_ptr) (size_t) = use_stack;
13
14 static void
15 use_stack (size_t needed)
16 {
17   size_t sz = sysconf (_SC_PAGESIZE);
18   char *buf = alloca (sz);
19   memset (buf, '\0', sz);
20
21   if (needed > sz)
22     use_stack_ptr (needed  - sz);
23 }
24
25 static void
26 use_up_memory (void)
27 {
28   struct rlimit rl;
29   getrlimit (RLIMIT_AS, &rl);
30   rl.rlim_cur = 10 * 1024 * 1024;
31   setrlimit (RLIMIT_AS, &rl);
32
33   char *c;
34   int PAGESIZE = getpagesize ();
35   while (1)
36     {
37       c = mmap (NULL, PAGESIZE, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0);
38       if (c == MAP_FAILED)
39         break;
40     }
41 }
42
43 static void *
44 child (void *arg)
45 {
46   sleep (1);
47   return arg;
48 }
49
50 static int
51 do_test (void)
52 {
53   int err;
54   pthread_t tid;
55
56   /* Allocate the memory needed for the stack.  */
57   use_stack_ptr (PTHREAD_STACK_MIN);
58
59   use_up_memory ();
60
61   err = pthread_create (&tid, NULL, child, NULL);
62   if (err != 0)
63     {
64       printf ("pthread_create returns %d: %s\n", err,
65               err == EAGAIN ? "OK" : "FAIL");
66       return err != EAGAIN;
67     }
68
69   /* We did not fail to allocate memory despite the preparation.  Oh well.  */
70   return 0;
71 }
72
73 #define TEST_FUNCTION do_test ()
74 #include "../test-skeleton.c"