ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-AIO/AIO.pm
Revision: 1.1
Committed: Sun Jul 10 17:07:44 2005 UTC (18 years, 10 months ago) by root
Branch: MAIN
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     =head1 DESCRIPTION
10    
11     This module implements asynchronous I/O using whatever means your
12     operating system supports. Currently, it falls back to Linux::AIO if that
13     module is available, or uses pthreads to emulato aio functionality.
14    
15     Currently, in this module a number of threads are started that execute
16     your read/writes and signal their completion. You don't need thread
17     support in your libc or perl, and the threads created by this module will
18     not be visible to the pthreads library.
19    
20     Although the module will work with in the presence of other threads, it is
21     not reentrant, so use appropriate locking yourself.
22    
23     =head2 API NOTES
24    
25     All the C<aio_*> calls are more or less thin wrappers around the syscall
26     with the same name (sans C<aio_>). The arguments are similar or identical,
27     and they all accept an additional C<$callback> argument which must be
28     a code reference. This code reference will get called with the syscall
29     return code (e.g. most syscalls return C<-1> on error, unlike perl, which
30     usually delivers "false") as it's sole argument when the given syscall has
31     been executed asynchronously.
32    
33     All functions that expect a filehandle will also accept a file descriptor.
34    
35     The filenames you pass to these routines I<must> be absolute. The reason
36     is that at the time the request is being executed, the current working
37     directory could have changed. Alternatively, you can make sure that you
38     never change the current working directory.
39    
40     =over 4
41    
42     =cut
43    
44     package IO::AIO;
45    
46     use base 'Exporter';
47    
48     BEGIN {
49     $VERSION = 0.1;
50    
51     @EXPORT = qw(aio_read aio_write aio_open aio_close aio_stat aio_lstat aio_unlink
52     aio_fsync aio_fdatasync aio_readahead);
53     @EXPORT_OK = qw(poll_fileno poll_cb min_parallel max_parallel nreqs);
54    
55     require XSLoader;
56     XSLoader::load IO::AIO, $VERSION;
57     }
58    
59     =item IO::AIO::min_parallel $nthreads
60    
61     Set the minimum number of AIO threads to C<$nthreads>. The default is
62     C<1>, which means a single asynchronous operation can be done at one time
63     (the number of outstanding operations, however, is unlimited).
64    
65     It is recommended to keep the number of threads low, as some linux
66     kernel versions will scale negatively with the number of threads (higher
67     parallelity => MUCH higher latency).
68    
69     Under normal circumstances you don't need to call this function, as this
70     module automatically starts a single async thread.
71    
72     =item IO::AIO::max_parallel $nthreads
73    
74     Sets the maximum number of AIO threads to C<$nthreads>. If more than
75     the specified number of threads are currently running, kill them. This
76     function blocks until the limit is reached.
77    
78     This module automatically runs C<max_parallel 0> at program end, to ensure
79     that all threads are killed and that there are no outstanding requests.
80    
81     Under normal circumstances you don't need to call this function.
82    
83     =item $fileno = IO::AIO::poll_fileno
84    
85     Return the I<request result pipe filehandle>. This filehandle must be
86     polled for reading by some mechanism outside this module (e.g. Event
87     or select, see below). If the pipe becomes readable you have to call
88     C<poll_cb> to check the results.
89    
90     See C<poll_cb> for an example.
91    
92     =item IO::AIO::poll_cb
93    
94     Process all outstanding events on the result pipe. You have to call this
95     regularly. Returns the number of events processed. Returns immediately
96     when no events are outstanding.
97    
98     You can use Event to multiplex, e.g.:
99    
100     Event->io (fd => IO::AIO::poll_fileno,
101     poll => 'r', async => 1,
102     cb => \&IO::AIO::poll_cb);
103    
104     =item IO::AIO::poll_wait
105    
106     Wait till the result filehandle becomes ready for reading (simply does a
107     select on the filehandle. This is useful if you want to synchronously wait
108     for some requests to finish).
109    
110     See C<nreqs> for an example.
111    
112     =item IO::AIO::nreqs
113    
114     Returns the number of requests currently outstanding.
115    
116     Example: wait till there are no outstanding requests anymore:
117    
118     IO::AIO::poll_wait, IO::AIO::poll_cb
119     while IO::AIO::nreqs;
120    
121     =item aio_open $pathname, $flags, $mode, $callback
122    
123     Asynchronously open or create a file and call the callback with the
124     filedescriptor (NOT a perl filehandle, sorry for that, but watch out, this
125     might change in the future).
126    
127     The pathname passed to C<aio_open> must be absolute. See API NOTES, above,
128     for an explanation.
129    
130     The C<$mode> argument is a bitmask. See the C<Fcntl> module for a
131     list. They are the same as used in C<sysopen>.
132    
133     Example:
134    
135     aio_open "/etc/passwd", O_RDONLY, 0, sub {
136     if ($_[0] >= 0) {
137     open my $fh, "<&$_[0]"; # create a copy for perl
138     aio_close $_[0], sub { }; # close the aio handle
139     print "open successful, fh is $fh\n";
140     ...
141     } else {
142     die "open failed: $!\n";
143     }
144     };
145    
146     =item aio_close $fh, $callback
147    
148     Asynchronously close a file and call the callback with the result code.
149    
150     =item aio_read $fh,$offset,$length, $data,$dataoffset,$callback
151    
152     =item aio_write $fh,$offset,$length, $data,$dataoffset,$callback
153    
154     Reads or writes C<length> bytes from the specified C<fh> and C<offset>
155     into the scalar given by C<data> and offset C<dataoffset> and calls the
156     callback without the actual number of bytes read (or -1 on error, just
157     like the syscall).
158    
159     Example: Read 15 bytes at offset 7 into scalar C<$buffer>, strating at
160     offset C<0> within the scalar:
161    
162     aio_read $fh, 7, 15, $buffer, 0, sub {
163     $_[0] >= 0 or die "read error: $!";
164     print "read <$buffer>\n";
165     };
166    
167     =item aio_readahead $fh,$offset,$length, $callback
168    
169     Asynchronously reads the specified byte range into the page cache, using
170     the C<readahead> syscall. If that syscall doesn't exist the status will be
171     C<-1> and C<$!> is set to ENOSYS.
172    
173     readahead() populates the page cache with data from a file so that
174     subsequent reads from that file will not block on disk I/O. The C<$offset>
175     argument specifies the starting point from which data is to be read and
176     C<$length> specifies the number of bytes to be read. I/O is performed in
177     whole pages, so that offset is effectively rounded down to a page boundary
178     and bytes are read up to the next page boundary greater than or equal to
179     (off-set+length). aio_readahead() does not read beyond the end of the
180     file. The current file offset of the file is left unchanged.
181    
182     =item aio_stat $fh_or_path, $callback
183    
184     =item aio_lstat $fh, $callback
185    
186     Works like perl's C<stat> or C<lstat> in void context. The callback will
187     be called after the stat and the results will be available using C<stat _>
188     or C<-s _> etc...
189    
190     The pathname passed to C<aio_stat> must be absolute. See API NOTES, above,
191     for an explanation.
192    
193     Currently, the stats are always 64-bit-stats, i.e. instead of returning an
194     error when stat'ing a large file, the results will be silently truncated
195     unless perl itself is compiled with large file support.
196    
197     Example: Print the length of F</etc/passwd>:
198    
199     aio_stat "/etc/passwd", sub {
200     $_[0] and die "stat failed: $!";
201     print "size is ", -s _, "\n";
202     };
203    
204     =item aio_unlink $pathname, $callback
205    
206     Asynchronously unlink (delete) a file and call the callback with the
207     result code.
208    
209     =item aio_fsync $fh, $callback
210    
211     Asynchronously call fsync on the given filehandle and call the callback
212     with the fsync result code.
213    
214     =item aio_fdatasync $fh, $callback
215    
216     Asynchronously call fdatasync on the given filehandle and call the
217     callback with the fdatasync result code.
218    
219     =cut
220    
221     min_parallel 4;
222    
223     END {
224     max_parallel 0;
225     }
226    
227     1;
228    
229     =back
230    
231     =head1 BUGS
232    
233     - aio_open gives a fd, but all other functions expect a perl filehandle.
234    
235     =head1 SEE ALSO
236    
237     L<Coro>, L<Linux::AIO>.
238    
239     =head1 AUTHOR
240    
241     Marc Lehmann <schmorp@schmorp.de>
242     http://home.schmorp.de/
243    
244     =cut
245