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