ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/LWP.pm
Revision: 1.38
Committed: Tue Jun 23 23:40:06 2009 UTC (14 years, 11 months ago) by root
Branch: MAIN
CVS Tags: rel-5_14
Changes since 1.37: +1 -1 lines
Log Message:
5.14

File Contents

# Content
1 =head1 NAME
2
3 Coro::LWP - make LWP non-blocking - as much as possible
4
5 =head1 SYNOPSIS
6
7 use Coro::LWP; # afterwards LWP should not block
8
9 =head1 DESCRIPTION
10
11 This module is an L<AnyEvent> user, you need to make sure that you use and
12 run a supported event loop.
13
14 This module tries to make L<LWP|LWP> non-blocking with respect to other
15 coroutines as much as possible, and with whatever means it takes.
16
17 LWP really tries very hard to be blocking (and relies on a lot of
18 undocumented functionality in IO::Socket), so this module had to be very
19 invasive and must be loaded very early to take the proper effect.
20
21 Note that the module L<AnyEvent::HTTP> might offer an alternative to the
22 full L<LWP> that is designed to be non-blocking.
23
24 Here is what it currently does (future versions of LWP might require
25 different tricks):
26
27 =over 4
28
29 =item It loads Coro::Select, overwriting the perl C<select> builtin I<globally>.
30
31 This is necessary because LWP calls select quite often for timeouts and
32 who-knows-what.
33
34 Impact: everybody else uses this (slower) version of select, too. It should be quite
35 compatible to perls builtin select, though.
36
37 =item It overwrites Socket::inet_aton with Coro::Util::inet_aton.
38
39 This is necessary because LWP might (and does) try to resolve hostnames
40 this way.
41
42 Impact: some code might not expect coroutine semantics, for example, when
43 you fork you might prefer the blocking variant because other coroutines
44 shouldn't actually run.
45
46 =item It replaces the base class of Net::HTTP, Net::FTP, Net::NNTP.
47
48 This is necessary because LWP does not always use select to see whether
49 a filehandle can be read/written without blocking, so the base class
50 C<IO::Socket::INET> needs to be replaced by C<Coro::Socket>.
51
52 Impact: Coro::Socket is not at all compatible to IO::Socket::INET. While
53 it duplicates some undocumented functionality required by LWP, it does not
54 have all the methods of IO::Socket::INET and might act quite differently
55 in practise. Also, protocols other than the above mentioned will still block,
56 at least some of the time.
57
58 =back
59
60 All this likely makes other libraries than just LWP not block, but thats
61 just a side effect you cannot rely on.
62
63 Increases parallelism is not supported by all libraries, some might cache
64 data globally.
65
66 =cut
67
68 package Coro::LWP;
69
70 use strict;
71 no warnings;
72
73 BEGIN {
74 # suppress warnings
75 local $^W = 0;
76 require Net::Config;
77 }
78
79 # do it as early as possible
80 use Coro::Select;
81
82 # import these so they can grab Socket::inet_aton
83 use AnyEvent::Util ();
84 use AnyEvent::DNS ();
85
86 use Coro::Util ();
87 use Coro::Socket ();
88
89 use Socket ();
90
91 use IO::Socket::INET ();
92
93 use Net::HTTP ();
94 use Net::FTP ();
95 use Net::NNTP ();
96
97 our $VERSION = 5.14;
98
99 *Socket::inet_aton = \&Coro::Util::inet_aton;
100
101 for (@Net::HTTP::ISA, @Net::FTP::ISA, @Net::NTTP::ISA) {
102 $_ = Coro::LWP::Socket:: if $_ eq IO::Socket::INET::;
103 }
104
105 package Coro::LWP::Socket;
106
107 no warnings;
108
109 use base Coro::Socket::;
110
111 sub new {
112 my $self = shift;
113
114 $self->SUPER::new (@_, partial => 1)
115 }
116
117 1;
118
119 =head1 AUTHOR
120
121 Marc Lehmann <schmorp@schmorp.de>
122 http://home.schmorp.de/
123
124 =cut
125
126