ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-AIO/AIO.pm
(Generate patch)

Comparing IO-AIO/AIO.pm (file contents):
Revision 1.86 by root, Sat Oct 28 23:32:29 2006 UTC vs.
Revision 1.91 by root, Mon Oct 30 23:30:29 2006 UTC

61etc.), but can also be used to easily do operations in parallel that are 61etc.), but can also be used to easily do operations in parallel that are
62normally done sequentially, e.g. stat'ing many files, which is much faster 62normally done sequentially, e.g. stat'ing many files, which is much faster
63on a RAID volume or over NFS when you do a number of stat operations 63on a RAID volume or over NFS when you do a number of stat operations
64concurrently. 64concurrently.
65 65
66While this works on all types of file descriptors (for example sockets), 66While most of this works on all types of file descriptors (for example
67using these functions on file descriptors that support nonblocking 67sockets), using these functions on file descriptors that support
68operation (again, sockets, pipes etc.) is very inefficient. Use an event 68nonblocking operation (again, sockets, pipes etc.) is very inefficient or
69might not work (aio_read fails on sockets/pipes/fifos). Use an event loop
69loop for that (such as the L<Event|Event> module): IO::AIO will naturally 70for that (such as the L<Event|Event> module): IO::AIO will naturally fit
70fit into such an event loop itself. 71into such an event loop itself.
71 72
72In this version, a number of threads are started that execute your 73In this version, a number of threads are started that execute your
73requests and signal their completion. You don't need thread support 74requests and signal their completion. You don't need thread support
74in perl, and the threads created by this module will not be visible 75in perl, and the threads created by this module will not be visible
75to perl. In the future, this module might make use of the native aio 76to perl. In the future, this module might make use of the native aio
176Request has reached the end of its lifetime and holds no resources anymore 177Request has reached the end of its lifetime and holds no resources anymore
177(except possibly for the Perl object, but its connection to the actual 178(except possibly for the Perl object, but its connection to the actual
178aio request is severed and calling its methods will either do nothing or 179aio request is severed and calling its methods will either do nothing or
179result in a runtime error). 180result in a runtime error).
180 181
182=back
183
181=cut 184=cut
182 185
183package IO::AIO; 186package IO::AIO;
184 187
185no warnings; 188no warnings;
186use strict 'vars'; 189use strict 'vars';
187 190
188use base 'Exporter'; 191use base 'Exporter';
189 192
190BEGIN { 193BEGIN {
191 our $VERSION = '2.1'; 194 our $VERSION = '2.2';
192 195
193 our @AIO_REQ = qw(aio_sendfile aio_read aio_write aio_open aio_close aio_stat 196 our @AIO_REQ = qw(aio_sendfile aio_read aio_write aio_open aio_close aio_stat
194 aio_lstat aio_unlink aio_rmdir aio_readdir aio_scandir aio_symlink 197 aio_lstat aio_unlink aio_rmdir aio_readdir aio_scandir aio_symlink
195 aio_fsync aio_fdatasync aio_readahead aio_rename aio_link aio_move 198 aio_readlink aio_fsync aio_fdatasync aio_readahead aio_rename aio_link
196 aio_copy aio_group aio_nop aio_mknod); 199 aio_move aio_copy aio_group aio_nop aio_mknod);
197 our @EXPORT = (@AIO_REQ, qw(aioreq_pri aioreq_nice)); 200 our @EXPORT = (@AIO_REQ, qw(aioreq_pri aioreq_nice));
198 our @EXPORT_OK = qw(poll_fileno poll_cb poll_wait flush 201 our @EXPORT_OK = qw(poll_fileno poll_cb poll_wait flush
199 min_parallel max_parallel max_idle 202 min_parallel max_parallel max_idle
200 nreqs nready npending nthreads 203 nreqs nready npending nthreads
201 max_poll_time max_poll_reqs); 204 max_poll_time max_poll_reqs);
206 XSLoader::load ("IO::AIO", $VERSION); 209 XSLoader::load ("IO::AIO", $VERSION);
207} 210}
208 211
209=head1 FUNCTIONS 212=head1 FUNCTIONS
210 213
211=head2 AIO FUNCTIONS 214=head2 AIO REQUEST FUNCTIONS
212 215
213All the C<aio_*> calls are more or less thin wrappers around the syscall 216All the C<aio_*> calls are more or less thin wrappers around the syscall
214with the same name (sans C<aio_>). The arguments are similar or identical, 217with the same name (sans C<aio_>). The arguments are similar or identical,
215and they all accept an additional (and optional) C<$callback> argument 218and they all accept an additional (and optional) C<$callback> argument
216which must be a code reference. This code reference will get called with 219which must be a code reference. This code reference will get called with
219syscall has been executed asynchronously. 222syscall has been executed asynchronously.
220 223
221All functions expecting a filehandle keep a copy of the filehandle 224All functions expecting a filehandle keep a copy of the filehandle
222internally until the request has finished. 225internally until the request has finished.
223 226
224All requests return objects of type L<IO::AIO::REQ> that allow further 227All functions return request objects of type L<IO::AIO::REQ> that allow
225manipulation of those requests while they are in-flight. 228further manipulation of those requests while they are in-flight.
226 229
227The pathnames you pass to these routines I<must> be absolute and 230The pathnames you pass to these routines I<must> be absolute and
228encoded in byte form. The reason for the former is that at the time the 231encoded as octets. The reason for the former is that at the time the
229request is being executed, the current working directory could have 232request is being executed, the current working directory could have
230changed. Alternatively, you can make sure that you never change the 233changed. Alternatively, you can make sure that you never change the
231current working directory. 234current working directory anywhere in the program and then use relative
235paths.
232 236
233To encode pathnames to byte form, either make sure you either: a) 237To encode pathnames as octets, either make sure you either: a) always pass
234always pass in filenames you got from outside (command line, readdir 238in filenames you got from outside (command line, readdir etc.) without
235etc.), b) are ASCII or ISO 8859-1, c) use the Encode module and encode 239tinkering, b) are ASCII or ISO 8859-1, c) use the Encode module and encode
236your pathnames to the locale (or other) encoding in effect in the user 240your pathnames to the locale (or other) encoding in effect in the user
237environment, d) use Glib::filename_from_unicode on unicode filenames or e) 241environment, d) use Glib::filename_from_unicode on unicode filenames or e)
238use something else. 242use something else to ensure your scalar has the correct contents.
243
244This works, btw. independent of the internal UTF-8 bit, which IO::AIO
245handles correctly wether it is set or not.
239 246
240=over 4 247=over 4
241 248
242=item $prev_pri = aioreq_pri [$pri] 249=item $prev_pri = aioreq_pri [$pri]
243 250
266 }; 273 };
267 274
268=item aioreq_nice $pri_adjust 275=item aioreq_nice $pri_adjust
269 276
270Similar to C<aioreq_pri>, but subtracts the given value from the current 277Similar to C<aioreq_pri>, but subtracts the given value from the current
271priority, so effects are cumulative. 278priority, so the effect is cumulative.
272 279
273=item aio_open $pathname, $flags, $mode, $callback->($fh) 280=item aio_open $pathname, $flags, $mode, $callback->($fh)
274 281
275Asynchronously open or create a file and call the callback with a newly 282Asynchronously open or create a file and call the callback with a newly
276created filehandle for the file. 283created filehandle for the file.
410 417
411=item aio_symlink $srcpath, $dstpath, $callback->($status) 418=item aio_symlink $srcpath, $dstpath, $callback->($status)
412 419
413Asynchronously create a new symbolic link to the existing object at C<$srcpath> at 420Asynchronously create a new symbolic link to the existing object at C<$srcpath> at
414the path C<$dstpath> and call the callback with the result code. 421the path C<$dstpath> and call the callback with the result code.
422
423=item aio_readlink $path, $callback->($link)
424
425Asynchronously read the symlink specified by C<$path> and pass it to
426the callback. If an error occurs, nothing or undef gets passed to the
427callback.
415 428
416=item aio_rename $srcpath, $dstpath, $callback->($status) 429=item aio_rename $srcpath, $dstpath, $callback->($status)
417 430
418Asynchronously rename the object at C<$srcpath> to C<$dstpath>, just as 431Asynchronously rename the object at C<$srcpath> to C<$dstpath>, just as
419rename(2) and call the callback with the result code. 432rename(2) and call the callback with the result code.
933that are being processed by C<IO::AIO::poll_cb> in one call, respectively 946that are being processed by C<IO::AIO::poll_cb> in one call, respectively
934the maximum amount of time (default C<0>, meaning infinity) spent in 947the maximum amount of time (default C<0>, meaning infinity) spent in
935C<IO::AIO::poll_cb> to process requests (more correctly the mininum amount 948C<IO::AIO::poll_cb> to process requests (more correctly the mininum amount
936of time C<poll_cb> is allowed to use). 949of time C<poll_cb> is allowed to use).
937 950
951Setting C<max_poll_time> to a non-zero value creates an overhead of one
952syscall per request processed, which is not normally a problem unless your
953callbacks are really really fast or your OS is really really slow (I am
954not mentioning Solaris here). Using C<max_poll_reqs> incurs no overhead.
955
938Setting these is useful if you want to ensure some level of 956Setting these is useful if you want to ensure some level of
939interactiveness when perl is not fast enough to process all requests in 957interactiveness when perl is not fast enough to process all requests in
940time. 958time.
941 959
942For interactive programs, values such as C<0.01> to C<0.1> should be fine. 960For interactive programs, values such as C<0.01> to C<0.1> should be fine.
943 961
944Example: Install an Event watcher that automatically calls 962Example: Install an Event watcher that automatically calls
945IO::AIO::poll_some with low priority, to ensure that other parts of the 963IO::AIO::poll_cb with low priority, to ensure that other parts of the
946program get the CPU sometimes even under high AIO load. 964program get the CPU sometimes even under high AIO load.
947 965
948 # try not to spend much more than 0.1s in poll_cb 966 # try not to spend much more than 0.1s in poll_cb
949 IO::AIO::max_poll_time 0.1; 967 IO::AIO::max_poll_time 0.1;
950 968

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines