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.15 by root, Sun Sep 16 01:34:36 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 =~ /win32/i) { 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
15} elsif ($^O =~ /irix/) { 65} elsif ($^O =~ /irix/) {
16 $iface = "i"; 66 $iface = "i";
67
17} 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
18 $iface = "l"; 79 $iface = "s";
80
19} elsif ($^O =~ /solaris/) { 81} elsif ($^O =~ /solaris/) {
20 $iface = "s"; 82 $iface = "s";
83
84} elsif ($^O =~ /darwin/) {
85 $iface = "s";
86
21} elsif (-e "/usr/include/ucontext.h") { 87} elsif (-e "/usr/include/ucontext.h") { # shame on this heuristic
22 $iface = "u"; 88 $iface = "u";
89
23} else { 90} else {
24 $iface = "s"; 91 $iface = "s";
25} 92}
26 93
27print <<EOF; 94print <<EOF;
28 95
29Version 0.12 introduced experimental C context sharing. This makes it 96*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
30possible to share the C stack and context between many coroutines,
31resulting in memory savings and slight speed gains, at the cost of
32potential segfaults (especially with exception handling). On my Linux/x86
33machine this decreased the size of a new coroutine from 9k to 5k, the
34savings are much more apparent on machines without mmap or good memory
35management. This algorithm relies on the non-fact that the same machine
36stack pointer indicates the same function call nesting level, which
37usually works good enough but might fail...
38 97
39The 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:
40 101
41EOF
42
43print "Do you want to enable experimental context sharing (y/n) [n]? ";
44
45if (<> =~ /^\s*y/i) {
46 print "\nExperimental context sharing enabled.\n\n";
47 $DEFINE .= " -DCORO_LAZY_STACK";
48}
49
50if ($iface) {
51 print <<EOF;
52
53Coro has the option of using two different ways to implement coroutines
54at the C level:
55
56u The unix ucontext functions are newer and not implemented in older 102u The unix 'ucontext.h' functions are relatively new and not implemented
57 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
58 fast coroutine creation and fast switching, and, most importantly, are 104 and reasonably fast switching, and, most importantly, are very stable.
59 very stable. 105 It is, however, usually slower than the other alternatives due to an
106 extra syscall done by swapcontext.
60 107
61s 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
62 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
63 setjmp/longjmp/sigaltstack (also standard unix functions). Coroutine 110 setjmp/longjmp/sigaltstack (also standard unix functions). Coroutine
64 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
65 faster than with the ucontext functions). Unfortunately, glibc-2.1 and 112 than with the ucontext functions). Unfortunately, glibc-2.1 and
66 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.
67 117
68l 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
69 very linux-specific it is also quite fast for newer versions; when it 119 with the least side effects, if it works, that is. It has been tested
70 works, 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.
71 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
72i IRIX. For some reason, SGI really does not like to follow the unix 134i IRIX. For some reason, SGI really does not like to follow the single
73 standard (does that surprise you?), so this techniquee should be fast 135 unix specification (does that surprise you?), so this workaround might
74 and safe (althogh s and u should also work now). 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).
75 150
76EOF 151EOF
77 152
78retry: 153retry:
154
79 print "Use which implementation,\n", 155my $r = prompt "Use which implementation,\n" .
80 "<s>etjmp/longjump, <u>context, <i>rix or <l>inux [$iface]? "; 156 "<s>et/longjump, <u>context, <a>ssembly, <i>rix, <l>inux or <w>indows?",
81 157 $iface;
82 my $r = <>;
83 $iface = lc $1 if $r =~ /(\S)/; 158$iface = lc $1 if $r =~ /(\S)/;
84 159
85 if ($iface eq "u") { 160if ($iface eq "u") {
86 $DEFINE .= " -DCORO_UCONTEXT"; 161 $DEFINE .= " -DCORO_UCONTEXT";
87 print "\nUsing ucontext implementation\n\n"; 162 print "\nUsing ucontext implementation\n\n";
88 conftest("TEST_makecontext"); 163 conftest("TEST_makecontext");
89 } elsif ($iface eq "s") { 164} elsif ($iface eq "s") {
90 $DEFINE .= " -DCORO_SJLJ"; 165 $DEFINE .= " -DCORO_SJLJ";
91 print "\nUsing setjmp/longjmp/sigaltstack implementation\n\n"; 166 print "\nUsing setjmp/longjmp/sigaltstack implementation\n\n";
92 conftest("TEST_sigaltstack"); 167 conftest("TEST_sigaltstack");
93 } elsif ($iface eq "l") { 168} elsif ($iface eq "l") {
94 $DEFINE .= " -DCORO_LINUX"; 169 $DEFINE .= " -DCORO_LINUX";
95 print "\nUsing linux-specific implementation\n\n"; 170 print "\nUsing linux-specific implementation\n\n";
96 } elsif ($iface eq "i") { 171} elsif ($iface eq "i") {
97 $DEFINE .= " -DCORO_IRIX"; 172 $DEFINE .= " -DCORO_IRIX";
98 print "\nUsing irix-specific implementation\n\n"; 173 print "\nUsing irix-specific implementation\n\n";
99 } else { 174} elsif ($iface eq "w") {
100 print "\nUnknown implementation \"$iface\"\n"; 175 $DEFINE .= " -DCORO_LOSER";
101 goto retry; 176 print "\nUsing windows-specific implementation\n\n";
102 } 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";
103} else { 184} else {
104 print "\nUsing microsoft coroutine implementation\n\n"; 185 print "\nUnknown implementation \"$iface\"\n";
186 goto retry;
105} 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
106 291
107WriteMakefile( 292WriteMakefile(
108 NAME => "Coro::State", 293 NAME => "Coro::State",
109 VERSION_FROM => "State.pm", 294 VERSION_FROM => "State.pm",
110 DEFINE => $DEFINE, 295 DEFINE => $DEFINE,
296 LIBS => @LIBS,
111 DIR => [], 297 DIR => [],
112 PM => {
113 'State.pm' => '$(INST_LIBDIR)/State.pm',
114
115 'MakeMaker.pm' => '$(INST_LIBDIR)/MakeMaker.pm',
116 'CoroAPI.h' => '$(INST_LIBDIR)/CoroAPI.h',
117
118 'Cont.pm' => '$(INST_LIBDIR)/Cont.pm',
119
120 'Specific.pm' => '$(INST_LIBDIR)/Specific.pm',
121
122 'Signal.pm' => '$(INST_LIBDIR)/Signal.pm',
123 'Channel.pm' => '$(INST_LIBDIR)/Channel.pm',
124 'Semaphore.pm' => '$(INST_LIBDIR)/Semaphore.pm',
125 'SemaphoreSet.pm' => '$(INST_LIBDIR)/SemaphoreSet.pm',
126 'RWLock.pm' => '$(INST_LIBDIR)/RWLock.pm',
127 },
128); 298);
129 299
130sub conftest { 300sub conftest {
131 my $type = shift; 301 my $type = shift;
132 302
138 $res =~ s/\s+$//; 308 $res =~ s/\s+$//;
139 my ($sp, $ss) = split /,/, $res; 309 my ($sp, $ss) = split /,/, $res;
140 310
141 print "\n\n*****************************************************************************\n"; 311 print "\n\n*****************************************************************************\n";
142 print "If the testsuite fails PLEASE provide the following information\n"; 312 print "If the testsuite fails PLEASE provide the following information\n";
143 print "to Marc Lehmann <pcg\@goof.com>: operating system name, version,\n"; 313 print "to Marc Lehmann <schmorp\@schmorp.de>: operating system name, version,\n";
144 print "architecture name and this string '$sp|$ss'. Thanks a lot!\n";#d# 314 print "architecture name and this string '$sp|$ss'. Thanks a lot!\n";#d#
145 print "*****************************************************************************\n\n"; 315 print "*****************************************************************************\n\n";
146 316
147 unlink "a.out"; 317 unlink "a.out";
318 unlink "conftestval";
148} 319}
149 320
150

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines