Logo AND Algorithmique Numérique Distribuée

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