ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-AIO/AIO.pm
Revision: 1.26
Committed: Sun Aug 7 03:34:07 2005 UTC (18 years, 10 months ago) by root
Branch: MAIN
Changes since 1.25: +7 -6 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3     IO::AIO - Asynchronous Input/Output
4    
5     =head1 SYNOPSIS
6    
7     use IO::AIO;
8    
9 root 1.6 aio_open "/etc/passwd", O_RDONLY, 0, sub {
10     my ($fh) = @_;
11     ...
12     };
13    
14     aio_unlink "/tmp/file", sub { };
15    
16     aio_read $fh, 30000, 1024, $buffer, 0, sub {
17 root 1.8 $_[0] > 0 or die "read error: $!";
18 root 1.6 };
19    
20     # Event
21     Event->io (fd => IO::AIO::poll_fileno,
22 root 1.7 poll => 'r',
23 root 1.6 cb => \&IO::AIO::poll_cb);
24    
25     # Glib/Gtk2
26     add_watch Glib::IO IO::AIO::poll_fileno,
27 root 1.22 in => sub { IO::AIO::poll_cb; 1 };
28 root 1.6
29     # Tk
30     Tk::Event::IO->fileevent (IO::AIO::poll_fileno, "",
31     readable => \&IO::AIO::poll_cb);
32    
33 root 1.11 # Danga::Socket
34     Danga::Socket->AddOtherFds (IO::AIO::poll_fileno =>
35     \&IO::AIO::poll_cb);
36    
37    
38 root 1.1 =head1 DESCRIPTION
39    
40     This module implements asynchronous I/O using whatever means your
41 root 1.2 operating system supports.
42 root 1.1
43 root 1.2 Currently, a number of threads are started that execute your read/writes
44     and signal their completion. You don't need thread support in your libc or
45     perl, and the threads created by this module will not be visible to the
46     pthreads library. In the future, this module might make use of the native
47     aio functions available on many operating systems. However, they are often
48     not well-supported (Linux doesn't allow them on normal files currently,
49     for example), and they would only support aio_read and aio_write, so the
50     remaining functionality would have to be implemented using threads anyway.
51 root 1.1
52     Although the module will work with in the presence of other threads, it is
53 root 1.22 currently not reentrant, so use appropriate locking yourself, always call
54     C<poll_cb> from within the same thread, or never call C<poll_cb> (or other
55     C<aio_> functions) recursively.
56 root 1.1
57     =cut
58    
59     package IO::AIO;
60    
61 root 1.23 no warnings;
62    
63 root 1.1 use base 'Exporter';
64    
65 root 1.2 use Fcntl ();
66    
67 root 1.1 BEGIN {
68 root 1.24 $VERSION = 1.1;
69 root 1.1
70     @EXPORT = qw(aio_read aio_write aio_open aio_close aio_stat aio_lstat aio_unlink
71     aio_fsync aio_fdatasync aio_readahead);
72 root 1.4 @EXPORT_OK = qw(poll_fileno poll_cb min_parallel max_parallel max_outstanding nreqs);
73 root 1.1
74     require XSLoader;
75     XSLoader::load IO::AIO, $VERSION;
76     }
77    
78 root 1.5 =head1 FUNCTIONS
79 root 1.1
80 root 1.5 =head2 AIO FUNCTIONS
81 root 1.1
82 root 1.5 All the C<aio_*> calls are more or less thin wrappers around the syscall
83     with the same name (sans C<aio_>). The arguments are similar or identical,
84 root 1.14 and they all accept an additional (and optional) C<$callback> argument
85     which must be a code reference. This code reference will get called with
86     the syscall return code (e.g. most syscalls return C<-1> on error, unlike
87     perl, which usually delivers "false") as it's sole argument when the given
88     syscall has been executed asynchronously.
89 root 1.1
90 root 1.23 All functions expecting a filehandle keep a copy of the filehandle
91     internally until the request has finished.
92 root 1.1
93 root 1.5 The filenames you pass to these routines I<must> be absolute. The reason
94 root 1.20 for this is that at the time the request is being executed, the current
95     working directory could have changed. Alternatively, you can make sure
96     that you never change the current working directory.
97 root 1.1
98 root 1.5 =over 4
99 root 1.1
100     =item aio_open $pathname, $flags, $mode, $callback
101    
102 root 1.2 Asynchronously open or create a file and call the callback with a newly
103     created filehandle for the file.
104 root 1.1
105     The pathname passed to C<aio_open> must be absolute. See API NOTES, above,
106     for an explanation.
107    
108 root 1.20 The C<$flags> argument is a bitmask. See the C<Fcntl> module for a
109     list. They are the same as used by C<sysopen>.
110    
111     Likewise, C<$mode> specifies the mode of the newly created file, if it
112     didn't exist and C<O_CREAT> has been given, just like perl's C<sysopen>,
113     except that it is mandatory (i.e. use C<0> if you don't create new files,
114     and C<0666> or C<0777> if you do).
115 root 1.1
116     Example:
117    
118     aio_open "/etc/passwd", O_RDONLY, 0, sub {
119 root 1.2 if ($_[0]) {
120     print "open successful, fh is $_[0]\n";
121 root 1.1 ...
122     } else {
123     die "open failed: $!\n";
124     }
125     };
126    
127     =item aio_close $fh, $callback
128    
129 root 1.2 Asynchronously close a file and call the callback with the result
130     code. I<WARNING:> although accepted, you should not pass in a perl
131 root 1.20 filehandle here, as perl will likely close the file descriptor another
132     time when the filehandle is destroyed. Normally, you can safely call perls
133     C<close> or just let filehandles go out of scope.
134    
135     This is supposed to be a bug in the API, so that might change. It's
136     therefore best to avoid this function.
137 root 1.1
138     =item aio_read $fh,$offset,$length, $data,$dataoffset,$callback
139    
140     =item aio_write $fh,$offset,$length, $data,$dataoffset,$callback
141    
142     Reads or writes C<length> bytes from the specified C<fh> and C<offset>
143     into the scalar given by C<data> and offset C<dataoffset> and calls the
144     callback without the actual number of bytes read (or -1 on error, just
145     like the syscall).
146    
147 root 1.17 Example: Read 15 bytes at offset 7 into scalar C<$buffer>, starting at
148 root 1.1 offset C<0> within the scalar:
149    
150     aio_read $fh, 7, 15, $buffer, 0, sub {
151 root 1.9 $_[0] > 0 or die "read error: $!";
152     print "read $_[0] bytes: <$buffer>\n";
153 root 1.1 };
154    
155     =item aio_readahead $fh,$offset,$length, $callback
156    
157 root 1.20 C<aio_readahead> populates the page cache with data from a file so that
158 root 1.1 subsequent reads from that file will not block on disk I/O. The C<$offset>
159     argument specifies the starting point from which data is to be read and
160     C<$length> specifies the number of bytes to be read. I/O is performed in
161     whole pages, so that offset is effectively rounded down to a page boundary
162     and bytes are read up to the next page boundary greater than or equal to
163 root 1.20 (off-set+length). C<aio_readahead> does not read beyond the end of the
164 root 1.1 file. The current file offset of the file is left unchanged.
165    
166 root 1.26 If that syscall doesn't exist (likely if your OS isn't Linux) it will be
167     emulated by simply reading the data, which would have a similar effect.
168    
169 root 1.1 =item aio_stat $fh_or_path, $callback
170    
171     =item aio_lstat $fh, $callback
172    
173     Works like perl's C<stat> or C<lstat> in void context. The callback will
174     be called after the stat and the results will be available using C<stat _>
175     or C<-s _> etc...
176    
177     The pathname passed to C<aio_stat> must be absolute. See API NOTES, above,
178     for an explanation.
179    
180     Currently, the stats are always 64-bit-stats, i.e. instead of returning an
181     error when stat'ing a large file, the results will be silently truncated
182     unless perl itself is compiled with large file support.
183    
184     Example: Print the length of F</etc/passwd>:
185    
186     aio_stat "/etc/passwd", sub {
187     $_[0] and die "stat failed: $!";
188     print "size is ", -s _, "\n";
189     };
190    
191     =item aio_unlink $pathname, $callback
192    
193     Asynchronously unlink (delete) a file and call the callback with the
194     result code.
195    
196     =item aio_fsync $fh, $callback
197    
198     Asynchronously call fsync on the given filehandle and call the callback
199     with the fsync result code.
200    
201     =item aio_fdatasync $fh, $callback
202    
203     Asynchronously call fdatasync on the given filehandle and call the
204 root 1.26 callback with the fdatasync result code.
205    
206     If this call isn't available because your OS lacks it or it couldn't be
207     detected, it will be emulated by calling C<fsync> instead.
208 root 1.1
209 root 1.5 =back
210    
211     =head2 SUPPORT FUNCTIONS
212    
213     =over 4
214    
215     =item $fileno = IO::AIO::poll_fileno
216    
217 root 1.20 Return the I<request result pipe file descriptor>. This filehandle must be
218     polled for reading by some mechanism outside this module (e.g. Event or
219     select, see below or the SYNOPSIS). If the pipe becomes readable you have
220     to call C<poll_cb> to check the results.
221 root 1.5
222     See C<poll_cb> for an example.
223    
224     =item IO::AIO::poll_cb
225    
226     Process all outstanding events on the result pipe. You have to call this
227     regularly. Returns the number of events processed. Returns immediately
228     when no events are outstanding.
229    
230 root 1.20 Example: Install an Event watcher that automatically calls
231     IO::AIO::poll_cb with high priority:
232 root 1.5
233     Event->io (fd => IO::AIO::poll_fileno,
234     poll => 'r', async => 1,
235     cb => \&IO::AIO::poll_cb);
236    
237     =item IO::AIO::poll_wait
238    
239     Wait till the result filehandle becomes ready for reading (simply does a
240 root 1.20 C<select> on the filehandle. This is useful if you want to synchronously wait
241 root 1.5 for some requests to finish).
242    
243     See C<nreqs> for an example.
244    
245     =item IO::AIO::nreqs
246    
247 root 1.20 Returns the number of requests currently outstanding (i.e. for which their
248     callback has not been invoked yet).
249 root 1.5
250     Example: wait till there are no outstanding requests anymore:
251    
252     IO::AIO::poll_wait, IO::AIO::poll_cb
253     while IO::AIO::nreqs;
254    
255 root 1.12 =item IO::AIO::flush
256    
257     Wait till all outstanding AIO requests have been handled.
258    
259 root 1.13 Strictly equivalent to:
260    
261     IO::AIO::poll_wait, IO::AIO::poll_cb
262     while IO::AIO::nreqs;
263    
264     =item IO::AIO::poll
265    
266     Waits until some requests have been handled.
267    
268     Strictly equivalent to:
269    
270     IO::AIO::poll_wait, IO::AIO::poll_cb
271     if IO::AIO::nreqs;
272    
273 root 1.5 =item IO::AIO::min_parallel $nthreads
274    
275     Set the minimum number of AIO threads to C<$nthreads>. The default is
276     C<1>, which means a single asynchronous operation can be done at one time
277     (the number of outstanding operations, however, is unlimited).
278    
279     It is recommended to keep the number of threads low, as some Linux
280     kernel versions will scale negatively with the number of threads (higher
281     parallelity => MUCH higher latency). With current Linux 2.6 versions, 4-32
282     threads should be fine.
283    
284     Under normal circumstances you don't need to call this function, as this
285     module automatically starts some threads (the exact number might change,
286     and is currently 4).
287    
288     =item IO::AIO::max_parallel $nthreads
289    
290     Sets the maximum number of AIO threads to C<$nthreads>. If more than
291     the specified number of threads are currently running, kill them. This
292     function blocks until the limit is reached.
293    
294     This module automatically runs C<max_parallel 0> at program end, to ensure
295     that all threads are killed and that there are no outstanding requests.
296    
297     Under normal circumstances you don't need to call this function.
298    
299     =item $oldnreqs = IO::AIO::max_outstanding $nreqs
300    
301     Sets the maximum number of outstanding requests to C<$nreqs>. If you
302     try to queue up more than this number of requests, the caller will block until
303     some requests have been handled.
304    
305     The default is very large, so normally there is no practical limit. If you
306     queue up many requests in a loop it it often improves speed if you set
307     this to a relatively low number, such as C<100>.
308    
309     Under normal circumstances you don't need to call this function.
310    
311     =back
312    
313 root 1.1 =cut
314    
315 root 1.2 # support function to convert a fd into a perl filehandle
316     sub _fd2fh {
317     return undef if $_[0] < 0;
318    
319 root 1.23 # try to generate nice filehandles
320     my $sym = "IO::AIO::fd#$_[0]";
321     local *$sym;
322 root 1.25
323     open *$sym, "+<&$_[0]" # usually under any unix
324     or open *$sym, "<&$_[0]" # cygwin needs this
325     or open *$sym, ">&$_[0]" # cygwin needs this
326 root 1.2 or return undef;
327    
328 root 1.23 *$sym
329 root 1.2 }
330    
331 root 1.1 min_parallel 4;
332    
333     END {
334     max_parallel 0;
335     }
336    
337     1;
338    
339     =head1 SEE ALSO
340    
341     L<Coro>, L<Linux::AIO>.
342    
343     =head1 AUTHOR
344    
345     Marc Lehmann <schmorp@schmorp.de>
346     http://home.schmorp.de/
347    
348     =cut
349