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.145 by root, Sun Apr 19 19:20:10 2009 UTC vs.
Revision 1.148 by root, Sat Jun 6 17:25:13 2009 UTC

193use strict 'vars'; 193use strict 'vars';
194 194
195use base 'Exporter'; 195use base 'Exporter';
196 196
197BEGIN { 197BEGIN {
198 our $VERSION = '3.18'; 198 our $VERSION = '3.19';
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 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
204 aio_rename aio_link aio_move aio_copy aio_group 204 aio_rename aio_link aio_move aio_copy aio_group
205 aio_nop aio_mknod aio_load aio_rmtree aio_mkdir aio_chown 205 aio_nop aio_mknod aio_load aio_rmtree aio_mkdir aio_chown
206 aio_chmod aio_utime aio_truncate); 206 aio_chmod aio_utime aio_truncate);
342 342
343Reads or writes C<$length> bytes from or to the specified C<$fh> and 343Reads or writes C<$length> bytes from or to the specified C<$fh> and
344C<$offset> into the scalar given by C<$data> and offset C<$dataoffset> 344C<$offset> into the scalar given by C<$data> and offset C<$dataoffset>
345and calls the callback without the actual number of bytes read (or -1 on 345and calls the callback without the actual number of bytes read (or -1 on
346error, just like the syscall). 346error, just like the syscall).
347
348C<aio_read> will, like C<sysread>, shrink or grow the C<$data> scalar to
349offset plus the actual number of bytes read.
347 350
348If C<$offset> is undefined, then the current file descriptor offset will 351If C<$offset> is undefined, then the current file descriptor offset will
349be used (and updated), otherwise the file descriptor offset will not be 352be used (and updated), otherwise the file descriptor offset will not be
350changed by these calls. 353changed by these calls.
351 354
530 533
531Unlike the POSIX call of the same name, C<aio_readdir> reads an entire 534Unlike the POSIX call of the same name, C<aio_readdir> reads an entire
532directory (i.e. opendir + readdir + closedir). The entries will not be 535directory (i.e. opendir + readdir + closedir). The entries will not be
533sorted, and will B<NOT> include the C<.> and C<..> entries. 536sorted, and will B<NOT> include the C<.> and C<..> entries.
534 537
535The callback a single argument which is either C<undef> or an array-ref 538The callback is passed a single argument which is either C<undef> or an
536with the filenames. 539array-ref with the filenames.
540
541
542=item aio_readdirx $pathname, $flags, $callback->($entries, $flags)
543
544Quite similar to C<aio_readdir>, but the C<$flags> argument allows to tune
545behaviour and output format. In case of an error, C<$entries> will be
546C<undef>.
547
548The flags are a combination of the following constants, ORed together (the
549flags will also be passed to the callback, possibly modified):
550
551=over 4
552
553=item AIO::READDIR_DENTS
554
555When this flag is off, then the callback gets an arrayref with of names
556only (as with C<aio_readdir>), otherwise it gets an arrayref with
557C<[$name, $inode, $type]> arrayrefs, each describing a single directory
558entry in more detail.
559
560C<$name> is the name of the entry.
561
562C<$inode> is the inode number (which might not be exact on systems with 64
563bit inode numbers and 32 bit perls). On systems that do not deliver the
564inode information, this will always be zero.
565
566C<$type> is one of the C<AIO::DT_xxx> constants:
567
568C<AIO::DT_UNKNOWN>, C<AIO::DT_FIFO>, C<AIO::DT_CHR>, C<AIO::DT_DIR>,
569C<AIO::DT_BLK>, C<AIO::DT_REG>, C<AIO::DT_LNK>, C<AIO::DT_SOCK>,
570C<AIO::DT_WHT>.
571
572C<AIO::DT_UNKNOWN> means just that: readdir does not know. If you need to
573know, you have to run stat yourself. Also, for speed reasons, the C<$type>
574scalars are read-only: you can not modify them.
575
576=item AIO::READDIR_DIRS_FIRST
577
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
580find directories, or you want to find all directories while avoiding to
581stat() each entry.
582
583=item AIO::READDIR_STAT_ORDER
584
585When 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()
587all files in the given directory, then the returned order will likely
588be fastest.
589
590If both this flag and IO::READDIR_DIRS_FIRST are specified, then the
591likely dirs come first, resulting in a less optimal stat order.
592
593=item AIO::READDIR_FOUND_UNKNOWN
594
595This flag should not be set when calling C<aio_readdirx>. Instead, it
596is being set by C<aio_readdirx>, when any of the C<$type>'s found were
597C<AIO::DT_UNKNOWN>. The absense of this flag therefore indicates that all
598C<$type>'s are known, which can be used to speed up some algorithms.
599
600=back
537 601
538 602
539=item aio_load $path, $data, $callback->($status) 603=item aio_load $path, $data, $callback->($status)
540 604
541This is a composite request that tries to fully load the given file into 605This is a composite request that tries to fully load the given file into
588 my $grp = aio_group $cb; 652 my $grp = aio_group $cb;
589 653
590 aioreq_pri $pri; 654 aioreq_pri $pri;
591 add $grp aio_open $src, O_RDONLY, 0, sub { 655 add $grp aio_open $src, O_RDONLY, 0, sub {
592 if (my $src_fh = $_[0]) { 656 if (my $src_fh = $_[0]) {
593 my @stat = stat $src_fh; 657 my @stat = stat $src_fh; # hmm, might bock over nfs?
594 658
595 aioreq_pri $pri; 659 aioreq_pri $pri;
596 add $grp aio_open $dst, O_CREAT | O_WRONLY | O_TRUNC, 0200, sub { 660 add $grp aio_open $dst, O_CREAT | O_WRONLY | O_TRUNC, 0200, sub {
597 if (my $dst_fh = $_[0]) { 661 if (my $dst_fh = $_[0]) {
598 aioreq_pri $pri; 662 aioreq_pri $pri;
599 add $grp aio_sendfile $dst_fh, $src_fh, 0, $stat[7], sub { 663 add $grp aio_sendfile $dst_fh, $src_fh, 0, $stat[7], sub {
600 if ($_[0] == $stat[7]) { 664 if ($_[0] == $stat[7]) {
601 $grp->result (0); 665 $grp->result (0);
602 close $src_fh; 666 close $src_fh;
603 667
604 # those should not normally block. should. should. 668 my $ch = sub {
605 utime $stat[8], $stat[9], $dst; 669 aioreq_pri $pri;
606 chmod $stat[2] & 07777, $dst_fh; 670 add $grp aio_chmod $dst_fh, $stat[2] & 07777, sub {
607 chown $stat[4], $stat[5], $dst_fh; 671 aioreq_pri $pri;
672 add $grp aio_chown $dst_fh, $stat[4], $stat[5], sub {
673 aioreq_pri $pri;
674 add $grp aio_close $dst_fh;
675 }
676 };
677 };
608 678
609 aioreq_pri $pri; 679 aioreq_pri $pri;
610 add $grp aio_close $dst_fh; 680 add $grp aio_utime $dst_fh, $stat[8], $stat[9], sub {
681 if ($_[0] < 0 && $! == ENOSYS) {
682 aioreq_pri $pri;
683 add $grp aio_utime $dst, $stat[8], $stat[9], $ch;
684 } else {
685 $ch->();
686 }
687 };
611 } else { 688 } else {
612 $grp->result (-1); 689 $grp->result (-1);
613 close $src_fh; 690 close $src_fh;
614 close $dst_fh; 691 close $dst_fh;
615 692
738 my $now = time; 815 my $now = time;
739 my $hash1 = join ":", (stat _)[0,1,3,7,9]; 816 my $hash1 = join ":", (stat _)[0,1,3,7,9];
740 817
741 # read the directory entries 818 # read the directory entries
742 aioreq_pri $pri; 819 aioreq_pri $pri;
743 add $grp aio_readdir $path, sub { 820 add $grp aio_readdirx $path, READDIR_DIRS_FIRST, sub {
744 my $entries = shift 821 my $entries = shift
745 or return $grp->result (); 822 or return $grp->result ();
746 823
747 # stat the dir another time 824 # stat the dir another time
748 aioreq_pri $pri; 825 aioreq_pri $pri;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines