--- IO-AIO/AIO.pm 2006/12/31 17:07:32 1.98 +++ IO-AIO/AIO.pm 2007/01/07 21:36:58 1.100 @@ -192,12 +192,12 @@ use base 'Exporter'; BEGIN { - our $VERSION = '2.31'; + our $VERSION = '2.32'; 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_scandir aio_symlink aio_readlink aio_fsync aio_fdatasync aio_readahead aio_rename aio_link - aio_move aio_copy aio_group aio_nop aio_mknod aio_load); + aio_move aio_copy aio_group aio_nop aio_mknod aio_load aio_rmtree); our @EXPORT = (@AIO_REQ, qw(aioreq_pri aioreq_nice aio_block)); our @EXPORT_OK = qw(poll_fileno poll_cb poll_wait flush min_parallel max_parallel max_idle @@ -636,7 +636,7 @@ =cut -sub aio_scandir($$$) { +sub aio_scandir($$;$) { aio_block { my ($path, $maxreq, $cb) = @_; @@ -721,6 +721,43 @@ }; $grp + } +} + +=item aio_rmtree $path, $callback->($status) + +Delete a directory tree starting (and including) C<$path>, return the +status of the final C only. This is a composite request that +uses C to recurse into and rmdir directories, and unlink +everything else. + +=cut + +sub aio_rmtree; +sub aio_rmtree($;$) { + aio_block { + my ($path, $cb) = @_; + + my $pri = aioreq_pri; + my $grp = aio_group $cb; + + aioreq_pri $pri; + add $grp aio_scandir $path, 0, sub { + my ($dirs, $nondirs) = @_; + + my $dirgrp = aio_group sub { + add $grp aio_rmdir $path, sub { + $grp->result ($_[0]); + }; + }; + + (aioreq_pri $pri), add $dirgrp aio_rmtree "$path/$_" for @$dirs; + (aioreq_pri $pri), add $dirgrp aio_unlink "$path/$_" for @$nondirs; + + add $grp $dirgrp; + }; + + $grp } }