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.48 by root, Thu Feb 16 16:38:57 2006 UTC vs.
Revision 1.51 by root, Sat Jun 24 19:14:04 2006 UTC

61=cut 61=cut
62 62
63package IO::AIO; 63package IO::AIO;
64 64
65no warnings; 65no warnings;
66use strict 'vars';
66 67
67use base 'Exporter'; 68use base 'Exporter';
68 69
69use Fcntl ();
70
71BEGIN { 70BEGIN {
72 $VERSION = '1.72'; 71 our $VERSION = '1.8';
73 72
74 @EXPORT = qw(aio_sendfile aio_read aio_write aio_open aio_close aio_stat 73 our @EXPORT = qw(aio_sendfile aio_read aio_write aio_open aio_close aio_stat
75 aio_lstat aio_unlink aio_rmdir aio_readdir aio_scandir aio_symlink 74 aio_lstat aio_unlink aio_rmdir aio_readdir aio_scandir aio_symlink
76 aio_fsync aio_fdatasync aio_readahead); 75 aio_fsync aio_fdatasync aio_readahead aio_rename aio_link aio_move);
77 @EXPORT_OK = qw(poll_fileno poll_cb min_parallel max_parallel 76 our @EXPORT_OK = qw(poll_fileno poll_cb min_parallel max_parallel max_outstanding nreqs);
78 max_outstanding nreqs);
79 77
80 require XSLoader; 78 require XSLoader;
81 XSLoader::load IO::AIO, $VERSION; 79 XSLoader::load ("IO::AIO", $VERSION);
82} 80}
83 81
84=head1 FUNCTIONS 82=head1 FUNCTIONS
85 83
86=head2 AIO FUNCTIONS 84=head2 AIO FUNCTIONS
168 aio_read $fh, 7, 15, $buffer, 0, sub { 166 aio_read $fh, 7, 15, $buffer, 0, sub {
169 $_[0] > 0 or die "read error: $!"; 167 $_[0] > 0 or die "read error: $!";
170 print "read $_[0] bytes: <$buffer>\n"; 168 print "read $_[0] bytes: <$buffer>\n";
171 }; 169 };
172 170
171=item aio_move $srcpath, $dstpath, $callback->($status)
172
173[EXPERIMENTAL]
174
175Try to move the I<file> (directories not supported as either source or destination)
176from C<$srcpath> to C<$dstpath> and call the callback with the C<0> (error) or C<-1> ok.
177
178This is a composite request that tries to rename(2) the file first. If
179rename files with C<EXDEV>, it creates the destination file with mode 0200
180and copies the contents of the source file into it using C<aio_sendfile>,
181followed by restoring atime, mtime, access mode and uid/gid, in that
182order, and unlinking the C<$srcpath>.
183
184If an error occurs, the partial destination file will be unlinked, if
185possible, except when setting atime, mtime, access mode and uid/gid, where
186errors are being ignored.
187
188=cut
189
190sub aio_move($$$) {
191 my ($src, $dst, $cb) = @_;
192
193 aio_rename $src, $dst, sub {
194 if ($_[0] && $! == EXDEV) {
195 aio_open $src, O_RDONLY, 0, sub {
196 if (my $src_fh = $_[0]) {
197 my @stat = stat $src_fh;
198
199 aio_open $dst, O_WRONLY, 0200, sub {
200 if (my $dst_fh = $_[0]) {
201 aio_sendfile $dst_fh, $src_fh, 0, $stat[7], sub {
202 close $src_fh;
203
204 if ($_[0] == $stat[7]) {
205 utime $stat[8], $stat[9], $dst;
206 chmod $stat[2] & 07777, $dst_fh;
207 chown $stat[4], $stat[5], $dst_fh;
208 close $dst_fh;
209
210 aio_unlink $src, sub {
211 $cb->($_[0]);
212 };
213 } else {
214 my $errno = $!;
215 aio_unlink $dst, sub {
216 $! = $errno;
217 $cb->(-1);
218 };
219 }
220 };
221 } else {
222 $cb->(-1);
223 }
224 },
225
226 } else {
227 $cb->(-1);
228 }
229 };
230 } else {
231 $cb->($_[0]);
232 }
233 };
234}
235
173=item aio_sendfile $out_fh, $in_fh, $in_offset, $length, $callback->($retval) 236=item aio_sendfile $out_fh, $in_fh, $in_offset, $length, $callback->($retval)
174 237
175Tries to copy C<$length> bytes from C<$in_fh> to C<$out_fh>. It starts 238Tries to copy C<$length> bytes from C<$in_fh> to C<$out_fh>. It starts
176reading at byte offset C<$in_offset>, and starts writing at the current 239reading at byte offset C<$in_offset>, and starts writing at the current
177file offset of C<$out_fh>. Because of that, it is not safe to issue more 240file offset of C<$out_fh>. Because of that, it is not safe to issue more
231 294
232=item aio_unlink $pathname, $callback->($status) 295=item aio_unlink $pathname, $callback->($status)
233 296
234Asynchronously unlink (delete) a file and call the callback with the 297Asynchronously unlink (delete) a file and call the callback with the
235result code. 298result code.
299
300=item aio_link $srcpath, $dstpath, $callback->($status)
301
302Asynchronously create a new link to the existing object at C<$srcpath> at
303the path C<$dstpath> and call the callback with the result code.
304
305=item aio_symlink $srcpath, $dstpath, $callback->($status)
306
307Asynchronously create a new symbolic link to the existing object at C<$srcpath> at
308the path C<$dstpath> and call the callback with the result code.
309
310=item aio_rename $srcpath, $dstpath, $callback->($status)
311
312Asynchronously rename the object at C<$srcpath> to C<$dstpath>, just as
313rename(2) and call the callback with the result code.
236 314
237=item aio_rmdir $pathname, $callback->($status) 315=item aio_rmdir $pathname, $callback->($status)
238 316
239Asynchronously rmdir (delete) a directory and call the callback with the 317Asynchronously rmdir (delete) a directory and call the callback with the
240result code. 318result code.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines