ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libcoro/conftest.c
Revision: 1.2
Committed: Thu Mar 3 17:20:31 2005 UTC (19 years, 3 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_5, rel-4_91, rel-4_22, rel-4_21, rel-4_0, rel-4_3, rel-3_41, rel-5_151, rel-4_13, rel-4_11, rel-5_1, rel-5_0, rel-6_0, rel-6_5, rel-4_748, rel-3_55, rel-4_8, rel-4_9, rel-3_51, rel-4_741, rel-4_743, rel-4_742, rel-6_10, rel-4_744, rel-4_747, rel-6_13, rel-4_01, rel-4_03, rel-4_02, rel-2_0, rel-2_1, rel-1_9, rel-1_2, rel-3_6, rel-3_62, rel-3_63, rel-3_61, rel-1_5, rel-1_4, rel-1_7, rel-1_6, rel-3_4, rel-6_09, rel-6_08, rel-6_07, rel-6_06, rel-6_05, rel-6_04, rel-6_03, rel-6_02, rel-6_01, rel-5_161, rel-3_1, rel-4_74, rel-4_71, rel-4_72, rel-4_73, rel-5_371, rel-5_372, rel-6_512, rel-6_513, rel-6_511, rel-6_514, rel-5_22, rel-5_23, rel-5_24, rel-5_25, rel-6_32, rel-6_33, rel-6_31, rel-6_36, rel-6_37, rel-5_162, rel-5_2, rel-6_38, rel-6_39, rel-4_802, rel-4_803, rel-3_5, rel-4_801, rel-3_3, rel-3_2, rel-4_804, rel-3_0, rel-5_37, rel-5_36, rel-4_479, rel-6_23, rel-3_01, rel-6_29, rel-6_28, rel-6_46, rel-4_50, rel-4_51, rel-6_45, rel-4_4, rel-3_11, rel-1_31, rel-4_45, rel-6_51, rel-6_52, rel-6_53, rel-6_54, rel-6_55, rel-6_56, rel-6_57, rel-4_745, rel-4_901, rel-4_49, rel-4_48, rel-4_1, rel-4_2, rel-4_746, rel-5_11, rel-5_12, rel-5_15, rel-5_14, rel-5_17, rel-5_16, stack_sharing, rel-4_47, rel-4_46, rel-4_7, rel-3_501, rel-6_43, rel-6_42, rel-6_41, rel-6_47, rel-5_132, rel-5_131, rel-6_44, rel-6_49, rel-6_48, rel-4_911, rel-4_912, rel-4_31, rel-4_32, rel-4_33, rel-4_34, rel-4_35, rel-4_36, rel-4_37, HEAD
Changes since 1.1: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 /*
2     * This file was taken from pth-1.40/aclocal.m4
3     * The original copyright is below.
4     *
5     * GNU Pth - The GNU Portable Threads
6     * Copyright (c) 1999-2001 Ralf S. Engelschall <rse@engelschall.com>
7     *
8     * This file is part of GNU Pth, a non-preemptive thread scheduling
9     * library which can be found at http://www.gnu.org/software/pth/.
10     *
11     * This file is free software; you can redistribute it and/or
12     * modify it under the terms of the GNU Lesser General Public
13     * License as published by the Free Software Foundation; either
14     * version 2.1 of the License, or (at your option) any later version.
15     *
16     * This file is distributed in the hope that it will be useful,
17     * but WITHOUT ANY WARRANTY; without even the implied warranty of
18     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19     * Lesser General Public License for more details.
20     *
21     * You should have received a copy of the GNU Lesser General Public
22     * License along with this file; if not, write to the Free Software
23     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
24 root 1.2 * USA, or contact Marc Lehmann <schmorp@schmorp.de>.
25 root 1.1 */
26    
27     #include <stdio.h>
28     #include <stdlib.h>
29     #include <string.h>
30     #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
31     #include <sys/types.h>
32     #include <signal.h>
33     #include <unistd.h>
34     #endif
35     #if defined(TEST_makecontext)
36     #include <ucontext.h>
37     #endif
38     union alltypes {
39     long l;
40     double d;
41     void *vp;
42     void (*fp)(void);
43     char *cp;
44     };
45     static volatile char *handler_addr = (char *)0xDEAD;
46     #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
47     static volatile int handler_done = 0;
48     void handler(int sig)
49     {
50     char garbage[1024];
51     int i;
52     auto int dummy;
53     for (i = 0; i < 1024; i++)
54     garbage[i] = 'X';
55     handler_addr = (char *)&dummy;
56     handler_done = 1;
57     return;
58     }
59     #endif
60     #if defined(TEST_makecontext)
61     static ucontext_t uc_handler;
62     static ucontext_t uc_main;
63     void handler(void)
64     {
65     char garbage[1024];
66     int i;
67     auto int dummy;
68     for (i = 0; i < 1024; i++)
69     garbage[i] = 'X';
70     handler_addr = (char *)&dummy;
71     swapcontext(&uc_handler, &uc_main);
72     return;
73     }
74     #endif
75     int main(int argc, char *argv[])
76     {
77     FILE *f;
78     char *skaddr;
79     char *skbuf;
80     int sksize;
81     char result[1024];
82     int i;
83     sksize = 32768;
84     skbuf = (char *)malloc(sksize*2+2*sizeof(union alltypes));
85     if (skbuf == NULL)
86     exit(1);
87     for (i = 0; i < sksize*2+2*sizeof(union alltypes); i++)
88     skbuf[i] = 'A';
89     skaddr = skbuf+sizeof(union alltypes);
90     #if defined(TEST_sigstack) || defined(TEST_sigaltstack)
91     {
92     struct sigaction sa;
93     #if defined(TEST_sigstack)
94     struct sigstack ss;
95     #elif defined(TEST_sigaltstack) && defined(HAVE_STACK_T)
96     stack_t ss;
97     #else
98     struct sigaltstack ss;
99     #endif
100     #if defined(TEST_sigstack)
101     ss.ss_sp = (void *)(skaddr + sksize);
102     ss.ss_onstack = 0;
103     if (sigstack(&ss, NULL) < 0)
104     exit(1);
105     #elif defined(TEST_sigaltstack)
106     ss.ss_sp = (void *)(skaddr + sksize);
107     ss.ss_size = sksize;
108     ss.ss_flags = 0;
109     if (sigaltstack(&ss, NULL) < 0)
110     exit(1);
111     #endif
112     memset((void *)&sa, 0, sizeof(struct sigaction));
113     sa.sa_handler = handler;
114     sa.sa_flags = SA_ONSTACK;
115     sigemptyset(&sa.sa_mask);
116     sigaction(SIGUSR1, &sa, NULL);
117     kill(getpid(), SIGUSR1);
118     while (!handler_done)
119     /*nop*/;
120     }
121     #endif
122     #if defined(TEST_makecontext)
123     {
124     if (getcontext(&uc_handler) != 0)
125     exit(1);
126     uc_handler.uc_link = NULL;
127     uc_handler.uc_stack.ss_sp = (void *)(skaddr + sksize);
128     uc_handler.uc_stack.ss_size = sksize;
129     uc_handler.uc_stack.ss_flags = 0;
130     makecontext(&uc_handler, handler, 1);
131     swapcontext(&uc_main, &uc_handler);
132     }
133     #endif
134     if (handler_addr == (char *)0xDEAD)
135     exit(1);
136     if (handler_addr < skaddr+sksize) {
137     /* stack was placed into lower area */
138     if (*(skaddr+sksize) != 'A')
139     sprintf(result, "(skaddr)+(sksize)-%d,(sksize)-%d",
140     sizeof(union alltypes), sizeof(union alltypes));
141     else
142     strcpy(result, "(skaddr)+(sksize),(sksize)");
143     }
144     else {
145     /* stack was placed into higher area */
146     if (*(skaddr+sksize*2) != 'A')
147     sprintf(result, "(skaddr),(sksize)-%d", sizeof(union alltypes));
148     else
149     strcpy(result, "(skaddr),(sksize)");
150     }
151     printf("%s\n", result);
152     exit(0);
153     }
154