Logo AND Algorithmique Numérique Distribuée

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