ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-AIO/AIO.pm
Revision: 1.25
Committed: Sun Jul 31 21:21:12 2005 UTC (18 years, 9 months ago) by root
Branch: MAIN
CVS Tags: rel-1_1
Changes since 1.24: +4 -1 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     Asynchronously reads the specified byte range into the page cache, using
158 root 1.17 the C<readahead> syscall. If that syscall doesn't exist (likely if your OS
159 root 1.20 isn't Linux) the status will be C<-1> and C<$!> is set to C<ENOSYS>.
160 root 1.1
161 root 1.20 C<aio_readahead> populates the page cache with data from a file so that
162 root 1.1 subsequent reads from that file will not block on disk I/O. The C<$offset>
163     argument specifies the starting point from which data is to be read and
164     C<$length> specifies the number of bytes to be read. I/O is performed in
165     whole pages, so that offset is effectively rounded down to a page boundary
166     and bytes are read up to the next page boundary greater than or equal to
167 root 1.20 (off-set+length). C<aio_readahead> does not read beyond the end of the
168 root 1.1 file. The current file offset of the file is left unchanged.
169    
170     =item aio_stat $fh_or_path, $callback
171    
172     =item aio_lstat $fh, $callback
173    
174     Works like perl's C<stat> or C<lstat> in void context. The callback will
175     be called after the stat and the results will be available using C<stat _>
176     or C<-s _> etc...
177    
178     The pathname passed to C<aio_stat> must be absolute. See API NOTES, above,
179     for an explanation.
180    
181     Currently, the stats are always 64-bit-stats, i.e. instead of returning an
182     error when stat'ing a large file, the results will be silently truncated
183     unless perl itself is compiled with large file support.
184    
185     Example: Print the length of F</etc/passwd>:
186    
187     aio_stat "/etc/passwd", sub {
188     $_[0] and die "stat failed: $!";
189     print "size is ", -s _, "\n";
190     };
191    
192     =item aio_unlink $pathname, $callback
193    
194     Asynchronously unlink (delete) a file and call the callback with the
195     result code.
196    
197     =item aio_fsync $fh, $callback
198    
199     Asynchronously call fsync on the given filehandle and call the callback
200     with the fsync result code.
201    
202     =item aio_fdatasync $fh, $callback
203    
204     Asynchronously call fdatasync on the given filehandle and call the
205 root 1.20 callback with the fdatasync result code. Might set C<$!> to C<ENOSYS> if
206     C<fdatasync> is not available.
207 root 1.1
208 root 1.5 =back
209    
210     =head2 SUPPORT FUNCTIONS
211    
212     =over 4
213    
214     =item $fileno = IO::AIO::poll_fileno
215    
216 root 1.20 Return the I<request result pipe file descriptor>. This filehandle must be
217     polled for reading by some mechanism outside this module (e.g. Event or
218     select, see below or the SYNOPSIS). If the pipe becomes readable you have
219     to call C<poll_cb> to check the results.
220 root 1.5
221     See C<poll_cb> for an example.
222    
223     =item IO::AIO::poll_cb
224    
225     Process all outstanding events on the result pipe. You have to call this
226     regularly. Returns the number of events processed. Returns immediately
227     when no events are outstanding.
228    
229 root 1.20 Example: Install an Event watcher that automatically calls
230     IO::AIO::poll_cb with high priority:
231 root 1.5
232     Event->io (fd => IO::AIO::poll_fileno,
233     poll => 'r', async => 1,
234     cb => \&IO::AIO::poll_cb);
235    
236     =item IO::AIO::poll_wait
237    
238     Wait till the result filehandle becomes ready for reading (simply does a
239 root 1.20 C<select> on the filehandle. This is useful if you want to synchronously wait
240 root 1.5 for some requests to finish).
241    
242     See C<nreqs> for an example.
243    
244     =item IO::AIO::nreqs
245    
246 root 1.20 Returns the number of requests currently outstanding (i.e. for which their
247     callback has not been invoked yet).
248 root 1.5
249     Example: wait till there are no outstanding requests anymore:
250    
251     IO::AIO::poll_wait, IO::AIO::poll_cb
252     while IO::AIO::nreqs;
253    
254 root 1.12 =item IO::AIO::flush
255    
256     Wait till all outstanding AIO requests have been handled.
257    
258 root 1.13 Strictly equivalent to:
259    
260     IO::AIO::poll_wait, IO::AIO::poll_cb
261     while IO::AIO::nreqs;
262    
263     =item IO::AIO::poll
264    
265     Waits until some requests have been handled.
266    
267     Strictly equivalent to:
268    
269     IO::AIO::poll_wait, IO::AIO::poll_cb
270     if IO::AIO::nreqs;
271    
272 root 1.5 =item IO::AIO::min_parallel $nthreads
273    
274     Set the minimum number of AIO threads to C<$nthreads>. The default is
275     C<1>, which means a single asynchronous operation can be done at one time
276     (the number of outstanding operations, however, is unlimited).
277    
278     It is recommended to keep the number of threads low, as some Linux
279     kernel versions will scale negatively with the number of threads (higher
280     parallelity => MUCH higher latency). With current Linux 2.6 versions, 4-32
281     threads should be fine.
282    
283     Under normal circumstances you don't need to call this function, as this
284     module automatically starts some threads (the exact number might change,
285     and is currently 4).
286    
287     =item IO::AIO::max_parallel $nthreads
288    
289     Sets the maximum number of AIO threads to C<$nthreads>. If more than
290     the specified number of threads are currently running, kill them. This
291     function blocks until the limit is reached.
292    
293     This module automatically runs C<max_parallel 0> at program end, to ensure
294     that all threads are killed and that there are no outstanding requests.
295    
296     Under normal circumstances you don't need to call this function.
297    
298     =item $oldnreqs = IO::AIO::max_outstanding $nreqs
299    
300     Sets the maximum number of outstanding requests to C<$nreqs>. If you
301     try to queue up more than this number of requests, the caller will block until
302     some requests have been handled.
303    
304     The default is very large, so normally there is no practical limit. If you
305     queue up many requests in a loop it it often improves speed if you set
306     this to a relatively low number, such as C<100>.
307    
308     Under normal circumstances you don't need to call this function.
309    
310     =back
311    
312 root 1.1 =cut
313    
314 root 1.2 # support function to convert a fd into a perl filehandle
315     sub _fd2fh {
316     return undef if $_[0] < 0;
317    
318 root 1.23 # try to generate nice filehandles
319     my $sym = "IO::AIO::fd#$_[0]";
320     local *$sym;
321 root 1.25
322     open *$sym, "+<&$_[0]" # usually under any unix
323     or open *$sym, "<&$_[0]" # cygwin needs this
324     or open *$sym, ">&$_[0]" # cygwin needs this
325 root 1.2 or return undef;
326    
327 root 1.23 *$sym
328 root 1.2 }
329    
330 root 1.1 min_parallel 4;
331    
332     END {
333     max_parallel 0;
334     }
335    
336     1;
337    
338     =head1 SEE ALSO
339    
340     L<Coro>, L<Linux::AIO>.
341    
342     =head1 AUTHOR
343    
344     Marc Lehmann <schmorp@schmorp.de>
345     http://home.schmorp.de/
346    
347     =cut
348