ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/Makefile.PL
(Generate patch)

Comparing Coro/Coro/Makefile.PL (file contents):
Revision 1.11 by root, Thu Aug 16 22:09:12 2001 UTC vs.
Revision 1.57 by root, Fri May 30 21:34:52 2008 UTC

1use 5.005;
2
3use strict;
1use ExtUtils::MakeMaker; 4use ExtUtils::MakeMaker;
2
3use 5.005;
4
5use Config; 5use Config;
6 6
7$|=1; 7$|=1;
8 8
9$DEFINE = ""; 9my $DEFINE;
10my @LIBS = [];
11
12# check for completely broken platforms (such as netbsd)
13if ($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
33EOF
34
35 print "prompt> "; <STDIN> =~ /^yes/ or exit 1;
36}
37
38print <<EOF;
39
40*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
41
42Coro has a number of configuration options. Due to its maturity, the
43defaults that Coro chooses are usually fine, so you can decide to skip
44these questions. Only if something went wrong you should select 'n'
45here and manually configure Coro, and, of course, report this to the
46maintainer :)
47
48EOF
49
50if (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
13if ($^O =~ /windows/) { 57my $iface;
14 $DEFINE = " -DCORO_LOOSE"; 58
59if (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
25print <<EOF; 94print <<EOF;
26 95
27Version 0.12 introduced experimental C context sharing. This makes it 96*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
28possible to share the C stack and context between many coroutines,
29resulting in memory savings and slight speed gains, at the cost of
30potential segfaults (especially with exception handling). On my Linux/x86
31machine this decreased the size of a new coroutine from 9k to 5k, the
32savings are much more apparent on machines without mmap or good memory
33management. This algorithm relies on the non-fact that the same machine
34stack pointer indicates the same function call nesting level, which
35usually works good enough but might fail...
36 97
37The default (disabled) is safe, as it only increases memory consumption. 98Coro can use a number of methods to implement coroutines at the C
99level. The default chosen is based on your current confguration and is
100correct in most cases, but you still can chose between these alternatives:
38 101
39EOF
40
41print "Do you want to enable experimental context sharing (y/n) [n]? ";
42
43if (<> =~ /^\s*y/i) {
44 print "\nExperimental context sharing enabled.\n\n";
45 $DEFINE .= " -DCORO_LAZY_STACK";
46}
47
48if ($iface) {
49 print <<EOF;
50
51Coro has the option of using two different ways to implement coroutines
52at the C level:
53
54u The unix ucontext functions are newer and not implemented in older 102u 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
59s If the ucontext functions are not working or you don't want 108s 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
66l Older GNU/Linux systems (glibc-2.1 and below) need this hack. Since it is 118a 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
128l 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
134i 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
138w 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
143p 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
147For most systems, the default chosen should be OK. If you experience
148problems then you should experiment with this setting and/or turn
149optimisations on or off (make OPTIMIZE=-O0).
69 150
70EOF 151EOF
71 152
72retry: 153retry:
73 print "Use which implementation (s, u, l) [$iface]? "; 154
74 my $r = <>; 155my $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") { 160if ($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
189print <<EOF;
190
191*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
192
193Per-context stack size factor: Depending on your settings, Coro tries to
194share the C stack as much as possible, but sometimes it needs to allocate
195a new one. This setting controls the maximum size that gets allocated,
196and should not be set too high, as memory and address space still is
197wasted even if it's not fully used. The value entered will be multiplied
198by sizeof(long), which is usually 4 on 32-bit systems, and 8 on 64-bit
199systems.
200
201A setting of 16384 (the default) therefore corresponds to a 64k..128k
202stack, which usually is ample space (you might even want to try 8192 or
203lower if your program creates many coroutines).
204
205On systems supporting mmap and dynamic memory management, the actual
206memory usually gets allocated on demand, but with many large stacks you
207can still run out of address space on your typical 32 bit platform.
208
209Some perls (mostly threaded ones and perl compiled under linux 2.6) and
210some programs (inefficient regexes can use a lot of stack space) may
211need much, much more: If Coro segfaults with weird backtraces (e.g. in a
212function prologue) or in t/10_bugs.t, you might want to increase this to
21365536 or more.
214
215The default should be fine, and can be changed at runtime with
216Coro::State::cctx_stacksize.
217
218EOF
219
220my $stacksize = prompt ("C stack size factor?", "16384");
221$DEFINE .= " -DCORO_STACKSIZE=$stacksize";
222
223print "using a stacksize of $stacksize * sizeof(long)\n";
224
225print <<EOF;
226
227*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
228
229Coro can optionally put a guard area before each stack segment. When the
230stack is too small and the access is not too far outside the stack (i.e.
231within the guard area), then the program will safely segfault instead of
232running into other data. The cost is some additional overhead with is
233usually negligible, and extra use of address space.
234
235The guard area size currently needs to be specified in pages (typical
236pagesizes are 4k and 8k). The guard area is only enabled on a few
237hardcoded architectures and is ignored on others. The actual preprocessor
238expression disables this feature if:
239
240 !__i386 && !__x86_64 && !__powerpc && !__m68k \
241 && !__alpha && !__mips && !__sparc64
242
243The default, as usual, should be just fine.
244
245EOF
246
247my $stackguard = prompt ("Number of guard pages (0 disables)?", "4");
248$DEFINE .= " -DCORO_STACKGUARD=$stackguard";
249
250print <<EOF;
251
252*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
253
254Coro can tell valgrind about its stacks and so reduce spurious warnings
255where valgrind would otherwise complain about possible stack switches.
256
257Enabling this does not incur visible runtime or memory overhead, but it
258requires that you have the <valgrind/valgrind.h> header file available.
259
260Valgrind support is completely optional, so the default of disabling it is
261the safe choice.
262
263EOF
264
265my $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
270print <<EOF;
271
272*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
273
274Coro can use (or even trick) some perl functions into doing what it needs
275instead of relying on (some) of its own functions. This might increase
276chances that it compiles and works, but it could just as well result in
277memory leaks, crashes or silent data corruption. It certainly does result
278in slightly slower speed and higher memory consumption, though, so YOU
279SHOULD ENABLE IT ONLY AS A LAST RESORT.
280
281EOF
282
283my $use_internals = prompt ("Prefer perl functions over coro functions (y/n)?", "n");
284$DEFINE .= " -DCORO_PREFER_PERL_FUNCTIONS=1" if $use_internals =~ /[yY]/;
285
286print <<EOF;
287
288*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
289
290EOF
93 291
94WriteMakefile( 292WriteMakefile(
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
300sub 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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines