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.111 by root, Mon Aug 13 12:08:13 2007 UTC vs.
Revision 1.120 by root, Sun Dec 2 21:51:36 2007 UTC

26 $req->cancel; # cancel request if still in queue 26 $req->cancel; # cancel request if still in queue
27 27
28 my $grp = aio_group sub { print "all stats done\n" }; 28 my $grp = aio_group sub { print "all stats done\n" };
29 add $grp aio_stat "..." for ...; 29 add $grp aio_stat "..." for ...;
30 30
31 # AnyEvent integration 31 # AnyEvent integration (EV, Event, Glib, Tk, urxvt, pureperl...)
32 open my $fh, "<&=" . IO::AIO::poll_fileno or die "$!"; 32 open my $fh, "<&=" . IO::AIO::poll_fileno or die "$!";
33 my $w = AnyEvent->io (fh => $fh, poll => 'r', cb => sub { IO::AIO::poll_cb }); 33 my $w = AnyEvent->io (fh => $fh, poll => 'r', cb => sub { IO::AIO::poll_cb });
34
35 # EV integration
36 my $w = EV::io IO::AIO::poll_fileno, EV::READ, \&IO::AIO::poll_cb;
34 37
35 # Event integration 38 # Event integration
36 Event->io (fd => IO::AIO::poll_fileno, 39 Event->io (fd => IO::AIO::poll_fileno,
37 poll => 'r', 40 poll => 'r',
38 cb => \&IO::AIO::poll_cb); 41 cb => \&IO::AIO::poll_cb);
183 186
184=cut 187=cut
185 188
186package IO::AIO; 189package IO::AIO;
187 190
191use Carp ();
192
188no warnings; 193no warnings;
189use strict 'vars'; 194use strict 'vars';
190 195
191use base 'Exporter'; 196use base 'Exporter';
192 197
193BEGIN { 198BEGIN {
194 our $VERSION = '2.4'; 199 our $VERSION = '2.6';
195 200
196 our @AIO_REQ = qw(aio_sendfile aio_read aio_write aio_open aio_close aio_stat 201 our @AIO_REQ = qw(aio_sendfile aio_read aio_write aio_open aio_close
197 aio_lstat aio_unlink aio_rmdir aio_readdir aio_scandir aio_symlink 202 aio_stat aio_lstat aio_unlink aio_rmdir aio_readdir
198 aio_readlink aio_fsync aio_fdatasync aio_readahead aio_rename aio_link 203 aio_scandir aio_symlink aio_readlink aio_sync aio_fsync
204 aio_fdatasync aio_pathsync aio_readahead
205 aio_rename aio_link aio_move aio_copy aio_group
199 aio_move aio_copy aio_group aio_nop aio_mknod aio_load aio_rmtree aio_mkdir 206 aio_nop aio_mknod aio_load aio_rmtree aio_mkdir aio_chown
200 aio_chown aio_chmod aio_utime aio_truncate); 207 aio_chmod aio_utime aio_truncate);
208
201 our @EXPORT = (@AIO_REQ, qw(aioreq_pri aioreq_nice aio_block)); 209 our @EXPORT = (@AIO_REQ, qw(aioreq_pri aioreq_nice aio_block));
202 our @EXPORT_OK = qw(poll_fileno poll_cb poll_wait flush 210 our @EXPORT_OK = qw(poll_fileno poll_cb poll_wait flush
203 min_parallel max_parallel max_idle 211 min_parallel max_parallel max_idle
204 nreqs nready npending nthreads 212 nreqs nready npending nthreads
205 max_poll_time max_poll_reqs); 213 max_poll_time max_poll_reqs);
311 319
312 320
313=item aio_close $fh, $callback->($status) 321=item aio_close $fh, $callback->($status)
314 322
315Asynchronously close a file and call the callback with the result 323Asynchronously close a file and call the callback with the result
316code. I<WARNING:> although accepted, you should not pass in a perl 324code.
317filehandle here, as perl will likely close the file descriptor another
318time when the filehandle is destroyed. Normally, you can safely call perls
319C<close> or just let filehandles go out of scope.
320 325
321This is supposed to be a bug in the API, so that might change. It's 326Unfortunately, you can't do this to perl. Perl I<insists> very strongly on
322therefore best to avoid this function. 327closing the file descriptor associated with the filehandle itself. Here is
328what aio_close will try:
329
330 1. dup()licate the fd
331 2. asynchronously close() the duplicated fd
332 3. dup()licate the fd once more
333 4. let perl close() the filehandle
334 5. asynchronously close the duplicated fd
335
336The idea is that the first close() flushes stuff to disk that closing an
337fd will flush, so when perl closes the fd, nothing much will need to be
338flushed. The second async. close() will then flush stuff to disk that
339closing the last fd to the file will flush.
340
341Just FYI, SuSv3 has this to say on close:
342
343 All outstanding record locks owned by the process on the file
344 associated with the file descriptor shall be removed.
345
346 If fildes refers to a socket, close() shall cause the socket to be
347 destroyed. ... close() shall block for up to the current linger
348 interval until all data is transmitted.
349 [this actually sounds like a specification bug, but who knows]
350
351And at least Linux additionally actually flushes stuff on every close,
352even when the file itself is still open.
353
354Sounds enourmously inefficient and complicated? Yes... please show me how
355to nuke perl's fd out of existence...
356
357=cut
358
359sub aio_close($;$) {
360 aio_block {
361 my ($fh, $cb) = @_;
362
363 my $pri = aioreq_pri;
364 my $grp = aio_group $cb;
365
366 my $fd = fileno $fh;
367
368 defined $fd or Carp::croak "aio_close called with fd-less filehandle";
369
370 # if the dups fail we will simply get EBADF
371 my $fd2 = _dup $fd;
372 aioreq_pri $pri;
373 add $grp _aio_close $fd2, sub {
374 my $fd2 = _dup $fd;
375 close $fh;
376 aioreq_pri $pri;
377 add $grp _aio_close $fd2, sub {
378 $grp->result ($_[0]);
379 };
380 };
381
382 $grp
383 }
384}
323 385
324 386
325=item aio_read $fh,$offset,$length, $data,$dataoffset, $callback->($retval) 387=item aio_read $fh,$offset,$length, $data,$dataoffset, $callback->($retval)
326 388
327=item aio_write $fh,$offset,$length, $data,$dataoffset, $callback->($retval) 389=item aio_write $fh,$offset,$length, $data,$dataoffset, $callback->($retval)
329Reads or writes C<$length> bytes from the specified C<$fh> and C<$offset> 391Reads or writes C<$length> bytes from the specified C<$fh> and C<$offset>
330into the scalar given by C<$data> and offset C<$dataoffset> and calls the 392into the scalar given by C<$data> and offset C<$dataoffset> and calls the
331callback without the actual number of bytes read (or -1 on error, just 393callback without the actual number of bytes read (or -1 on error, just
332like the syscall). 394like the syscall).
333 395
334If C<$offset> is undefined, then the current file offset will be used (and 396If C<$offset> is undefined, then the current file descriptor offset will
335updated), otherwise the file offset will not be changed by these calls. 397be used (and updated), otherwise the file descriptor offset will not be
398changed by these calls.
336 399
337If C<$length> is undefined in C<aio_write>, use the remaining length of C<$data>. 400If C<$length> is undefined in C<aio_write>, use the remaining length of C<$data>.
338 401
339If C<$dataoffset> is less than zero, it will be counted from the end of 402If C<$dataoffset> is less than zero, it will be counted from the end of
340C<$data>. 403C<$data>.
341 404
342The C<$data> scalar I<MUST NOT> be modified in any way while the request 405The C<$data> scalar I<MUST NOT> be modified in any way while the request
590 653
591 # those should not normally block. should. should. 654 # those should not normally block. should. should.
592 utime $stat[8], $stat[9], $dst; 655 utime $stat[8], $stat[9], $dst;
593 chmod $stat[2] & 07777, $dst_fh; 656 chmod $stat[2] & 07777, $dst_fh;
594 chown $stat[4], $stat[5], $dst_fh; 657 chown $stat[4], $stat[5], $dst_fh;
658
659 aioreq_pri $pri;
595 close $dst_fh; 660 add $grp aio_close $dst_fh;
596 } else { 661 } else {
597 $grp->result (-1); 662 $grp->result (-1);
598 close $src_fh; 663 close $src_fh;
599 close $dst_fh; 664 close $dst_fh;
600 665
833 898
834 $grp 899 $grp
835 } 900 }
836} 901}
837 902
903=item aio_sync $callback->($status)
904
905Asynchronously call sync and call the callback when finished.
906
838=item aio_fsync $fh, $callback->($status) 907=item aio_fsync $fh, $callback->($status)
839 908
840Asynchronously call fsync on the given filehandle and call the callback 909Asynchronously call fsync on the given filehandle and call the callback
841with the fsync result code. 910with the fsync result code.
842 911
845Asynchronously call fdatasync on the given filehandle and call the 914Asynchronously call fdatasync on the given filehandle and call the
846callback with the fdatasync result code. 915callback with the fdatasync result code.
847 916
848If this call isn't available because your OS lacks it or it couldn't be 917If this call isn't available because your OS lacks it or it couldn't be
849detected, it will be emulated by calling C<fsync> instead. 918detected, it will be emulated by calling C<fsync> instead.
919
920=item aio_pathsync $path, $callback->($status)
921
922This request tries to open, fsync and close the given path. This is a
923composite request intended tosync directories after directory operations
924(E.g. rename). This might not work on all operating systems or have any
925specific effect, but usually it makes sure that directory changes get
926written to disc. It works for anything that can be opened for read-only,
927not just directories.
928
929Passes C<0> when everything went ok, and C<-1> on error.
930
931=cut
932
933sub aio_pathsync($;$) {
934 aio_block {
935 my ($path, $cb) = @_;
936
937 my $pri = aioreq_pri;
938 my $grp = aio_group $cb;
939
940 aioreq_pri $pri;
941 add $grp aio_open $path, O_RDONLY, 0, sub {
942 my ($fh) = @_;
943 if ($fh) {
944 aioreq_pri $pri;
945 add $grp aio_fsync $fh, sub {
946 $grp->result ($_[0]);
947
948 aioreq_pri $pri;
949 add $grp aio_close $fh;
950 };
951 } else {
952 $grp->result (-1);
953 }
954 };
955
956 $grp
957 }
958}
850 959
851=item aio_group $callback->(...) 960=item aio_group $callback->(...)
852 961
853This is a very special aio request: Instead of doing something, it is a 962This is a very special aio request: Instead of doing something, it is a
854container for other aio requests, which is useful if you want to bundle 963container for other aio requests, which is useful if you want to bundle
991itself. Useful when you queued a lot of events but got a result early. 1100itself. Useful when you queued a lot of events but got a result early.
992 1101
993=item $grp->result (...) 1102=item $grp->result (...)
994 1103
995Set the result value(s) that will be passed to the group callback when all 1104Set the result value(s) that will be passed to the group callback when all
996subrequests have finished and set thre groups errno to the current value 1105subrequests have finished and set the groups errno to the current value
997of errno (just like calling C<errno> without an error number). By default, 1106of errno (just like calling C<errno> without an error number). By default,
998no argument will be passed and errno is zero. 1107no argument will be passed and errno is zero.
999 1108
1000=item $grp->errno ([$errno]) 1109=item $grp->errno ([$errno])
1001 1110
1206This is a very bad function to use in interactive programs because it 1315This is a very bad function to use in interactive programs because it
1207blocks, and a bad way to reduce concurrency because it is inexact: Better 1316blocks, and a bad way to reduce concurrency because it is inexact: Better
1208use an C<aio_group> together with a feed callback. 1317use an C<aio_group> together with a feed callback.
1209 1318
1210Sets the maximum number of outstanding requests to C<$nreqs>. If you 1319Sets the maximum number of outstanding requests to C<$nreqs>. If you
1211to queue up more than this number of requests, the next call to the 1320do queue up more than this number of requests, the next call to the
1212C<poll_cb> (and C<poll_some> and other functions calling C<poll_cb>) 1321C<poll_cb> (and C<poll_some> and other functions calling C<poll_cb>)
1213function will block until the limit is no longer exceeded. 1322function will block until the limit is no longer exceeded.
1214 1323
1215The default value is very large, so there is no practical limit on the 1324The default value is very large, so there is no practical limit on the
1216number of outstanding requests. 1325number of outstanding requests.
1246but not yet processed by poll_cb). 1355but not yet processed by poll_cb).
1247 1356
1248=back 1357=back
1249 1358
1250=cut 1359=cut
1251
1252# support function to convert a fd into a perl filehandle
1253sub _fd2fh {
1254 return undef if $_[0] < 0;
1255
1256 # try to generate nice filehandles
1257 my $sym = "IO::AIO::fd#$_[0]";
1258 local *$sym;
1259
1260 open *$sym, "+<&=$_[0]" # usually works under any unix
1261 or open *$sym, "<&=$_[0]" # cygwin needs this
1262 or open *$sym, ">&=$_[0]" # or this
1263 or return undef;
1264
1265 *$sym
1266}
1267 1360
1268min_parallel 8; 1361min_parallel 8;
1269 1362
1270END { flush } 1363END { flush }
1271 1364

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines