ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/LWP.pm
Revision: 1.47
Committed: Fri Oct 2 19:55:59 2009 UTC (14 years, 8 months ago) by root
Branch: MAIN
CVS Tags: rel-5_2
Changes since 1.46: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.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 root 1.6 This module is an L<AnyEvent> user, you need to make sure that you use and
12     run a supported event loop.
13    
14 root 1.1 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 root 1.7 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 root 1.1 invasive and must be loaded very early to take the proper effect.
20    
21 root 1.32 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 root 1.1 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 root 1.2 This is necessary because LWP might (and does) try to resolve hostnames
40     this way.
41 root 1.1
42 root 1.8 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 root 1.1
46 root 1.2 =item It replaces the base class of Net::HTTP, Net::FTP, Net::NNTP.
47 root 1.1
48 root 1.18 This is necessary because LWP does not always use select to see whether
49 root 1.2 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 root 1.1
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 root 1.2 in practise. Also, protocols other than the above mentioned will still block,
56     at least some of the time.
57 root 1.1
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 root 1.46 use common::sense;
71 root 1.11
72     BEGIN {
73     # suppress warnings
74     local $^W = 0;
75     require Net::Config;
76     }
77 root 1.1
78 root 1.33 # do it as early as possible
79     use Coro::Select;
80    
81     # import these so they can grab Socket::inet_aton
82 root 1.9 use AnyEvent::Util ();
83     use AnyEvent::DNS ();
84    
85 root 1.8 use Coro::Util ();
86     use Coro::Socket ();
87 root 1.39 use Coro::AnyEvent ();
88 root 1.8
89     use Socket ();
90 root 1.11
91 root 1.8 use IO::Socket::INET ();
92    
93     use Net::HTTP ();
94     use Net::FTP ();
95     use Net::NNTP ();
96 root 1.2
97 root 1.47 our $VERSION = 5.2;
98 root 1.3
99 root 1.1 *Socket::inet_aton = \&Coro::Util::inet_aton;
100    
101 root 1.2 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 root 1.11 no warnings;
108    
109 root 1.2 use base Coro::Socket::;
110    
111     sub new {
112     my $self = shift;
113    
114     $self->SUPER::new (@_, partial => 1)
115     }
116    
117     1;
118 root 1.1
119     =head1 AUTHOR
120    
121     Marc Lehmann <schmorp@schmorp.de>
122     http://home.schmorp.de/
123    
124     =cut
125    
126