ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-AIO/AIO.pm
Revision: 1.27
Committed: Tue Aug 16 22:22:18 2005 UTC (18 years, 9 months ago) by root
Branch: MAIN
Changes since 1.26: +16 -4 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 root 1.27 aio_rmdir aio_symlink 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 root 1.27 =item aio_rmdir $pathname, $callback
197    
198     Asynchronously rmdir (delete) a directory and call the callback with the
199     result code.
200    
201 root 1.1 =item aio_fsync $fh, $callback
202    
203     Asynchronously call fsync on the given filehandle and call the callback
204     with the fsync result code.
205    
206     =item aio_fdatasync $fh, $callback
207    
208     Asynchronously call fdatasync on the given filehandle and call the
209 root 1.26 callback with the fdatasync result code.
210    
211     If this call isn't available because your OS lacks it or it couldn't be
212     detected, it will be emulated by calling C<fsync> instead.
213 root 1.1
214 root 1.5 =back
215    
216     =head2 SUPPORT FUNCTIONS
217    
218     =over 4
219    
220     =item $fileno = IO::AIO::poll_fileno
221    
222 root 1.20 Return the I<request result pipe file descriptor>. This filehandle must be
223     polled for reading by some mechanism outside this module (e.g. Event or
224     select, see below or the SYNOPSIS). If the pipe becomes readable you have
225     to call C<poll_cb> to check the results.
226 root 1.5
227     See C<poll_cb> for an example.
228    
229     =item IO::AIO::poll_cb
230    
231     Process all outstanding events on the result pipe. You have to call this
232     regularly. Returns the number of events processed. Returns immediately
233     when no events are outstanding.
234    
235 root 1.20 Example: Install an Event watcher that automatically calls
236     IO::AIO::poll_cb with high priority:
237 root 1.5
238     Event->io (fd => IO::AIO::poll_fileno,
239     poll => 'r', async => 1,
240     cb => \&IO::AIO::poll_cb);
241    
242     =item IO::AIO::poll_wait
243    
244     Wait till the result filehandle becomes ready for reading (simply does a
245 root 1.20 C<select> on the filehandle. This is useful if you want to synchronously wait
246 root 1.5 for some requests to finish).
247    
248     See C<nreqs> for an example.
249    
250     =item IO::AIO::nreqs
251    
252 root 1.20 Returns the number of requests currently outstanding (i.e. for which their
253     callback has not been invoked yet).
254 root 1.5
255     Example: wait till there are no outstanding requests anymore:
256    
257     IO::AIO::poll_wait, IO::AIO::poll_cb
258     while IO::AIO::nreqs;
259    
260 root 1.12 =item IO::AIO::flush
261    
262     Wait till all outstanding AIO requests have been handled.
263    
264 root 1.13 Strictly equivalent to:
265    
266     IO::AIO::poll_wait, IO::AIO::poll_cb
267     while IO::AIO::nreqs;
268    
269     =item IO::AIO::poll
270    
271     Waits until some requests have been handled.
272    
273     Strictly equivalent to:
274    
275     IO::AIO::poll_wait, IO::AIO::poll_cb
276     if IO::AIO::nreqs;
277    
278 root 1.5 =item IO::AIO::min_parallel $nthreads
279    
280     Set the minimum number of AIO threads to C<$nthreads>. The default is
281     C<1>, which means a single asynchronous operation can be done at one time
282     (the number of outstanding operations, however, is unlimited).
283    
284     It is recommended to keep the number of threads low, as some Linux
285     kernel versions will scale negatively with the number of threads (higher
286     parallelity => MUCH higher latency). With current Linux 2.6 versions, 4-32
287     threads should be fine.
288    
289     Under normal circumstances you don't need to call this function, as this
290     module automatically starts some threads (the exact number might change,
291     and is currently 4).
292    
293     =item IO::AIO::max_parallel $nthreads
294    
295     Sets the maximum number of AIO threads to C<$nthreads>. If more than
296     the specified number of threads are currently running, kill them. This
297     function blocks until the limit is reached.
298    
299     This module automatically runs C<max_parallel 0> at program end, to ensure
300     that all threads are killed and that there are no outstanding requests.
301    
302     Under normal circumstances you don't need to call this function.
303    
304     =item $oldnreqs = IO::AIO::max_outstanding $nreqs
305    
306     Sets the maximum number of outstanding requests to C<$nreqs>. If you
307     try to queue up more than this number of requests, the caller will block until
308     some requests have been handled.
309    
310     The default is very large, so normally there is no practical limit. If you
311     queue up many requests in a loop it it often improves speed if you set
312     this to a relatively low number, such as C<100>.
313    
314     Under normal circumstances you don't need to call this function.
315    
316     =back
317    
318 root 1.1 =cut
319    
320 root 1.2 # support function to convert a fd into a perl filehandle
321     sub _fd2fh {
322     return undef if $_[0] < 0;
323    
324 root 1.23 # try to generate nice filehandles
325     my $sym = "IO::AIO::fd#$_[0]";
326     local *$sym;
327 root 1.25
328 root 1.27 open *$sym, "+<&=$_[0]" # usually works under any unix
329     or open *$sym, "<&=$_[0]" # cygwin needs this
330     or open *$sym, ">&=$_[0]" # or this
331 root 1.2 or return undef;
332    
333 root 1.23 *$sym
334 root 1.2 }
335    
336 root 1.1 min_parallel 4;
337    
338     END {
339     max_parallel 0;
340     }
341    
342     1;
343    
344 root 1.27 =head2 FORK BEHAVIOUR
345    
346     IO::AIO handles all outstanding AIO requests before the fork, destroys all
347     AIO threads, and recreates them in both the parent and the child after the
348     fork.
349    
350    
351 root 1.1 =head1 SEE ALSO
352    
353     L<Coro>, L<Linux::AIO>.
354    
355     =head1 AUTHOR
356    
357     Marc Lehmann <schmorp@schmorp.de>
358     http://home.schmorp.de/
359    
360     =cut
361