--- IO-AIO/AIO.pm 2009/06/06 18:19:35 1.149 +++ IO-AIO/AIO.pm 2009/06/17 01:14:48 1.157 @@ -32,7 +32,7 @@ use AnyEvent::AIO; # EV integration - my $w = EV::io IO::AIO::poll_fileno, EV::READ, \&IO::AIO::poll_cb; + my $aio_w = EV::io IO::AIO::poll_fileno, EV::READ, \&IO::AIO::poll_cb; # Event integration Event->io (fd => IO::AIO::poll_fileno, @@ -54,7 +54,8 @@ =head1 DESCRIPTION This module implements asynchronous I/O using whatever means your -operating system supports. +operating system supports. It is implemented as an interface to C +(L). Asynchronous means that operations that can normally block your program (e.g. reading from disk) will be done asynchronously: the operation @@ -68,8 +69,8 @@ While most of this works on all types of file descriptors (for example sockets), using these functions on file descriptors that -support nonblocking operation (again, sockets, pipes etc.) is very -inefficient. Use an event loop for that (such as the L +support nonblocking operation (again, sockets, pipes etc.) is +very inefficient. Use an event loop for that (such as the L module): IO::AIO will naturally fit into such an event loop itself. In this version, a number of threads are started that execute your @@ -89,17 +90,15 @@ =head2 EXAMPLE -This is a simple example that uses the Event module and loads +This is a simple example that uses the EV module and loads F asynchronously: use Fcntl; - use Event; + use EV; use IO::AIO; - # register the IO::AIO callback with Event - Event->io (fd => IO::AIO::poll_fileno, - poll => 'r', - cb => \&IO::AIO::poll_cb); + # register the IO::AIO callback with EV + my $aio_w = EV::io IO::AIO::poll_fileno, EV::READ, \&IO::AIO::poll_cb; # queue the request to open /etc/passwd aio_open "/etc/passwd", O_RDONLY, 0, sub { @@ -121,7 +120,7 @@ print $contents; # exit event loop and program - Event::unloop; + EV::unloop; }; }; @@ -129,7 +128,7 @@ # check for sockets etc. etc. # process events as long as there are some: - Event::loop; + EV::loop; =head1 REQUEST ANATOMY AND LIFETIME @@ -195,7 +194,7 @@ use base 'Exporter'; BEGIN { - our $VERSION = '3.2'; + our $VERSION = '3.23'; our @AIO_REQ = qw(aio_sendfile aio_read aio_write aio_open aio_close aio_stat aio_lstat aio_unlink aio_rmdir aio_readdir aio_readdirx @@ -209,7 +208,8 @@ our @EXPORT_OK = qw(poll_fileno poll_cb poll_wait flush min_parallel max_parallel max_idle nreqs nready npending nthreads - max_poll_time max_poll_reqs); + max_poll_time max_poll_reqs + sendfile fadvise); push @AIO_REQ, qw(aio_busy); # not exported @@ -550,30 +550,30 @@ =over 4 -=item AIO::READDIR_DENTS +=item IO::AIO::READDIR_DENTS When this flag is off, then the callback gets an arrayref with of names only (as with C), otherwise it gets an arrayref with -C<[$name, $inode, $type]> arrayrefs, each describing a single directory +C<[$name, $type, $inode]> arrayrefs, each describing a single directory entry in more detail. C<$name> is the name of the entry. -C<$inode> is the inode number (which might not be exact on systems with 64 -bit inode numbers and 32 bit perls). On systems that do not deliver the -inode information, this will always be zero. +C<$type> is one of the C constants: -C<$type> is one of the C constants: +C, C, C, C, +C, C, C, C, +C. -C, C, C, C, -C, C, C, C, -C. - -C means just that: readdir does not know. If you need to +C means just that: readdir does not know. If you need to know, you have to run stat yourself. Also, for speed reasons, the C<$type> scalars are read-only: you can not modify them. -=item AIO::READDIR_DIRS_FIRST +C<$inode> is the inode number (which might not be exact on systems with 64 +bit inode numbers and 32 bit perls). This field has unspecified content on +systems that do not deliver the inode information. + +=item IO::AIO::READDIR_DIRS_FIRST When this flag is set, then the names will be returned in an order where likely directories come first. This is useful when you need to quickly @@ -585,21 +585,21 @@ beginning with ".", or otherwise files with no dots, of which files with short names are tried first. -=item AIO::READDIR_STAT_ORDER +=item IO::AIO::READDIR_STAT_ORDER When this flag is set, then the names will be returned in an order suitable for stat()'ing each one. That is, when you plan to stat() all files in the given directory, then the returned order will likely be fastest. -If both this flag and IO::READDIR_DIRS_FIRST are specified, then the -likely dirs come first, resulting in a less optimal stat order. +If both this flag and C are specified, then +the likely dirs come first, resulting in a less optimal stat order. -=item AIO::READDIR_FOUND_UNKNOWN +=item IO::AIO::READDIR_FOUND_UNKNOWN This flag should not be set when calling C. Instead, it is being set by C, when any of the C<$type>'s found were -C. The absense of this flag therefore indicates that all +C. The absense of this flag therefore indicates that all C<$type>'s are known, which can be used to speed up some algorithms. =back @@ -842,7 +842,7 @@ $ndirs = -1; } else { # if nlink == 2, we are finished - # on non-posix-fs's, we rely on nlink < 2 + # for non-posix-fs's, we rely on nlink < 2 $ndirs = (stat _)[3] - 2 or return $grp->result ([], $entries); } @@ -856,7 +856,7 @@ limit $statgrp $maxreq; feed $statgrp sub { return unless @$entries; - my $entry = pop @$entries; + my $entry = shift @$entries; aioreq_pri $pri; add $statgrp aio_stat "$path/$entry/.", sub { @@ -1047,8 +1047,9 @@ Cancels the request, if possible. Has the effect of skipping execution when entering the B state and skipping calling the callback when entering the the B state, but will leave the request otherwise -untouched. That means that requests that currently execute will not be -stopped and resources held by the request will not be freed prematurely. +untouched (with the exception of readdir). That means that requests that +currently execute will not be stopped and resources held by the request +will not be freed prematurely. =item cb $req $callback->(...) @@ -1209,9 +1210,9 @@ =item $fileno = IO::AIO::poll_fileno Return the I. This filehandle must be -polled for reading by some mechanism outside this module (e.g. Event or -select, see below or the SYNOPSIS). If the pipe becomes readable you have -to call C to check the results. +polled for reading by some mechanism outside this module (e.g. EV, Glib, +select and so on, see below or the SYNOPSIS). If the pipe becomes readable +you have to call C to check the results. See C for an example. @@ -1228,7 +1229,8 @@ do anything special to have it called later. Example: Install an Event watcher that automatically calls -IO::AIO::poll_cb with high priority: +IO::AIO::poll_cb with high priority (more examples can be found in the +SYNOPSIS section, at the top of this document): Event->io (fd => IO::AIO::poll_fileno, poll => 'r', async => 1, @@ -1395,6 +1397,35 @@ =back +=head3 MISCELLANEOUS FUNCTIONS + +IO::AIO implements some functions that might be useful, but are not +asynchronous. + +=over 4 + +=item IO::AIO::sendfile $ofh, $ifh, $offset, $count + +Calls the C function, which is like C, +but is blocking (this makes most sense if you know the input data is +likely cached already and the output filehandle is set to non-blocking +operations). + +Returns the number of bytes copied, or C<-1> on error. + +=item IO::AIO::fadvise $fh, $offset, $len, $advice + +Simply calls the C function (see it's +manpage for details). The following advice constants are +avaiable: C, C, +C, C, +C, C. + +On systems that do not implement C, this function returns +ENOSYS, otherwise the return value of C. + +=back + =cut min_parallel 8;