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.49 by root, Wed Mar 1 23:56:54 2006 UTC vs.
Revision 1.50 by root, Sat Jun 24 16:27:02 2006 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines