Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
remove Args NO_POLICY_SCOPE for Mac compatibility
[simgrid.git] / buildtools / CPACK / prog_test / prog_stacksetup.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
5 #include <sys/types.h>
6 #include <signal.h>
7 #include <unistd.h>
8 #endif
9 #if defined(TEST_makecontext)
10 #include <ucontext.h>
11 #endif
12 union alltypes {
13     long   l;
14     double d;
15     void  *vp;
16     void (*fp)(void);
17     char  *cp;
18 };
19 static volatile char *handler_addr = (char *)0xDEAD;
20 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
21 static volatile int handler_done = 0;
22 void handler(int sig)
23 {
24     char garbage[1024];
25     int i;
26     auto int dummy;
27     for (i = 0; i < 1024; i++)
28         garbage[i] = 'X';
29     handler_addr = (char *)&dummy;
30     handler_done = 1;
31     return;
32 }
33 #endif
34 #if defined(TEST_makecontext)
35 static ucontext_t uc_handler;
36 static ucontext_t uc_main;
37 void handler(void)
38 {
39     char garbage[1024];
40     int i;
41     auto int dummy;
42     for (i = 0; i < 1024; i++)
43         garbage[i] = 'X';
44     handler_addr = (char *)&dummy;
45     swapcontext(&uc_handler, &uc_main);
46     return;
47 }
48 #endif
49 int main(int argc, char *argv[])
50 {
51     FILE *f;
52     char *skaddr;
53     char *skbuf;
54     int sksize;
55     char result[1024];
56     int i;
57     sksize = 32768;
58     skbuf = (char *)malloc(sksize*2+2*sizeof(union alltypes));
59     if (skbuf == NULL)
60         exit(1);
61     for (i = 0; i < sksize*2+2*sizeof(union alltypes); i++)
62         skbuf[i] = 'A';
63     skaddr = skbuf+sizeof(union alltypes);
64 #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
65     {
66         struct sigaction sa;
67 #if defined(TEST_sigstack)
68         struct sigstack ss;
69 #elif defined(TEST_sigaltstack) && defined(HAVE_STACK_T)
70         stack_t ss;
71 #else
72         struct sigaltstack ss;
73 #endif
74 #if defined(TEST_sigstack)
75         ss.ss_sp      = (void *)(skaddr + sksize);
76         ss.ss_onstack = 0;
77         if (sigstack(&ss, NULL) < 0)
78             exit(1);
79 #elif defined(TEST_sigaltstack)
80         ss.ss_sp    = (void *)(skaddr + sksize);
81         ss.ss_size  = sksize;
82         ss.ss_flags = 0;
83         if (sigaltstack(&ss, NULL) < 0)
84             exit(1);
85 #endif
86         memset((void *)&sa, 0, sizeof(struct sigaction));
87         sa.sa_handler = handler;
88         sa.sa_flags = SA_ONSTACK;
89         sigemptyset(&sa.sa_mask);
90         sigaction(SIGUSR1, &sa, NULL);
91         kill(getpid(), SIGUSR1);
92         while (!handler_done)
93             /*nop*/;
94     }
95 #endif
96 #if defined(TEST_makecontext)
97     {
98         if (getcontext(&uc_handler) != 0)
99             exit(1);
100         uc_handler.uc_link = NULL;
101         uc_handler.uc_stack.ss_sp    = (void *)(skaddr + sksize);
102         uc_handler.uc_stack.ss_size  = sksize;
103         uc_handler.uc_stack.ss_flags = 0;
104         makecontext(&uc_handler, handler, 0);
105         swapcontext(&uc_main, &uc_handler);
106     }
107 #endif
108     if (handler_addr == (char *)0xDEAD)
109         exit(1);
110     if (handler_addr < skaddr+sksize) {
111         /* stack was placed into lower area */
112         if (*(skaddr+sksize) != 'A')
113              sprintf(result, "(skaddr)+(sksize)-%d,(sksize)-%d",
114                      sizeof(union alltypes), sizeof(union alltypes));
115         else
116              strcpy(result, "(skaddr)+(sksize),(sksize)");
117     }
118     else {
119         /* stack was placed into higher area */
120         if (*(skaddr+sksize*2) != 'A')
121             sprintf(result, "(skaddr),(sksize)-%d", sizeof(union alltypes));
122         else
123             strcpy(result, "(skaddr),(sksize)");
124     }
125     if ((f = fopen("conftestval", "w")) == NULL)
126         exit(1);
127     fprintf(f, "%s\n", result);
128     fclose(f);
129     exit(0);
130 }