|
|
1 | use 5.005; |
|
|
2 | |
|
|
3 | use strict; |
1 | use ExtUtils::MakeMaker; |
4 | use ExtUtils::MakeMaker; |
2 | |
|
|
3 | use 5.005; |
|
|
4 | |
|
|
5 | use Config; |
5 | use Config; |
6 | |
6 | |
7 | $|=1; |
7 | $|=1; |
8 | |
8 | |
9 | $DEFINE = ""; |
9 | my $DEFINE; |
|
|
10 | my @LIBS = []; |
|
|
11 | |
|
|
12 | # check for completely broken platforms (such as netbsd) |
|
|
13 | if ($Config{usethreads} && $^O eq "netbsd") { |
|
|
14 | print <<EOF; |
|
|
15 | |
|
|
16 | *** |
|
|
17 | *** Your platform is BROKEN - netbsd pthreads are known to be completely broken. |
|
|
18 | *** There is *no* way to implement coroutines on this platform until the bugs |
|
|
19 | *** are fixed (this has been true for at least netbsd version 4.0). |
|
|
20 | *** |
|
|
21 | *** This affects many modules currently, so the recommended build option |
|
|
22 | *** for perl is to DISABLE THREAD support - it serves no practical purpose |
|
|
23 | *** on POSIX systems anyways, except that it slows down your programs a lot |
|
|
24 | *** and uses a lot more memory than fork (perl threads do not give you threads, |
|
|
25 | *** they are only windows-process emulation ported to unix). |
|
|
26 | *** |
|
|
27 | *** If you really want to try building Coro on your broken platform, enter |
|
|
28 | *** "yes" at the prompt - report back if the bugs is fixed please. (Oh, |
|
|
29 | *** and try out BDB or IO::AIO which suffer from other threading bugs on |
|
|
30 | *** netbsd that never seem to get fixed). |
|
|
31 | *** |
|
|
32 | |
|
|
33 | EOF |
|
|
34 | |
|
|
35 | print "prompt> "; <STDIN> =~ /^yes/ or exit 1; |
|
|
36 | } |
|
|
37 | |
|
|
38 | print <<EOF; |
|
|
39 | |
|
|
40 | *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** |
|
|
41 | |
|
|
42 | Coro has a number of configuration options. Due to its maturity, the |
|
|
43 | defaults that Coro chooses are usually fine, so you can decide to skip |
|
|
44 | these questions. Only if something went wrong you should select 'n' |
|
|
45 | here and manually configure Coro, and, of course, report this to the |
|
|
46 | maintainer :) |
|
|
47 | |
|
|
48 | EOF |
|
|
49 | |
|
|
50 | if (prompt ("Skip further questions and use defaults (y/n)?", "y") =~ /[yY]/) { |
|
|
51 | $ENV{PERL_MM_USE_DEFAULT} = 1; |
|
|
52 | } |
|
|
53 | |
10 | |
54 | |
11 | $DEFINE .= " -DHAVE_MMAP" if $Config{d_mmap} eq "define" && $Config{d_munmap} eq "define"; |
55 | $DEFINE .= " -DHAVE_MMAP" if $Config{d_mmap} eq "define" && $Config{d_munmap} eq "define"; |
12 | |
56 | |
13 | if ($^O =~ /windows/) { |
57 | my $iface; |
14 | $DEFINE = " -DCORO_LOOSE"; |
58 | |
|
|
59 | if (exists $ENV{CORO_INTERFACE}) { |
|
|
60 | $iface = $ENV{CORO_INTERFACE}; |
|
|
61 | |
|
|
62 | } elsif ($^O =~ /win32/i or $^O =~ /cygwin/ or $^O =~ /mswin/) { |
|
|
63 | $iface = 'w'; |
|
|
64 | |
|
|
65 | } elsif ($^O =~ /irix/) { |
|
|
66 | $iface = "i"; |
|
|
67 | |
15 | } elsif ($^O =~ /linux/) { |
68 | } elsif ($^O =~ /linux/) { |
|
|
69 | # default to assembly on x86 and x86_64, and setjmp on others |
|
|
70 | $iface = $Config{archname} =~ /^(i[3456]86|amd64|x86_64)-/ && $Config{optimize} =~ /-O/ ? "a" : "s"; |
|
|
71 | |
|
|
72 | } elsif ($^O =~ /(free|net|open)bsd/) { |
|
|
73 | # FreeBSD 4.x has ucontext.h but no makecontext et al. (see BUGS section of |
|
|
74 | # man context). Assume the same problem for all other BSDs. |
|
|
75 | |
|
|
76 | # netbsd is totally broken (pthreads are incomaptible with ucontext or other stack switchign mechanisms) |
|
|
77 | |
|
|
78 | # therefore, default to setjmp |
16 | $iface = "l"; |
79 | $iface = "s"; |
|
|
80 | |
17 | } elsif ($^O =~ /solaris/) { |
81 | } elsif ($^O =~ /solaris/) { |
18 | $iface = "s"; |
82 | $iface = "s"; |
|
|
83 | |
|
|
84 | } elsif ($^O =~ /darwin/) { |
|
|
85 | $iface = "s"; |
|
|
86 | |
19 | } elsif (-e "/usr/include/ucontext.h") { |
87 | } elsif (-e "/usr/include/ucontext.h") { # shame on this heuristic |
20 | $iface = "u"; |
88 | $iface = "u"; |
|
|
89 | |
21 | } else { |
90 | } else { |
22 | $iface = "s"; |
91 | $iface = "s"; |
23 | } |
92 | } |
24 | |
93 | |
25 | print <<EOF; |
94 | print <<EOF; |
26 | |
95 | |
27 | Version 0.12 introduced experimental C context sharing. This makes it |
96 | *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** |
28 | possible to share the C stack and context between many coroutines, |
|
|
29 | resulting in memory savings and slight speed gains, at the cost of |
|
|
30 | potential segfaults (especially with exception handling). On my Linux/x86 |
|
|
31 | machine this decreased the size of a new coroutine from 9k to 5k, the |
|
|
32 | savings are much more apparent on machines without mmap or good memory |
|
|
33 | management. This algorithm relies on the non-fact that the same machine |
|
|
34 | stack pointer indicates the same function call nesting level, which |
|
|
35 | usually works good enough but might fail... |
|
|
36 | |
97 | |
37 | The default (disabled) is safe, as it only increases memory consumption. |
98 | Coro can use a number of methods to implement coroutines at the C |
|
|
99 | level. The default chosen is based on your current confguration and is |
|
|
100 | correct in most cases, but you still can chose between these alternatives: |
38 | |
101 | |
39 | EOF |
|
|
40 | |
|
|
41 | print "Do you want to enable experimental context sharing (y/n) [n]? "; |
|
|
42 | |
|
|
43 | if (<> =~ /^\s*y/i) { |
|
|
44 | print "\nExperimental context sharing enabled.\n\n"; |
|
|
45 | $DEFINE .= " -DCORO_LAZY_STACK"; |
|
|
46 | } |
|
|
47 | |
|
|
48 | if ($iface) { |
|
|
49 | print <<EOF; |
|
|
50 | |
|
|
51 | Coro has the option of using two different ways to implement coroutines |
|
|
52 | at the C level: |
|
|
53 | |
|
|
54 | u The unix ucontext functions are newer and not implemented in older |
102 | u The unix 'ucontext.h' functions are relatively new and not implemented |
55 | unices (or broken libc's like glibc-2.2.2 and below). They allow very |
103 | or well-tested in older unices. They allow very fast coroutine creation |
56 | fast coroutine creation and fast switching, and, most importantly, are |
104 | and reasonably fast switching, and, most importantly, are very stable. |
57 | very stable. |
105 | It is, however, usually slower than the other alternatives due to an |
|
|
106 | extra syscall done by swapcontext. |
58 | |
107 | |
59 | s If the ucontext functions are not working or you don't want |
108 | s If the ucontext functions are not working or you don't want |
60 | to use them for other reasons you can try a workaround using |
109 | to use them for other reasons you can try a workaround using |
61 | setjmp/longjmp/sigaltstack (also standard unix functions). Coroutine |
110 | setjmp/longjmp/sigaltstack (also standard unix functions). Coroutine |
62 | creation is rather slow, but switching is very fast as well (often much |
111 | creation is rather slow, but switching is very fast (often much faster |
63 | faster than with the ucontext functions). Unfortunately, glibc-2.1 and |
112 | than with the ucontext functions). Unfortunately, glibc-2.1 and |
64 | below don't even feature a working sigaltstack. |
113 | below don't even feature a working sigaltstack. You cannot use this |
|
|
114 | implementation if some other code uses SIGUSR2 or you plan to |
|
|
115 | create coroutines from an alternative signal stack, as both are being |
|
|
116 | used for coroutine creation. |
65 | |
117 | |
66 | l Older GNU/Linux systems (glibc-2.1 and below) need this hack. Since it is |
118 | a Handcoded assembly. This is the fastest and most compatible method |
67 | very linux-specific it is also quite fast for newer versions; when it works, |
119 | with the least side effects, if it works, that is. It has been tested |
68 | that is... |
120 | on GNU/Linux x86 and x86_64 systems and should work on all x86/x86_64 |
|
|
121 | systems using the SVR ELF ABI (it is also reported to be working on |
|
|
122 | Strawberry Perl for Windows using MinGW). This is the recommended |
|
|
123 | method on supported platforms. Note that you usually have to compile |
|
|
124 | this module with optimisation enabled for this method to work, and |
|
|
125 | also more esoteric switches such as -fomit-leaf-frame-pointer might be |
|
|
126 | required. When i doubt, use another method, such as (s)etjmp/longjmp. |
|
|
127 | |
|
|
128 | l GNU/Linux. Very old GNU/Linux systems (glibc-2.1 and below) need |
|
|
129 | this hack. Since it is very linux-specific it is also quite fast and |
|
|
130 | recommended even for newer versions; when it works, that is (currently |
|
|
131 | x86 and a few others only. If it compiles, it's usually ok). Newer |
|
|
132 | glibc versions (>= 2.5) stop working with this implementation again. |
|
|
133 | |
|
|
134 | i IRIX. For some reason, SGI really does not like to follow the single |
|
|
135 | unix specification (does that surprise you?), so this workaround might |
|
|
136 | be needed (it's fast), although [s] and [u] should also work now. |
|
|
137 | |
|
|
138 | w Microsoft Windows. Try this on Microsoft Windows when using Cygwin or |
|
|
139 | the MSVC compilers (e.g. ActiveState Perl, but see "a" for Strawberry |
|
|
140 | Perl), although, as there is no standard on how to do this under |
|
|
141 | windows, different enviroments might work differently. Doh. |
|
|
142 | |
|
|
143 | p Use pthread API. Try to avoid this option, it was only created to make |
|
|
144 | a point about the programming language shootout and might leak threads. |
|
|
145 | It might work fine as a last resort, however. |
|
|
146 | |
|
|
147 | For most systems, the default chosen should be OK. If you experience |
|
|
148 | problems then you should experiment with this setting and/or turn |
|
|
149 | optimisations on or off (make OPTIMIZE=-O0). |
69 | |
150 | |
70 | EOF |
151 | EOF |
71 | |
152 | |
72 | retry: |
153 | retry: |
73 | print "Use which implementation (s, u, l) [$iface]? "; |
154 | |
74 | my $r = <>; |
155 | my $r = prompt "Use which implementation,\n" . |
|
|
156 | "<s>et/longjump, <u>context, <a>ssembly, <i>rix, <l>inux or <w>indows?", |
|
|
157 | $iface; |
75 | $iface = lc $1 if $r =~ /(\S)/; |
158 | $iface = lc $1 if $r =~ /(\S)/; |
76 | |
159 | |
77 | if ($iface eq "u") { |
160 | if ($iface eq "u") { |
78 | $DEFINE .= " -DCORO_UCONTEXT"; |
161 | $DEFINE .= " -DCORO_UCONTEXT"; |
79 | print "\nUsing ucontext implementation\n\n"; |
162 | print "\nUsing ucontext implementation\n\n"; |
|
|
163 | conftest("TEST_makecontext"); |
80 | } elsif ($iface eq "s") { |
164 | } elsif ($iface eq "s") { |
81 | $DEFINE .= " -DCORO_SJLJ"; |
165 | $DEFINE .= " -DCORO_SJLJ"; |
82 | print "\nUsing setjmp/longjmp/sigaltstack implementation\n\n"; |
166 | print "\nUsing setjmp/longjmp/sigaltstack implementation\n\n"; |
|
|
167 | conftest("TEST_sigaltstack"); |
83 | } elsif ($iface eq "l") { |
168 | } elsif ($iface eq "l") { |
84 | $DEFINE .= " -DCORO_LINUX"; |
169 | $DEFINE .= " -DCORO_LINUX"; |
85 | print "\nUsing linux-specific implementation\n\n"; |
170 | print "\nUsing linux-specific implementation\n\n"; |
86 | } else { |
171 | } elsif ($iface eq "i") { |
87 | print "\nUnknown implementation \"$iface\"\n"; |
172 | $DEFINE .= " -DCORO_IRIX"; |
88 | goto retry; |
173 | print "\nUsing irix-specific implementation\n\n"; |
89 | } |
174 | } elsif ($iface eq "w") { |
|
|
175 | $DEFINE .= " -DCORO_LOSER"; |
|
|
176 | print "\nUsing windows-specific implementation\n\n"; |
|
|
177 | } elsif ($iface eq "a") { |
|
|
178 | $DEFINE .= " -DCORO_ASM"; |
|
|
179 | print "\nUsing handcoded assembly implementation\n\n"; |
|
|
180 | } elsif ($iface eq "p") { |
|
|
181 | $DEFINE .= " -DCORO_PTHREAD"; |
|
|
182 | @LIBS = ["-lpthread"]; |
|
|
183 | print "\nUsing pthread implementation\n\n"; |
90 | } else { |
184 | } else { |
91 | print "\nUsing microsoft coroutine implementation\n\n"; |
185 | print "\nUnknown implementation \"$iface\"\n"; |
|
|
186 | goto retry; |
92 | } |
187 | } |
|
|
188 | |
|
|
189 | print <<EOF; |
|
|
190 | |
|
|
191 | *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** |
|
|
192 | |
|
|
193 | Per-context stack size factor: Depending on your settings, Coro tries to |
|
|
194 | share the C stack as much as possible, but sometimes it needs to allocate |
|
|
195 | a new one. This setting controls the maximum size that gets allocated, |
|
|
196 | and should not be set too high, as memory and address space still is |
|
|
197 | wasted even if it's not fully used. The value entered will be multiplied |
|
|
198 | by sizeof(long), which is usually 4 on 32-bit systems, and 8 on 64-bit |
|
|
199 | systems. |
|
|
200 | |
|
|
201 | A setting of 16384 (the default) therefore corresponds to a 64k..128k |
|
|
202 | stack, which usually is ample space (you might even want to try 8192 or |
|
|
203 | lower if your program creates many coroutines). |
|
|
204 | |
|
|
205 | On systems supporting mmap and dynamic memory management, the actual |
|
|
206 | memory usually gets allocated on demand, but with many large stacks you |
|
|
207 | can still run out of address space on your typical 32 bit platform. |
|
|
208 | |
|
|
209 | Some perls (mostly threaded ones and perl compiled under linux 2.6) and |
|
|
210 | some programs (inefficient regexes can use a lot of stack space) may |
|
|
211 | need much, much more: If Coro segfaults with weird backtraces (e.g. in a |
|
|
212 | function prologue) or in t/10_bugs.t, you might want to increase this to |
|
|
213 | 65536 or more. |
|
|
214 | |
|
|
215 | The default should be fine, and can be changed at runtime with |
|
|
216 | Coro::State::cctx_stacksize. |
|
|
217 | |
|
|
218 | EOF |
|
|
219 | |
|
|
220 | my $stacksize = prompt ("C stack size factor?", "16384"); |
|
|
221 | $DEFINE .= " -DCORO_STACKSIZE=$stacksize"; |
|
|
222 | |
|
|
223 | print "using a stacksize of $stacksize * sizeof(long)\n"; |
|
|
224 | |
|
|
225 | print <<EOF; |
|
|
226 | |
|
|
227 | *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** |
|
|
228 | |
|
|
229 | Coro can optionally put a guard area before each stack segment. When the |
|
|
230 | stack is too small and the access is not too far outside the stack (i.e. |
|
|
231 | within the guard area), then the program will safely segfault instead of |
|
|
232 | running into other data. The cost is some additional overhead with is |
|
|
233 | usually negligible, and extra use of address space. |
|
|
234 | |
|
|
235 | The guard area size currently needs to be specified in pages (typical |
|
|
236 | pagesizes are 4k and 8k). The guard area is only enabled on a few |
|
|
237 | hardcoded architectures and is ignored on others. The actual preprocessor |
|
|
238 | expression disables this feature if: |
|
|
239 | |
|
|
240 | !__i386 && !__x86_64 && !__powerpc && !__m68k \ |
|
|
241 | && !__alpha && !__mips && !__sparc64 |
|
|
242 | |
|
|
243 | The default, as usual, should be just fine. |
|
|
244 | |
|
|
245 | EOF |
|
|
246 | |
|
|
247 | my $stackguard = prompt ("Number of guard pages (0 disables)?", "4"); |
|
|
248 | $DEFINE .= " -DCORO_STACKGUARD=$stackguard"; |
|
|
249 | |
|
|
250 | print <<EOF; |
|
|
251 | |
|
|
252 | *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** |
|
|
253 | |
|
|
254 | Coro can tell valgrind about its stacks and so reduce spurious warnings |
|
|
255 | where valgrind would otherwise complain about possible stack switches. |
|
|
256 | |
|
|
257 | Enabling this does not incur visible runtime or memory overhead, but it |
|
|
258 | requires that you have the <valgrind/valgrind.h> header file available. |
|
|
259 | |
|
|
260 | Valgrind support is completely optional, so the default of disabling it is |
|
|
261 | the safe choice. |
|
|
262 | |
|
|
263 | EOF |
|
|
264 | |
|
|
265 | my $valgrind = prompt ("Enable valgrind support (y/n)?", |
|
|
266 | -r "/usr/include/valgrind/valgrind.h" ? "y" : "n"); |
|
|
267 | $DEFINE .= " -DCORO_USE_VALGRIND=1" if $valgrind =~ /[yY]/; |
|
|
268 | |
|
|
269 | |
|
|
270 | print <<EOF; |
|
|
271 | |
|
|
272 | *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** |
|
|
273 | |
|
|
274 | Coro can use (or even trick) some perl functions into doing what it needs |
|
|
275 | instead of relying on (some) of its own functions. This might increase |
|
|
276 | chances that it compiles and works, but it could just as well result in |
|
|
277 | memory leaks, crashes or silent data corruption. It certainly does result |
|
|
278 | in slightly slower speed and higher memory consumption, though, so YOU |
|
|
279 | SHOULD ENABLE IT ONLY AS A LAST RESORT. |
|
|
280 | |
|
|
281 | EOF |
|
|
282 | |
|
|
283 | my $use_internals = prompt ("Prefer perl functions over coro functions (y/n)?", "n"); |
|
|
284 | $DEFINE .= " -DCORO_PREFER_PERL_FUNCTIONS=1" if $use_internals =~ /[yY]/; |
|
|
285 | |
|
|
286 | print <<EOF; |
|
|
287 | |
|
|
288 | *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** |
|
|
289 | |
|
|
290 | EOF |
93 | |
291 | |
94 | WriteMakefile( |
292 | WriteMakefile( |
95 | NAME => "Coro::State", |
293 | NAME => "Coro::State", |
96 | VERSION_FROM => "State.pm", |
294 | VERSION_FROM => "State.pm", |
97 | DEFINE => $DEFINE, |
295 | DEFINE => $DEFINE, |
|
|
296 | LIBS => @LIBS, |
98 | DIR => [], |
297 | DIR => [], |
99 | PM => { |
|
|
100 | 'State.pm' => '$(INST_LIBDIR)/State.pm', |
|
|
101 | |
|
|
102 | 'MakeMaker.pm' => '$(INST_LIBDIR)/MakeMaker.pm', |
|
|
103 | 'CoroAPI.h' => '$(INST_LIBDIR)/CoroAPI.h', |
|
|
104 | |
|
|
105 | 'Cont.pm' => '$(INST_LIBDIR)/Cont.pm', |
|
|
106 | |
|
|
107 | 'Specific.pm' => '$(INST_LIBDIR)/Specific.pm', |
|
|
108 | |
|
|
109 | 'Signal.pm' => '$(INST_LIBDIR)/Signal.pm', |
|
|
110 | 'Channel.pm' => '$(INST_LIBDIR)/Channel.pm', |
|
|
111 | 'Semaphore.pm' => '$(INST_LIBDIR)/Semaphore.pm', |
|
|
112 | 'RWLock.pm' => '$(INST_LIBDIR)/RWLock.pm', |
|
|
113 | }, |
|
|
114 | ); |
298 | ); |
115 | |
299 | |
|
|
300 | sub conftest { |
|
|
301 | my $type = shift; |
116 | |
302 | |
|
|
303 | print "\nTrying to detect stack growth direction (for $type)\n"; |
|
|
304 | print "You might see some warnings, this should not concern you.\n\n"; |
|
|
305 | system "$Config{cc} $Config{ccflags} -D$type libcoro/conftest.c"; |
117 | |
306 | |
|
|
307 | my $res = qx<./a.out>; |
|
|
308 | $res =~ s/\s+$//; |
|
|
309 | my ($sp, $ss) = split /,/, $res; |
|
|
310 | |
|
|
311 | print "\n\n*****************************************************************************\n"; |
|
|
312 | print "If the testsuite fails PLEASE provide the following information\n"; |
|
|
313 | print "to Marc Lehmann <schmorp\@schmorp.de>: operating system name, version,\n"; |
|
|
314 | print "architecture name and this string '$sp|$ss'. Thanks a lot!\n";#d# |
|
|
315 | print "*****************************************************************************\n\n"; |
|
|
316 | |
|
|
317 | unlink "a.out"; |
|
|
318 | unlink "conftestval"; |
|
|
319 | } |
|
|
320 | |