ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/AIO.pm
Revision: 1.34
Committed: Sat Dec 13 22:08:13 2008 UTC (15 years, 5 months ago) by root
Branch: MAIN
CVS Tags: rel-6_13
Changes since 1.33: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.19 Coro::AIO - truly asynchronous file and directory I/O
4 root 1.1
5     =head1 SYNOPSIS
6    
7     use Coro::AIO;
8    
9 root 1.4 # can now use any of the aio requests your IO::AIO module supports.
10 root 1.1
11     # read 1MB of /etc/passwd, without blocking other coroutines
12     my $fh = aio_open "/etc/passwd", O_RDONLY, 0
13     or die "/etc/passwd: $!";
14     aio_read $fh, 0, 1_000_000, my $buf, 0
15     or die "aio_read: $!";
16     aio_close $fh;
17    
18     =head1 DESCRIPTION
19    
20 root 1.16 This module is an L<AnyEvent> user, you need to make sure that you use and
21     run a supported event loop.
22    
23 root 1.18 This module implements a thin wrapper around L<IO::AIO>. All of
24 root 1.2 the functions that expect a callback are being wrapped by this module.
25 root 1.1
26     The API is exactly the same as that of the corresponding IO::AIO routines,
27     except that you have to specify I<all> arguments I<except> the callback
28     argument. Instead the routines return the values normally passed to the
29 root 1.3 callback. Everything else, including C<$!> and perls stat cache, are set
30     as expected after these functions return.
31 root 1.1
32     You can mix calls to C<IO::AIO> functions with calls to this module. You
33 root 1.3 I<must not>, however, call these routines from within IO::AIO callbacks,
34     as this causes a deadlock. Start a coro inside the callback instead.
35    
36 root 1.18 This module also loads L<AnyEvent::AIO> to integrate into the event loop
37     in use, so please refer to its (and L<AnyEvent>'s) documentation on how it
38     selects an appropriate event module.
39 root 1.1
40 root 1.5 All other functions exported by default by IO::AIO (e.g. C<aioreq_pri>)
41     will be exported by default by Coro::AIO, too.
42    
43     Functions that can be optionally imported from IO::AIO can be imported
44     from Coro::AIO or can be called directly, e.g. C<Coro::AIO::nreqs>.
45    
46 root 1.30 You cannot specify priorities with C<aioreq_pri> if your coroutine has a
47     non-zero priority, as this module overwrites the request priority with the
48     current coroutine priority in that case.
49 root 1.12
50 root 1.30 For your convenience, here are the changed function signatures for most
51 root 1.5 of the requests, for documentation of these functions please have a look
52 root 1.17 at L<IO::AIO|the IO::AIO manual>. Note that requests added by newer
53     versions of L<IO::AIO> will be automatically wrapped as well.
54 root 1.7
55 root 1.1 =over 4
56    
57     =cut
58    
59     package Coro::AIO;
60    
61 root 1.8 use strict qw(subs vars);
62 root 1.2
63 root 1.22 use IO::AIO 3.1 ();
64     use AnyEvent::AIO ();
65    
66 root 1.1 use Coro ();
67 root 1.22 use Coro::AnyEvent ();
68 root 1.1
69     use base Exporter::;
70    
71 root 1.34 our $VERSION = 5.13;
72 root 1.20
73 root 1.22 our @EXPORT = (@IO::AIO::EXPORT, qw(aio_wait));
74 root 1.5 our @EXPORT_OK = @IO::AIO::EXPORT_OK;
75     our $AUTOLOAD;
76    
77     {
78 root 1.22 my @reqs = @IO::AIO::AIO_REQ ? @IO::AIO::AIO_REQ : @IO::AIO::EXPORT;
79 root 1.5 my %reqs = map +($_ => 1), @reqs;
80    
81     eval
82     join "",
83     map "sub $_(" . (prototype "IO::AIO::$_") . ");",
84     grep !$reqs{$_},
85 root 1.22 @IO::AIO::EXPORT, @EXPORT_OK;
86 root 1.1
87 root 1.5 for my $sub (@reqs) {
88     push @EXPORT, $sub;
89 root 1.30
90 root 1.5 my $iosub = "IO::AIO::$sub";
91     my $proto = prototype $iosub;
92 root 1.2
93 root 1.5 $proto =~ s/;?\$$// or die "$iosub: unable to remove callback slot from prototype";
94 root 1.1
95 root 1.30 _register "Coro::AIO::$sub", $proto, \&{$iosub};
96 root 1.5 }
97 root 1.30
98     _register "Coro::AIO::aio_wait", '$', \&IO::AIO::REQ::cb;
99 root 1.1 }
100    
101 root 1.5 sub AUTOLOAD {
102     (my $func = $AUTOLOAD) =~ s/^.*:://;
103     *$AUTOLOAD = \&{"IO::AIO::$func"};
104     goto &$AUTOLOAD;
105     }
106 root 1.1
107 root 1.22 =item @results = aio_wait $req
108    
109     This is not originally an IO::AIO request: what it does is to wait for
110     C<$req> to finish and return the results. This is most useful with
111     C<aio_group> requests.
112    
113 root 1.30 Is currently implemented by replacing the C<$req> callback (and is very
114     much like a wrapper around C<< $req->cb () >>).
115 root 1.22
116 root 1.1 =item $fh = aio_open $pathname, $flags, $mode
117    
118     =item $status = aio_close $fh
119    
120     =item $retval = aio_read $fh,$offset,$length, $data,$dataoffset
121    
122     =item $retval = aio_write $fh,$offset,$length, $data,$dataoffset
123    
124     =item $retval = aio_sendfile $out_fh, $in_fh, $in_offset, $length
125    
126     =item $retval = aio_readahead $fh,$offset,$length
127    
128 root 1.2 =item $status = aio_stat $fh_or_path
129    
130     =item $status = aio_lstat $fh
131    
132 root 1.1 =item $status = aio_unlink $pathname
133    
134     =item $status = aio_rmdir $pathname
135    
136 root 1.3 =item $entries = aio_readdir $pathname
137 root 1.1
138     =item ($dirs, $nondirs) = aio_scandir $path, $maxreq
139    
140     =item $status = aio_fsync $fh
141    
142     =item $status = aio_fdatasync $fh
143    
144 root 1.4 =item ... = aio_xxx ...
145    
146     Any additional aio requests follow the same scheme: same parameters except
147     you must not specify a callback but instead get the callback arguments as
148     return values.
149    
150 root 1.1 =back
151    
152 root 1.2 =head1 SEE ALSO
153    
154 root 1.4 L<Coro::Socket> and L<Coro::Handle> for non-blocking socket operation.
155 root 1.2
156 root 1.1 =head1 AUTHOR
157    
158     Marc Lehmann <schmorp@schmorp.de>
159     http://home.schmorp.de/
160    
161     =cut
162    
163     1