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

# Content
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