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.148 by root, Sat Jun 6 17:25:13 2009 UTC vs.
Revision 1.149 by root, Sat Jun 6 18:19:35 2009 UTC

193use strict 'vars'; 193use strict 'vars';
194 194
195use base 'Exporter'; 195use base 'Exporter';
196 196
197BEGIN { 197BEGIN {
198 our $VERSION = '3.19'; 198 our $VERSION = '3.2';
199 199
200 our @AIO_REQ = qw(aio_sendfile aio_read aio_write aio_open aio_close 200 our @AIO_REQ = qw(aio_sendfile aio_read aio_write aio_open aio_close
201 aio_stat aio_lstat aio_unlink aio_rmdir aio_readdir aio_readdirx 201 aio_stat aio_lstat aio_unlink aio_rmdir aio_readdir aio_readdirx
202 aio_scandir aio_symlink aio_readlink aio_sync aio_fsync 202 aio_scandir aio_symlink aio_readlink aio_sync aio_fsync
203 aio_fdatasync aio_sync_file_range aio_pathsync aio_readahead 203 aio_fdatasync aio_sync_file_range aio_pathsync aio_readahead
577 577
578When this flag is set, then the names will be returned in an order where 578When this flag is set, then the names will be returned in an order where
579likely directories come first. This is useful when you need to quickly 579likely directories come first. This is useful when you need to quickly
580find directories, or you want to find all directories while avoiding to 580find directories, or you want to find all directories while avoiding to
581stat() each entry. 581stat() each entry.
582
583If the system returns type information in readdir, then this is used
584to find directories directly. Otherwise, likely directories are files
585beginning with ".", or otherwise files with no dots, of which files with
586short names are tried first.
582 587
583=item AIO::READDIR_STAT_ORDER 588=item AIO::READDIR_STAT_ORDER
584 589
585When this flag is set, then the names will be returned in an order 590When this flag is set, then the names will be returned in an order
586suitable for stat()'ing each one. That is, when you plan to stat() 591suitable for stat()'ing each one. That is, when you plan to stat()
770 775
771Implementation notes. 776Implementation notes.
772 777
773The C<aio_readdir> cannot be avoided, but C<stat()>'ing every entry can. 778The C<aio_readdir> cannot be avoided, but C<stat()>'ing every entry can.
774 779
780If readdir returns file type information, then this is used directly to
781find directories.
782
775After reading the directory, the modification time, size etc. of the 783Otherwise, after reading the directory, the modification time, size etc.
776directory before and after the readdir is checked, and if they match (and 784of the directory before and after the readdir is checked, and if they
777isn't the current time), the link count will be used to decide how many 785match (and isn't the current time), the link count will be used to decide
778entries are directories (if >= 2). Otherwise, no knowledge of the number 786how many entries are directories (if >= 2). Otherwise, no knowledge of the
779of subdirectories will be assumed. 787number of subdirectories will be assumed.
780 788
781Then entries will be sorted into likely directories (everything without 789Then entries will be sorted into likely directories a non-initial dot
782a non-initial dot currently) and likely non-directories (everything 790currently) and likely non-directories (see C<aio_readdirx>). Then every
783else). Then every entry plus an appended C</.> will be C<stat>'ed, 791entry plus an appended C</.> will be C<stat>'ed, likely directories first,
784likely directories first. If that succeeds, it assumes that the entry 792in order of their inode numbers. If that succeeds, it assumes that the
785is a directory or a symlink to directory (which will be checked 793entry is a directory or a symlink to directory (which will be checked
786seperately). This is often faster than stat'ing the entry itself because 794seperately). This is often faster than stat'ing the entry itself because
787filesystems might detect the type of the entry without reading the inode 795filesystems might detect the type of the entry without reading the inode
788data (e.g. ext2fs filetype feature). 796data (e.g. ext2fs filetype feature), even on systems that cannot return
797the filetype information on readdir.
789 798
790If the known number of directories (link count - 2) has been reached, the 799If the known number of directories (link count - 2) has been reached, the
791rest of the entries is assumed to be non-directories. 800rest of the entries is assumed to be non-directories.
792 801
793This only works with certainty on POSIX (= UNIX) filesystems, which 802This only works with certainty on POSIX (= UNIX) filesystems, which
835 # if nlink == 2, we are finished 844 # if nlink == 2, we are finished
836 # on non-posix-fs's, we rely on nlink < 2 845 # on non-posix-fs's, we rely on nlink < 2
837 $ndirs = (stat _)[3] - 2 846 $ndirs = (stat _)[3] - 2
838 or return $grp->result ([], $entries); 847 or return $grp->result ([], $entries);
839 } 848 }
840
841 # sort into likely dirs and likely nondirs
842 # dirs == files without ".", short entries first
843 $entries = [map $_->[0],
844 sort { $b->[1] cmp $a->[1] }
845 map [$_, sprintf "%s%04d", (/.\./ ? "1" : "0"), length],
846 @$entries];
847 849
848 my (@dirs, @nondirs); 850 my (@dirs, @nondirs);
849 851
850 my $statgrp = add $grp aio_group sub { 852 my $statgrp = add $grp aio_group sub {
851 $grp->result (\@dirs, \@nondirs); 853 $grp->result (\@dirs, \@nondirs);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines