--- IO-AIO/AIO.pm 2009/06/06 17:25:13 1.148 +++ IO-AIO/AIO.pm 2009/06/14 20:36:59 1.155 @@ -195,7 +195,7 @@ use base 'Exporter'; BEGIN { - our $VERSION = '3.19'; + 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 @@ -550,51 +550,56 @@ =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 find directories, or you want to find all directories while avoiding to stat() each entry. -=item AIO::READDIR_STAT_ORDER +If the system returns type information in readdir, then this is used +to find directories directly. Otherwise, likely directories are files +beginning with ".", or otherwise files with no dots, of which files with +short names are tried first. + +=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 @@ -772,20 +777,24 @@ The C cannot be avoided, but C'ing every entry can. -After reading the directory, the modification time, size etc. of the -directory before and after the readdir is checked, and if they match (and -isn't the current time), the link count will be used to decide how many -entries are directories (if >= 2). Otherwise, no knowledge of the number -of subdirectories will be assumed. - -Then entries will be sorted into likely directories (everything without -a non-initial dot currently) and likely non-directories (everything -else). Then every entry plus an appended C will be C'ed, -likely directories first. If that succeeds, it assumes that the entry -is a directory or a symlink to directory (which will be checked +If readdir returns file type information, then this is used directly to +find directories. + +Otherwise, after reading the directory, the modification time, size etc. +of the directory before and after the readdir is checked, and if they +match (and isn't the current time), the link count will be used to decide +how many entries are directories (if >= 2). Otherwise, no knowledge of the +number of subdirectories will be assumed. + +Then entries will be sorted into likely directories a non-initial dot +currently) and likely non-directories (see C). Then every +entry plus an appended C will be C'ed, likely directories first, +in order of their inode numbers. If that succeeds, it assumes that the +entry is a directory or a symlink to directory (which will be checked seperately). This is often faster than stat'ing the entry itself because filesystems might detect the type of the entry without reading the inode -data (e.g. ext2fs filetype feature). +data (e.g. ext2fs filetype feature), even on systems that cannot return +the filetype information on readdir. If the known number of directories (link count - 2) has been reached, the rest of the entries is assumed to be non-directories. @@ -833,18 +842,11 @@ $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); } - # sort into likely dirs and likely nondirs - # dirs == files without ".", short entries first - $entries = [map $_->[0], - sort { $b->[1] cmp $a->[1] } - map [$_, sprintf "%s%04d", (/.\./ ? "1" : "0"), length], - @$entries]; - my (@dirs, @nondirs); my $statgrp = add $grp aio_group sub { @@ -854,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 { @@ -1045,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->(...)