Logo AND Algorithmique Numérique Distribuée

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