| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | =head1 NAME | 
| 2 |  |  |  |  |  |  |  | 
| 3 |  |  |  |  |  |  | IO::AIO - Asynchronous/Advanced Input/Output | 
| 4 |  |  |  |  |  |  |  | 
| 5 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 6 |  |  |  |  |  |  |  | 
| 7 |  |  |  |  |  |  | use IO::AIO; | 
| 8 |  |  |  |  |  |  |  | 
| 9 |  |  |  |  |  |  | aio_open "/etc/passwd", IO::AIO::O_RDONLY, 0, sub { | 
| 10 |  |  |  |  |  |  | my $fh = shift | 
| 11 |  |  |  |  |  |  | or die "/etc/passwd: $!"; | 
| 12 |  |  |  |  |  |  | ... | 
| 13 |  |  |  |  |  |  | }; | 
| 14 |  |  |  |  |  |  |  | 
| 15 |  |  |  |  |  |  | aio_unlink "/tmp/file", sub { }; | 
| 16 |  |  |  |  |  |  |  | 
| 17 |  |  |  |  |  |  | aio_read $fh, 30000, 1024, $buffer, 0, sub { | 
| 18 |  |  |  |  |  |  | $_[0] > 0 or die "read error: $!"; | 
| 19 |  |  |  |  |  |  | }; | 
| 20 |  |  |  |  |  |  |  | 
| 21 |  |  |  |  |  |  | # version 2+ has request and group objects | 
| 22 |  |  |  |  |  |  | use IO::AIO 2; | 
| 23 |  |  |  |  |  |  |  | 
| 24 |  |  |  |  |  |  | aioreq_pri 4; # give next request a very high priority | 
| 25 |  |  |  |  |  |  | my $req = aio_unlink "/tmp/file", sub { }; | 
| 26 |  |  |  |  |  |  | $req->cancel; # cancel request if still in queue | 
| 27 |  |  |  |  |  |  |  | 
| 28 |  |  |  |  |  |  | my $grp = aio_group sub { print "all stats done\n" }; | 
| 29 |  |  |  |  |  |  | add $grp aio_stat "..." for ...; | 
| 30 |  |  |  |  |  |  |  | 
| 31 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 32 |  |  |  |  |  |  |  | 
| 33 |  |  |  |  |  |  | This module implements asynchronous I/O using whatever means your | 
| 34 |  |  |  |  |  |  | operating system supports. It is implemented as an interface to C | 
| 35 |  |  |  |  |  |  | (L). | 
| 36 |  |  |  |  |  |  |  | 
| 37 |  |  |  |  |  |  | Asynchronous means that operations that can normally block your program | 
| 38 |  |  |  |  |  |  | (e.g. reading from disk) will be done asynchronously: the operation | 
| 39 |  |  |  |  |  |  | will still block, but you can do something else in the meantime. This | 
| 40 |  |  |  |  |  |  | is extremely useful for programs that need to stay interactive even | 
| 41 |  |  |  |  |  |  | when doing heavy I/O (GUI programs, high performance network servers | 
| 42 |  |  |  |  |  |  | etc.), but can also be used to easily do operations in parallel that are | 
| 43 |  |  |  |  |  |  | normally done sequentially, e.g. stat'ing many files, which is much faster | 
| 44 |  |  |  |  |  |  | on a RAID volume or over NFS when you do a number of stat operations | 
| 45 |  |  |  |  |  |  | concurrently. | 
| 46 |  |  |  |  |  |  |  | 
| 47 |  |  |  |  |  |  | While most of this works on all types of file descriptors (for | 
| 48 |  |  |  |  |  |  | example sockets), using these functions on file descriptors that | 
| 49 |  |  |  |  |  |  | support nonblocking operation (again, sockets, pipes etc.) is | 
| 50 |  |  |  |  |  |  | very inefficient. Use an event loop for that (such as the L | 
| 51 |  |  |  |  |  |  | module): IO::AIO will naturally fit into such an event loop itself. | 
| 52 |  |  |  |  |  |  |  | 
| 53 |  |  |  |  |  |  | In this version, a number of threads are started that execute your | 
| 54 |  |  |  |  |  |  | requests and signal their completion. You don't need thread support | 
| 55 |  |  |  |  |  |  | in perl, and the threads created by this module will not be visible | 
| 56 |  |  |  |  |  |  | to perl. In the future, this module might make use of the native aio | 
| 57 |  |  |  |  |  |  | functions available on many operating systems. However, they are often | 
| 58 |  |  |  |  |  |  | not well-supported or restricted (GNU/Linux doesn't allow them on normal | 
| 59 |  |  |  |  |  |  | files currently, for example), and they would only support aio_read and | 
| 60 |  |  |  |  |  |  | aio_write, so the remaining functionality would have to be implemented | 
| 61 |  |  |  |  |  |  | using threads anyway. | 
| 62 |  |  |  |  |  |  |  | 
| 63 |  |  |  |  |  |  | In addition to asynchronous I/O, this module also exports some rather | 
| 64 |  |  |  |  |  |  | arcane interfaces, such as C or linux's C system call, | 
| 65 |  |  |  |  |  |  | which is why the C in C can also mean I. | 
| 66 |  |  |  |  |  |  |  | 
| 67 |  |  |  |  |  |  | Although the module will work in the presence of other (Perl-) threads, | 
| 68 |  |  |  |  |  |  | it is currently not reentrant in any way, so use appropriate locking | 
| 69 |  |  |  |  |  |  | yourself, always call C from within the same thread, or never | 
| 70 |  |  |  |  |  |  | call C (or other C functions) recursively. | 
| 71 |  |  |  |  |  |  |  | 
| 72 |  |  |  |  |  |  | =head2 EXAMPLE | 
| 73 |  |  |  |  |  |  |  | 
| 74 |  |  |  |  |  |  | This is a simple example that uses the EV module and loads | 
| 75 |  |  |  |  |  |  | F asynchronously: | 
| 76 |  |  |  |  |  |  |  | 
| 77 |  |  |  |  |  |  | use EV; | 
| 78 |  |  |  |  |  |  | use IO::AIO; | 
| 79 |  |  |  |  |  |  |  | 
| 80 |  |  |  |  |  |  | # register the IO::AIO callback with EV | 
| 81 |  |  |  |  |  |  | my $aio_w = EV::io IO::AIO::poll_fileno, EV::READ, \&IO::AIO::poll_cb; | 
| 82 |  |  |  |  |  |  |  | 
| 83 |  |  |  |  |  |  | # queue the request to open /etc/passwd | 
| 84 |  |  |  |  |  |  | aio_open "/etc/passwd", IO::AIO::O_RDONLY, 0, sub { | 
| 85 |  |  |  |  |  |  | my $fh = shift | 
| 86 |  |  |  |  |  |  | or die "error while opening: $!"; | 
| 87 |  |  |  |  |  |  |  | 
| 88 |  |  |  |  |  |  | # stat'ing filehandles is generally non-blocking | 
| 89 |  |  |  |  |  |  | my $size = -s $fh; | 
| 90 |  |  |  |  |  |  |  | 
| 91 |  |  |  |  |  |  | # queue a request to read the file | 
| 92 |  |  |  |  |  |  | my $contents; | 
| 93 |  |  |  |  |  |  | aio_read $fh, 0, $size, $contents, 0, sub { | 
| 94 |  |  |  |  |  |  | $_[0] == $size | 
| 95 |  |  |  |  |  |  | or die "short read: $!"; | 
| 96 |  |  |  |  |  |  |  | 
| 97 |  |  |  |  |  |  | close $fh; | 
| 98 |  |  |  |  |  |  |  | 
| 99 |  |  |  |  |  |  | # file contents now in $contents | 
| 100 |  |  |  |  |  |  | print $contents; | 
| 101 |  |  |  |  |  |  |  | 
| 102 |  |  |  |  |  |  | # exit event loop and program | 
| 103 |  |  |  |  |  |  | EV::break; | 
| 104 |  |  |  |  |  |  | }; | 
| 105 |  |  |  |  |  |  | }; | 
| 106 |  |  |  |  |  |  |  | 
| 107 |  |  |  |  |  |  | # possibly queue up other requests, or open GUI windows, | 
| 108 |  |  |  |  |  |  | # check for sockets etc. etc. | 
| 109 |  |  |  |  |  |  |  | 
| 110 |  |  |  |  |  |  | # process events as long as there are some: | 
| 111 |  |  |  |  |  |  | EV::run; | 
| 112 |  |  |  |  |  |  |  | 
| 113 |  |  |  |  |  |  | =head1 REQUEST ANATOMY AND LIFETIME | 
| 114 |  |  |  |  |  |  |  | 
| 115 |  |  |  |  |  |  | Every C function creates a request. which is a C data structure not | 
| 116 |  |  |  |  |  |  | directly visible to Perl. | 
| 117 |  |  |  |  |  |  |  | 
| 118 |  |  |  |  |  |  | If called in non-void context, every request function returns a Perl | 
| 119 |  |  |  |  |  |  | object representing the request. In void context, nothing is returned, | 
| 120 |  |  |  |  |  |  | which saves a bit of memory. | 
| 121 |  |  |  |  |  |  |  | 
| 122 |  |  |  |  |  |  | The perl object is a fairly standard ref-to-hash object. The hash contents | 
| 123 |  |  |  |  |  |  | are not used by IO::AIO so you are free to store anything you like in it. | 
| 124 |  |  |  |  |  |  |  | 
| 125 |  |  |  |  |  |  | During their existance, aio requests travel through the following states, | 
| 126 |  |  |  |  |  |  | in order: | 
| 127 |  |  |  |  |  |  |  | 
| 128 |  |  |  |  |  |  | =over 4 | 
| 129 |  |  |  |  |  |  |  | 
| 130 |  |  |  |  |  |  | =item ready | 
| 131 |  |  |  |  |  |  |  | 
| 132 |  |  |  |  |  |  | Immediately after a request is created it is put into the ready state, | 
| 133 |  |  |  |  |  |  | waiting for a thread to execute it. | 
| 134 |  |  |  |  |  |  |  | 
| 135 |  |  |  |  |  |  | =item execute | 
| 136 |  |  |  |  |  |  |  | 
| 137 |  |  |  |  |  |  | A thread has accepted the request for processing and is currently | 
| 138 |  |  |  |  |  |  | executing it (e.g. blocking in read). | 
| 139 |  |  |  |  |  |  |  | 
| 140 |  |  |  |  |  |  | =item pending | 
| 141 |  |  |  |  |  |  |  | 
| 142 |  |  |  |  |  |  | The request has been executed and is waiting for result processing. | 
| 143 |  |  |  |  |  |  |  | 
| 144 |  |  |  |  |  |  | While request submission and execution is fully asynchronous, result | 
| 145 |  |  |  |  |  |  | processing is not and relies on the perl interpreter calling C | 
| 146 |  |  |  |  |  |  | (or another function with the same effect). | 
| 147 |  |  |  |  |  |  |  | 
| 148 |  |  |  |  |  |  | =item result | 
| 149 |  |  |  |  |  |  |  | 
| 150 |  |  |  |  |  |  | The request results are processed synchronously by C. | 
| 151 |  |  |  |  |  |  |  | 
| 152 |  |  |  |  |  |  | The C function will process all outstanding aio requests by | 
| 153 |  |  |  |  |  |  | calling their callbacks, freeing memory associated with them and managing | 
| 154 |  |  |  |  |  |  | any groups they are contained in. | 
| 155 |  |  |  |  |  |  |  | 
| 156 |  |  |  |  |  |  | =item done | 
| 157 |  |  |  |  |  |  |  | 
| 158 |  |  |  |  |  |  | Request has reached the end of its lifetime and holds no resources anymore | 
| 159 |  |  |  |  |  |  | (except possibly for the Perl object, but its connection to the actual | 
| 160 |  |  |  |  |  |  | aio request is severed and calling its methods will either do nothing or | 
| 161 |  |  |  |  |  |  | result in a runtime error). | 
| 162 |  |  |  |  |  |  |  | 
| 163 |  |  |  |  |  |  | =back | 
| 164 |  |  |  |  |  |  |  | 
| 165 |  |  |  |  |  |  | =cut | 
| 166 |  |  |  |  |  |  |  | 
| 167 |  |  |  |  |  |  | package IO::AIO; | 
| 168 |  |  |  |  |  |  |  | 
| 169 | 9 |  |  | 9 |  | 36669 | use Carp (); | 
|  | 9 |  |  |  |  | 61 |  | 
|  | 9 |  |  |  |  | 213 |  | 
| 170 |  |  |  |  |  |  |  | 
| 171 | 9 |  |  | 9 |  | 3938 | use common::sense; | 
|  | 9 |  |  |  |  | 102 |  | 
|  | 9 |  |  |  |  | 39 |  | 
| 172 |  |  |  |  |  |  |  | 
| 173 | 9 |  |  | 9 |  | 518 | use base 'Exporter'; | 
|  | 9 |  |  |  |  | 15 |  | 
|  | 9 |  |  |  |  | 2691 |  | 
| 174 |  |  |  |  |  |  |  | 
| 175 |  |  |  |  |  |  | BEGIN { | 
| 176 | 9 |  |  | 9 |  | 39 | our $VERSION = 4.79; | 
| 177 |  |  |  |  |  |  |  | 
| 178 | 9 |  |  |  |  | 109 | our @AIO_REQ = qw(aio_sendfile aio_seek aio_read aio_write aio_open aio_close | 
| 179 |  |  |  |  |  |  | aio_stat aio_lstat aio_unlink aio_rmdir aio_readdir aio_readdirx | 
| 180 |  |  |  |  |  |  | aio_scandir aio_symlink aio_readlink aio_realpath aio_fcntl aio_ioctl | 
| 181 |  |  |  |  |  |  | aio_sync aio_fsync aio_syncfs aio_fdatasync aio_sync_file_range | 
| 182 |  |  |  |  |  |  | aio_pathsync aio_readahead aio_fiemap aio_allocate | 
| 183 |  |  |  |  |  |  | aio_rename aio_rename2 aio_link aio_move aio_copy aio_group | 
| 184 |  |  |  |  |  |  | aio_nop aio_mknod aio_load aio_rmtree aio_mkdir aio_chown | 
| 185 |  |  |  |  |  |  | aio_chmod aio_utime aio_truncate | 
| 186 |  |  |  |  |  |  | aio_msync aio_mtouch aio_mlock aio_mlockall | 
| 187 |  |  |  |  |  |  | aio_statvfs | 
| 188 |  |  |  |  |  |  | aio_slurp | 
| 189 |  |  |  |  |  |  | aio_wd); | 
| 190 |  |  |  |  |  |  |  | 
| 191 | 9 |  |  |  |  | 58 | our @EXPORT = (@AIO_REQ, qw(aioreq_pri aioreq_nice)); | 
| 192 | 9 |  |  |  |  | 82 | our @EXPORT_OK = qw(poll_fileno poll_cb poll_wait flush | 
| 193 |  |  |  |  |  |  | min_parallel max_parallel max_idle idle_timeout | 
| 194 |  |  |  |  |  |  | nreqs nready npending nthreads | 
| 195 |  |  |  |  |  |  | max_poll_time max_poll_reqs | 
| 196 |  |  |  |  |  |  | sendfile fadvise madvise | 
| 197 |  |  |  |  |  |  | mmap munmap mremap munlock munlockall | 
| 198 |  |  |  |  |  |  |  | 
| 199 |  |  |  |  |  |  | accept4 tee splice pipe2 pipesize | 
| 200 |  |  |  |  |  |  | fexecve mount umount memfd_create eventfd | 
| 201 |  |  |  |  |  |  | timerfd_create timerfd_settime timerfd_gettime | 
| 202 |  |  |  |  |  |  | pidfd_open pidfd_send_signal pidfd_getfd); | 
| 203 |  |  |  |  |  |  |  | 
| 204 | 9 |  |  |  |  | 25 | push @AIO_REQ, qw(aio_busy); # not exported | 
| 205 |  |  |  |  |  |  |  | 
| 206 | 9 |  |  |  |  | 139 | @IO::AIO::GRP::ISA = 'IO::AIO::REQ'; | 
| 207 |  |  |  |  |  |  |  | 
| 208 | 9 |  |  |  |  | 53 | require XSLoader; | 
| 209 | 9 |  |  |  |  | 60559 | XSLoader::load ("IO::AIO", $VERSION); | 
| 210 |  |  |  |  |  |  | } | 
| 211 |  |  |  |  |  |  |  | 
| 212 |  |  |  |  |  |  | =head1 FUNCTIONS | 
| 213 |  |  |  |  |  |  |  | 
| 214 |  |  |  |  |  |  | =head2 QUICK OVERVIEW | 
| 215 |  |  |  |  |  |  |  | 
| 216 |  |  |  |  |  |  | This section simply lists the prototypes most of the functions for | 
| 217 |  |  |  |  |  |  | quick reference. See the following sections for function-by-function | 
| 218 |  |  |  |  |  |  | documentation. | 
| 219 |  |  |  |  |  |  |  | 
| 220 |  |  |  |  |  |  | aio_wd $pathname, $callback->($wd) | 
| 221 |  |  |  |  |  |  | aio_open $pathname, $flags, $mode, $callback->($fh) | 
| 222 |  |  |  |  |  |  | aio_close $fh, $callback->($status) | 
| 223 |  |  |  |  |  |  | aio_seek  $fh,$offset,$whence, $callback->($offs) | 
| 224 |  |  |  |  |  |  | aio_read  $fh,$offset,$length, $data,$dataoffset, $callback->($retval) | 
| 225 |  |  |  |  |  |  | aio_write $fh,$offset,$length, $data,$dataoffset, $callback->($retval) | 
| 226 |  |  |  |  |  |  | aio_sendfile $out_fh, $in_fh, $in_offset, $length, $callback->($retval) | 
| 227 |  |  |  |  |  |  | aio_readahead $fh,$offset,$length, $callback->($retval) | 
| 228 |  |  |  |  |  |  | aio_stat  $fh_or_path, $callback->($status) | 
| 229 |  |  |  |  |  |  | aio_lstat $fh, $callback->($status) | 
| 230 |  |  |  |  |  |  | aio_statvfs $fh_or_path, $callback->($statvfs) | 
| 231 |  |  |  |  |  |  | aio_utime $fh_or_path, $atime, $mtime, $callback->($status) | 
| 232 |  |  |  |  |  |  | aio_chown $fh_or_path, $uid, $gid, $callback->($status) | 
| 233 |  |  |  |  |  |  | aio_chmod $fh_or_path, $mode, $callback->($status) | 
| 234 |  |  |  |  |  |  | aio_truncate $fh_or_path, $offset, $callback->($status) | 
| 235 |  |  |  |  |  |  | aio_allocate $fh, $mode, $offset, $len, $callback->($status) | 
| 236 |  |  |  |  |  |  | aio_fiemap $fh, $start, $length, $flags, $count, $cb->(\@extents) | 
| 237 |  |  |  |  |  |  | aio_unlink $pathname, $callback->($status) | 
| 238 |  |  |  |  |  |  | aio_mknod $pathname, $mode, $dev, $callback->($status) | 
| 239 |  |  |  |  |  |  | aio_link $srcpath, $dstpath, $callback->($status) | 
| 240 |  |  |  |  |  |  | aio_symlink $srcpath, $dstpath, $callback->($status) | 
| 241 |  |  |  |  |  |  | aio_readlink $pathname, $callback->($link) | 
| 242 |  |  |  |  |  |  | aio_realpath $pathname, $callback->($path) | 
| 243 |  |  |  |  |  |  | aio_rename $srcpath, $dstpath, $callback->($status) | 
| 244 |  |  |  |  |  |  | aio_rename2 $srcpath, $dstpath, $flags, $callback->($status) | 
| 245 |  |  |  |  |  |  | aio_mkdir $pathname, $mode, $callback->($status) | 
| 246 |  |  |  |  |  |  | aio_rmdir $pathname, $callback->($status) | 
| 247 |  |  |  |  |  |  | aio_readdir $pathname, $callback->($entries) | 
| 248 |  |  |  |  |  |  | aio_readdirx $pathname, $flags, $callback->($entries, $flags) | 
| 249 |  |  |  |  |  |  | IO::AIO::READDIR_DENTS IO::AIO::READDIR_DIRS_FIRST | 
| 250 |  |  |  |  |  |  | IO::AIO::READDIR_STAT_ORDER IO::AIO::READDIR_FOUND_UNKNOWN | 
| 251 |  |  |  |  |  |  | aio_scandir $pathname, $maxreq, $callback->($dirs, $nondirs) | 
| 252 |  |  |  |  |  |  | aio_load $pathname, $data, $callback->($status) | 
| 253 |  |  |  |  |  |  | aio_copy $srcpath, $dstpath, $callback->($status) | 
| 254 |  |  |  |  |  |  | aio_move $srcpath, $dstpath, $callback->($status) | 
| 255 |  |  |  |  |  |  | aio_rmtree $pathname, $callback->($status) | 
| 256 |  |  |  |  |  |  | aio_fcntl $fh, $cmd, $arg, $callback->($status) | 
| 257 |  |  |  |  |  |  | aio_ioctl $fh, $request, $buf, $callback->($status) | 
| 258 |  |  |  |  |  |  | aio_sync $callback->($status) | 
| 259 |  |  |  |  |  |  | aio_syncfs $fh, $callback->($status) | 
| 260 |  |  |  |  |  |  | aio_fsync $fh, $callback->($status) | 
| 261 |  |  |  |  |  |  | aio_fdatasync $fh, $callback->($status) | 
| 262 |  |  |  |  |  |  | aio_sync_file_range $fh, $offset, $nbytes, $flags, $callback->($status) | 
| 263 |  |  |  |  |  |  | aio_pathsync $pathname, $callback->($status) | 
| 264 |  |  |  |  |  |  | aio_msync $scalar, $offset = 0, $length = undef, flags = MS_SYNC, $callback->($status) | 
| 265 |  |  |  |  |  |  | aio_mtouch $scalar, $offset = 0, $length = undef, flags = 0, $callback->($status) | 
| 266 |  |  |  |  |  |  | aio_mlock $scalar, $offset = 0, $length = undef, $callback->($status) | 
| 267 |  |  |  |  |  |  | aio_mlockall $flags, $callback->($status) | 
| 268 |  |  |  |  |  |  | aio_group $callback->(...) | 
| 269 |  |  |  |  |  |  | aio_nop $callback->() | 
| 270 |  |  |  |  |  |  |  | 
| 271 |  |  |  |  |  |  | $prev_pri = aioreq_pri [$pri] | 
| 272 |  |  |  |  |  |  | aioreq_nice $pri_adjust | 
| 273 |  |  |  |  |  |  |  | 
| 274 |  |  |  |  |  |  | IO::AIO::poll_wait | 
| 275 |  |  |  |  |  |  | IO::AIO::poll_cb | 
| 276 |  |  |  |  |  |  | IO::AIO::poll | 
| 277 |  |  |  |  |  |  | IO::AIO::flush | 
| 278 |  |  |  |  |  |  | IO::AIO::max_poll_reqs $nreqs | 
| 279 |  |  |  |  |  |  | IO::AIO::max_poll_time $seconds | 
| 280 |  |  |  |  |  |  | IO::AIO::min_parallel $nthreads | 
| 281 |  |  |  |  |  |  | IO::AIO::max_parallel $nthreads | 
| 282 |  |  |  |  |  |  | IO::AIO::max_idle $nthreads | 
| 283 |  |  |  |  |  |  | IO::AIO::idle_timeout $seconds | 
| 284 |  |  |  |  |  |  | IO::AIO::max_outstanding $maxreqs | 
| 285 |  |  |  |  |  |  | IO::AIO::nreqs | 
| 286 |  |  |  |  |  |  | IO::AIO::nready | 
| 287 |  |  |  |  |  |  | IO::AIO::npending | 
| 288 |  |  |  |  |  |  | IO::AIO::reinit | 
| 289 |  |  |  |  |  |  |  | 
| 290 |  |  |  |  |  |  | $nfd = IO::AIO::get_fdlimit | 
| 291 |  |  |  |  |  |  | IO::AIO::min_fdlimit $nfd | 
| 292 |  |  |  |  |  |  |  | 
| 293 |  |  |  |  |  |  | IO::AIO::sendfile $ofh, $ifh, $offset, $count | 
| 294 |  |  |  |  |  |  | IO::AIO::fadvise $fh, $offset, $len, $advice | 
| 295 |  |  |  |  |  |  | IO::AIO::fexecve $fh, $argv, $envp | 
| 296 |  |  |  |  |  |  |  | 
| 297 |  |  |  |  |  |  | IO::AIO::mmap $scalar, $length, $prot, $flags[, $fh[, $offset]] | 
| 298 |  |  |  |  |  |  | IO::AIO::munmap $scalar | 
| 299 |  |  |  |  |  |  | IO::AIO::mremap $scalar, $new_length, $flags[, $new_address] | 
| 300 |  |  |  |  |  |  | IO::AIO::madvise $scalar, $offset, $length, $advice | 
| 301 |  |  |  |  |  |  | IO::AIO::mprotect $scalar, $offset, $length, $protect | 
| 302 |  |  |  |  |  |  | IO::AIO::munlock $scalar, $offset = 0, $length = undef | 
| 303 |  |  |  |  |  |  | IO::AIO::munlockall | 
| 304 |  |  |  |  |  |  |  | 
| 305 |  |  |  |  |  |  | # stat extensions | 
| 306 |  |  |  |  |  |  | $counter = IO::AIO::st_gen | 
| 307 |  |  |  |  |  |  | $seconds = IO::AIO::st_atime, IO::AIO::st_mtime, IO::AIO::st_ctime, IO::AIO::st_btime | 
| 308 |  |  |  |  |  |  | ($atime, $mtime, $ctime, $btime, ...) = IO::AIO::st_xtime | 
| 309 |  |  |  |  |  |  | $nanoseconds = IO::AIO::st_atimensec, IO::AIO::st_mtimensec, IO::AIO::st_ctimensec, IO::AIO::st_btimensec | 
| 310 |  |  |  |  |  |  | $seconds = IO::AIO::st_btimesec | 
| 311 |  |  |  |  |  |  | ($atime, $mtime, $ctime, $btime, ...) = IO::AIO::st_xtimensec | 
| 312 |  |  |  |  |  |  |  | 
| 313 |  |  |  |  |  |  | # very much unportable syscalls | 
| 314 |  |  |  |  |  |  | IO::AIO::accept4 $r_fh, $sockaddr, $sockaddr_len, $flags | 
| 315 |  |  |  |  |  |  | IO::AIO::splice $r_fh, $r_off, $w_fh, $w_off, $length, $flags | 
| 316 |  |  |  |  |  |  | IO::AIO::tee $r_fh, $w_fh, $length, $flags | 
| 317 |  |  |  |  |  |  |  | 
| 318 |  |  |  |  |  |  | $actual_size = IO::AIO::pipesize $r_fh[, $new_size] | 
| 319 |  |  |  |  |  |  | ($rfh, $wfh) = IO::AIO::pipe2 [$flags] | 
| 320 |  |  |  |  |  |  |  | 
| 321 |  |  |  |  |  |  | $fh = IO::AIO::eventfd [$initval, [$flags]] | 
| 322 |  |  |  |  |  |  | $fh = IO::AIO::memfd_create $pathname[, $flags] | 
| 323 |  |  |  |  |  |  |  | 
| 324 |  |  |  |  |  |  | $fh = IO::AIO::timerfd_create $clockid[, $flags] | 
| 325 |  |  |  |  |  |  | ($cur_interval, $cur_value) = IO::AIO::timerfd_settime $fh, $flags, $new_interval, $nbw_value | 
| 326 |  |  |  |  |  |  | ($cur_interval, $cur_value) = IO::AIO::timerfd_gettime $fh | 
| 327 |  |  |  |  |  |  |  | 
| 328 |  |  |  |  |  |  | $fh = IO::AIO::pidfd_open $pid[, $flags] | 
| 329 |  |  |  |  |  |  | $status = IO::AIO::pidfd_send_signal $pidfh, $signal[, $siginfo[, $flags]] | 
| 330 |  |  |  |  |  |  | $fh = IO::AIO::pidfd_getfd $pidfh, $targetfd[, $flags] | 
| 331 |  |  |  |  |  |  |  | 
| 332 |  |  |  |  |  |  | $retval = IO::AIO::mount $special, $path, $fstype, $flags = 0, $data = undef | 
| 333 |  |  |  |  |  |  | $retval = IO::AIO::umount $path, $flags = 0 | 
| 334 |  |  |  |  |  |  |  | 
| 335 |  |  |  |  |  |  | =head2 API NOTES | 
| 336 |  |  |  |  |  |  |  | 
| 337 |  |  |  |  |  |  | All the C calls are more or less thin wrappers around the syscall | 
| 338 |  |  |  |  |  |  | with the same name (sans C). The arguments are similar or identical, | 
| 339 |  |  |  |  |  |  | and they all accept an additional (and optional) C<$callback> argument | 
| 340 |  |  |  |  |  |  | which must be a code reference. This code reference will be called after | 
| 341 |  |  |  |  |  |  | the syscall has been executed in an asynchronous fashion. The results | 
| 342 |  |  |  |  |  |  | of the request will be passed as arguments to the callback (and, if an | 
| 343 |  |  |  |  |  |  | error occured, in C<$!>) - for most requests the syscall return code (e.g. | 
| 344 |  |  |  |  |  |  | most syscalls return C<-1> on error, unlike perl, which usually delivers | 
| 345 |  |  |  |  |  |  | "false"). | 
| 346 |  |  |  |  |  |  |  | 
| 347 |  |  |  |  |  |  | Some requests (such as C) pass the actual results and | 
| 348 |  |  |  |  |  |  | communicate failures by passing C. | 
| 349 |  |  |  |  |  |  |  | 
| 350 |  |  |  |  |  |  | All functions expecting a filehandle keep a copy of the filehandle | 
| 351 |  |  |  |  |  |  | internally until the request has finished. | 
| 352 |  |  |  |  |  |  |  | 
| 353 |  |  |  |  |  |  | All functions return request objects of type L that allow | 
| 354 |  |  |  |  |  |  | further manipulation of those requests while they are in-flight. | 
| 355 |  |  |  |  |  |  |  | 
| 356 |  |  |  |  |  |  | The pathnames you pass to these routines I be absolute. The | 
| 357 |  |  |  |  |  |  | reason for this is that at the time the request is being executed, the | 
| 358 |  |  |  |  |  |  | current working directory could have changed. Alternatively, you can | 
| 359 |  |  |  |  |  |  | make sure that you never change the current working directory anywhere | 
| 360 |  |  |  |  |  |  | in the program and then use relative paths. You can also take advantage | 
| 361 |  |  |  |  |  |  | of IO::AIOs working directory abstraction, that lets you specify paths | 
| 362 |  |  |  |  |  |  | relative to some previously-opened "working directory object" - see the | 
| 363 |  |  |  |  |  |  | description of the C class later in this document. | 
| 364 |  |  |  |  |  |  |  | 
| 365 |  |  |  |  |  |  | To encode pathnames as octets, either make sure you either: a) always pass | 
| 366 |  |  |  |  |  |  | in filenames you got from outside (command line, readdir etc.) without | 
| 367 |  |  |  |  |  |  | tinkering, b) are in your native filesystem encoding, c) use the Encode | 
| 368 |  |  |  |  |  |  | module and encode your pathnames to the locale (or other) encoding in | 
| 369 |  |  |  |  |  |  | effect in the user environment, d) use Glib::filename_from_unicode on | 
| 370 |  |  |  |  |  |  | unicode filenames or e) use something else to ensure your scalar has the | 
| 371 |  |  |  |  |  |  | correct contents. | 
| 372 |  |  |  |  |  |  |  | 
| 373 |  |  |  |  |  |  | This works, btw. independent of the internal UTF-8 bit, which IO::AIO | 
| 374 |  |  |  |  |  |  | handles correctly whether it is set or not. | 
| 375 |  |  |  |  |  |  |  | 
| 376 |  |  |  |  |  |  | =head2 AIO REQUEST FUNCTIONS | 
| 377 |  |  |  |  |  |  |  | 
| 378 |  |  |  |  |  |  | =over 4 | 
| 379 |  |  |  |  |  |  |  | 
| 380 |  |  |  |  |  |  | =item $prev_pri = aioreq_pri [$pri] | 
| 381 |  |  |  |  |  |  |  | 
| 382 |  |  |  |  |  |  | Returns the priority value that would be used for the next request and, if | 
| 383 |  |  |  |  |  |  | C<$pri> is given, sets the priority for the next aio request. | 
| 384 |  |  |  |  |  |  |  | 
| 385 |  |  |  |  |  |  | The default priority is C<0>, the minimum and maximum priorities are C<-4> | 
| 386 |  |  |  |  |  |  | and C<4>, respectively. Requests with higher priority will be serviced | 
| 387 |  |  |  |  |  |  | first. | 
| 388 |  |  |  |  |  |  |  | 
| 389 |  |  |  |  |  |  | The priority will be reset to C<0> after each call to one of the C | 
| 390 |  |  |  |  |  |  | functions. | 
| 391 |  |  |  |  |  |  |  | 
| 392 |  |  |  |  |  |  | Example: open a file with low priority, then read something from it with | 
| 393 |  |  |  |  |  |  | higher priority so the read request is serviced before other low priority | 
| 394 |  |  |  |  |  |  | open requests (potentially spamming the cache): | 
| 395 |  |  |  |  |  |  |  | 
| 396 |  |  |  |  |  |  | aioreq_pri -3; | 
| 397 |  |  |  |  |  |  | aio_open ..., sub { | 
| 398 |  |  |  |  |  |  | return unless $_[0]; | 
| 399 |  |  |  |  |  |  |  | 
| 400 |  |  |  |  |  |  | aioreq_pri -2; | 
| 401 |  |  |  |  |  |  | aio_read $_[0], ..., sub { | 
| 402 |  |  |  |  |  |  | ... | 
| 403 |  |  |  |  |  |  | }; | 
| 404 |  |  |  |  |  |  | }; | 
| 405 |  |  |  |  |  |  |  | 
| 406 |  |  |  |  |  |  |  | 
| 407 |  |  |  |  |  |  | =item aioreq_nice $pri_adjust | 
| 408 |  |  |  |  |  |  |  | 
| 409 |  |  |  |  |  |  | Similar to C, but subtracts the given value from the current | 
| 410 |  |  |  |  |  |  | priority, so the effect is cumulative. | 
| 411 |  |  |  |  |  |  |  | 
| 412 |  |  |  |  |  |  |  | 
| 413 |  |  |  |  |  |  | =item aio_open $pathname, $flags, $mode, $callback->($fh) | 
| 414 |  |  |  |  |  |  |  | 
| 415 |  |  |  |  |  |  | Asynchronously open or create a file and call the callback with a newly | 
| 416 |  |  |  |  |  |  | created filehandle for the file (or C in case of an error). | 
| 417 |  |  |  |  |  |  |  | 
| 418 |  |  |  |  |  |  | The pathname passed to C must be absolute. See API NOTES, above, | 
| 419 |  |  |  |  |  |  | for an explanation. | 
| 420 |  |  |  |  |  |  |  | 
| 421 |  |  |  |  |  |  | The C<$flags> argument is a bitmask. See the C module for a | 
| 422 |  |  |  |  |  |  | list. They are the same as used by C. | 
| 423 |  |  |  |  |  |  |  | 
| 424 |  |  |  |  |  |  | Likewise, C<$mode> specifies the mode of the newly created file, if it | 
| 425 |  |  |  |  |  |  | didn't exist and C has been given, just like perl's C, | 
| 426 |  |  |  |  |  |  | except that it is mandatory (i.e. use C<0> if you don't create new files, | 
| 427 |  |  |  |  |  |  | and C<0666> or C<0777> if you do). Note that the C<$mode> will be modified | 
| 428 |  |  |  |  |  |  | by the umask in effect then the request is being executed, so better never | 
| 429 |  |  |  |  |  |  | change the umask. | 
| 430 |  |  |  |  |  |  |  | 
| 431 |  |  |  |  |  |  | Example: | 
| 432 |  |  |  |  |  |  |  | 
| 433 |  |  |  |  |  |  | aio_open "/etc/passwd", IO::AIO::O_RDONLY, 0, sub { | 
| 434 |  |  |  |  |  |  | if ($_[0]) { | 
| 435 |  |  |  |  |  |  | print "open successful, fh is $_[0]\n"; | 
| 436 |  |  |  |  |  |  | ... | 
| 437 |  |  |  |  |  |  | } else { | 
| 438 |  |  |  |  |  |  | die "open failed: $!\n"; | 
| 439 |  |  |  |  |  |  | } | 
| 440 |  |  |  |  |  |  | }; | 
| 441 |  |  |  |  |  |  |  | 
| 442 |  |  |  |  |  |  | In addition to all the common open modes/flags (C, C, | 
| 443 |  |  |  |  |  |  | C, C, C, C and C), the | 
| 444 |  |  |  |  |  |  | following POSIX and non-POSIX constants are available (missing ones on | 
| 445 |  |  |  |  |  |  | your system are, as usual, C<0>): | 
| 446 |  |  |  |  |  |  |  | 
| 447 |  |  |  |  |  |  | C, C, C, C, C, C, | 
| 448 |  |  |  |  |  |  | C, C, C, C, C, | 
| 449 |  |  |  |  |  |  | C, C, C, C, C and C. | 
| 450 |  |  |  |  |  |  |  | 
| 451 |  |  |  |  |  |  |  | 
| 452 |  |  |  |  |  |  | =item aio_close $fh, $callback->($status) | 
| 453 |  |  |  |  |  |  |  | 
| 454 |  |  |  |  |  |  | Asynchronously close a file and call the callback with the result | 
| 455 |  |  |  |  |  |  | code. | 
| 456 |  |  |  |  |  |  |  | 
| 457 |  |  |  |  |  |  | Unfortunately, you can't do this to perl. Perl I very strongly on | 
| 458 |  |  |  |  |  |  | closing the file descriptor associated with the filehandle itself. | 
| 459 |  |  |  |  |  |  |  | 
| 460 |  |  |  |  |  |  | Therefore, C will not close the filehandle - instead it will | 
| 461 |  |  |  |  |  |  | use dup2 to overwrite the file descriptor with the write-end of a pipe | 
| 462 |  |  |  |  |  |  | (the pipe fd will be created on demand and will be cached). | 
| 463 |  |  |  |  |  |  |  | 
| 464 |  |  |  |  |  |  | Or in other words: the file descriptor will be closed, but it will not be | 
| 465 |  |  |  |  |  |  | free for reuse until the perl filehandle is closed. | 
| 466 |  |  |  |  |  |  |  | 
| 467 |  |  |  |  |  |  | =cut | 
| 468 |  |  |  |  |  |  |  | 
| 469 |  |  |  |  |  |  | =item aio_seek $fh, $offset, $whence, $callback->($offs) | 
| 470 |  |  |  |  |  |  |  | 
| 471 |  |  |  |  |  |  | Seeks the filehandle to the new C<$offset>, similarly to perl's | 
| 472 |  |  |  |  |  |  | C. The C<$whence> can use the traditional values (C<0> for | 
| 473 |  |  |  |  |  |  | C, C<1> for C or C<2> for | 
| 474 |  |  |  |  |  |  | C). | 
| 475 |  |  |  |  |  |  |  | 
| 476 |  |  |  |  |  |  | The resulting absolute offset will be passed to the callback, or C<-1> in | 
| 477 |  |  |  |  |  |  | case of an error. | 
| 478 |  |  |  |  |  |  |  | 
| 479 |  |  |  |  |  |  | In theory, the C<$whence> constants could be different than the | 
| 480 |  |  |  |  |  |  | corresponding values from L, but perl guarantees they are the same, | 
| 481 |  |  |  |  |  |  | so don't panic. | 
| 482 |  |  |  |  |  |  |  | 
| 483 |  |  |  |  |  |  | As a GNU/Linux (and maybe Solaris) extension, also the constants | 
| 484 |  |  |  |  |  |  | C and C are available, if they | 
| 485 |  |  |  |  |  |  | could be found. No guarantees about suitability for use in C or | 
| 486 |  |  |  |  |  |  | Perl's C can be made though, although I would naively assume they | 
| 487 |  |  |  |  |  |  | "just work". | 
| 488 |  |  |  |  |  |  |  | 
| 489 |  |  |  |  |  |  | =item aio_read  $fh,$offset,$length, $data,$dataoffset, $callback->($retval) | 
| 490 |  |  |  |  |  |  |  | 
| 491 |  |  |  |  |  |  | =item aio_write $fh,$offset,$length, $data,$dataoffset, $callback->($retval) | 
| 492 |  |  |  |  |  |  |  | 
| 493 |  |  |  |  |  |  | Reads or writes C<$length> bytes from or to the specified C<$fh> and | 
| 494 |  |  |  |  |  |  | C<$offset> into the scalar given by C<$data> and offset C<$dataoffset> and | 
| 495 |  |  |  |  |  |  | calls the callback with the actual number of bytes transferred (or -1 on | 
| 496 |  |  |  |  |  |  | error, just like the syscall). | 
| 497 |  |  |  |  |  |  |  | 
| 498 |  |  |  |  |  |  | C will, like C, shrink or grow the C<$data> scalar to | 
| 499 |  |  |  |  |  |  | offset plus the actual number of bytes read. | 
| 500 |  |  |  |  |  |  |  | 
| 501 |  |  |  |  |  |  | If C<$offset> is undefined, then the current file descriptor offset will | 
| 502 |  |  |  |  |  |  | be used (and updated), otherwise the file descriptor offset will not be | 
| 503 |  |  |  |  |  |  | changed by these calls. | 
| 504 |  |  |  |  |  |  |  | 
| 505 |  |  |  |  |  |  | If C<$length> is undefined in C, use the remaining length of | 
| 506 |  |  |  |  |  |  | C<$data>. | 
| 507 |  |  |  |  |  |  |  | 
| 508 |  |  |  |  |  |  | If C<$dataoffset> is less than zero, it will be counted from the end of | 
| 509 |  |  |  |  |  |  | C<$data>. | 
| 510 |  |  |  |  |  |  |  | 
| 511 |  |  |  |  |  |  | The C<$data> scalar I be modified in any way while the request | 
| 512 |  |  |  |  |  |  | is outstanding. Modifying it can result in segfaults or World War III (if | 
| 513 |  |  |  |  |  |  | the necessary/optional hardware is installed). | 
| 514 |  |  |  |  |  |  |  | 
| 515 |  |  |  |  |  |  | Example: Read 15 bytes at offset 7 into scalar C<$buffer>, starting at | 
| 516 |  |  |  |  |  |  | offset C<0> within the scalar: | 
| 517 |  |  |  |  |  |  |  | 
| 518 |  |  |  |  |  |  | aio_read $fh, 7, 15, $buffer, 0, sub { | 
| 519 |  |  |  |  |  |  | $_[0] > 0 or die "read error: $!"; | 
| 520 |  |  |  |  |  |  | print "read $_[0] bytes: <$buffer>\n"; | 
| 521 |  |  |  |  |  |  | }; | 
| 522 |  |  |  |  |  |  |  | 
| 523 |  |  |  |  |  |  |  | 
| 524 |  |  |  |  |  |  | =item aio_sendfile $out_fh, $in_fh, $in_offset, $length, $callback->($retval) | 
| 525 |  |  |  |  |  |  |  | 
| 526 |  |  |  |  |  |  | Tries to copy C<$length> bytes from C<$in_fh> to C<$out_fh>. It starts | 
| 527 |  |  |  |  |  |  | reading at byte offset C<$in_offset>, and starts writing at the current | 
| 528 |  |  |  |  |  |  | file offset of C<$out_fh>. Because of that, it is not safe to issue more | 
| 529 |  |  |  |  |  |  | than one C per C<$out_fh>, as they will interfere with each | 
| 530 |  |  |  |  |  |  | other. The same C<$in_fh> works fine though, as this function does not | 
| 531 |  |  |  |  |  |  | move or use the file offset of C<$in_fh>. | 
| 532 |  |  |  |  |  |  |  | 
| 533 |  |  |  |  |  |  | Please note that C can read more bytes from C<$in_fh> than | 
| 534 |  |  |  |  |  |  | are written, and there is no way to find out how many more bytes have been | 
| 535 |  |  |  |  |  |  | read from C alone, as C only provides the | 
| 536 |  |  |  |  |  |  | number of bytes written to C<$out_fh>. Only if the result value equals | 
| 537 |  |  |  |  |  |  | C<$length> one can assume that C<$length> bytes have been read. | 
| 538 |  |  |  |  |  |  |  | 
| 539 |  |  |  |  |  |  | Unlike with other C functions, it makes a lot of sense to use | 
| 540 |  |  |  |  |  |  | C on non-blocking sockets, as long as one end (typically | 
| 541 |  |  |  |  |  |  | the C<$in_fh>) is a file - the file I/O will then be asynchronous, while | 
| 542 |  |  |  |  |  |  | the socket I/O will be non-blocking. Note, however, that you can run | 
| 543 |  |  |  |  |  |  | into a trap where C reads some data with readahead, then | 
| 544 |  |  |  |  |  |  | fails to write all data, and when the socket is ready the next time, the | 
| 545 |  |  |  |  |  |  | data in the cache is already lost, forcing C to again hit | 
| 546 |  |  |  |  |  |  | the disk. Explicit C + C let's you better control | 
| 547 |  |  |  |  |  |  | resource usage. | 
| 548 |  |  |  |  |  |  |  | 
| 549 |  |  |  |  |  |  | This call tries to make use of a native C-like syscall to | 
| 550 |  |  |  |  |  |  | provide zero-copy operation. For this to work, C<$out_fh> should refer to | 
| 551 |  |  |  |  |  |  | a socket, and C<$in_fh> should refer to an mmap'able file. | 
| 552 |  |  |  |  |  |  |  | 
| 553 |  |  |  |  |  |  | If a native sendfile cannot be found or it fails with C, | 
| 554 |  |  |  |  |  |  | C, C, C, C, C or | 
| 555 |  |  |  |  |  |  | C, it will be emulated, so you can call C on any | 
| 556 |  |  |  |  |  |  | type of filehandle regardless of the limitations of the operating system. | 
| 557 |  |  |  |  |  |  |  | 
| 558 |  |  |  |  |  |  | As native sendfile syscalls (as practically any non-POSIX interface hacked | 
| 559 |  |  |  |  |  |  | together in a hurry to improve benchmark numbers) tend to be rather buggy | 
| 560 |  |  |  |  |  |  | on many systems, this implementation tries to work around some known bugs | 
| 561 |  |  |  |  |  |  | in Linux and FreeBSD kernels (probably others, too), but that might fail, | 
| 562 |  |  |  |  |  |  | so you really really should check the return value of C - | 
| 563 |  |  |  |  |  |  | fewer bytes than expected might have been transferred. | 
| 564 |  |  |  |  |  |  |  | 
| 565 |  |  |  |  |  |  |  | 
| 566 |  |  |  |  |  |  | =item aio_readahead $fh,$offset,$length, $callback->($retval) | 
| 567 |  |  |  |  |  |  |  | 
| 568 |  |  |  |  |  |  | C populates the page cache with data from a file so that | 
| 569 |  |  |  |  |  |  | subsequent reads from that file will not block on disk I/O. The C<$offset> | 
| 570 |  |  |  |  |  |  | argument specifies the starting point from which data is to be read and | 
| 571 |  |  |  |  |  |  | C<$length> specifies the number of bytes to be read. I/O is performed in | 
| 572 |  |  |  |  |  |  | whole pages, so that offset is effectively rounded down to a page boundary | 
| 573 |  |  |  |  |  |  | and bytes are read up to the next page boundary greater than or equal to | 
| 574 |  |  |  |  |  |  | (off-set+length). C does not read beyond the end of the | 
| 575 |  |  |  |  |  |  | file. The current file offset of the file is left unchanged. | 
| 576 |  |  |  |  |  |  |  | 
| 577 |  |  |  |  |  |  | If that syscall doesn't exist (likely if your kernel isn't Linux) it will | 
| 578 |  |  |  |  |  |  | be emulated by simply reading the data, which would have a similar effect. | 
| 579 |  |  |  |  |  |  |  | 
| 580 |  |  |  |  |  |  |  | 
| 581 |  |  |  |  |  |  | =item aio_stat  $fh_or_path, $callback->($status) | 
| 582 |  |  |  |  |  |  |  | 
| 583 |  |  |  |  |  |  | =item aio_lstat $fh, $callback->($status) | 
| 584 |  |  |  |  |  |  |  | 
| 585 |  |  |  |  |  |  | Works almost exactly like perl's C or C in void context. The | 
| 586 |  |  |  |  |  |  | callback will be called after the stat and the results will be available | 
| 587 |  |  |  |  |  |  | using C or C<-s _> and other tests (with the exception of C<-B> | 
| 588 |  |  |  |  |  |  | and C<-T>). | 
| 589 |  |  |  |  |  |  |  | 
| 590 |  |  |  |  |  |  | The pathname passed to C must be absolute. See API NOTES, above, | 
| 591 |  |  |  |  |  |  | for an explanation. | 
| 592 |  |  |  |  |  |  |  | 
| 593 |  |  |  |  |  |  | Currently, the stats are always 64-bit-stats, i.e. instead of returning an | 
| 594 |  |  |  |  |  |  | error when stat'ing a large file, the results will be silently truncated | 
| 595 |  |  |  |  |  |  | unless perl itself is compiled with large file support. | 
| 596 |  |  |  |  |  |  |  | 
| 597 |  |  |  |  |  |  | To help interpret the mode and dev/rdev stat values, IO::AIO offers the | 
| 598 |  |  |  |  |  |  | following constants and functions (if not implemented, the constants will | 
| 599 |  |  |  |  |  |  | be C<0> and the functions will either C or fall back on traditional | 
| 600 |  |  |  |  |  |  | behaviour). | 
| 601 |  |  |  |  |  |  |  | 
| 602 |  |  |  |  |  |  | C, C, C, C, C, C, | 
| 603 |  |  |  |  |  |  | C, C, C, C, | 
| 604 |  |  |  |  |  |  | C, C. | 
| 605 |  |  |  |  |  |  |  | 
| 606 |  |  |  |  |  |  | To access higher resolution stat timestamps, see L | 
| 607 |  |  |  |  |  |  | ACCESS>. | 
| 608 |  |  |  |  |  |  |  | 
| 609 |  |  |  |  |  |  | Example: Print the length of F: | 
| 610 |  |  |  |  |  |  |  | 
| 611 |  |  |  |  |  |  | aio_stat "/etc/passwd", sub { | 
| 612 |  |  |  |  |  |  | $_[0] and die "stat failed: $!"; | 
| 613 |  |  |  |  |  |  | print "size is ", -s _, "\n"; | 
| 614 |  |  |  |  |  |  | }; | 
| 615 |  |  |  |  |  |  |  | 
| 616 |  |  |  |  |  |  |  | 
| 617 |  |  |  |  |  |  | =item aio_statvfs $fh_or_path, $callback->($statvfs) | 
| 618 |  |  |  |  |  |  |  | 
| 619 |  |  |  |  |  |  | Works like the POSIX C or C syscalls, depending on | 
| 620 |  |  |  |  |  |  | whether a file handle or path was passed. | 
| 621 |  |  |  |  |  |  |  | 
| 622 |  |  |  |  |  |  | On success, the callback is passed a hash reference with the following | 
| 623 |  |  |  |  |  |  | members: C, C, C, C, C, C, | 
| 624 |  |  |  |  |  |  | C, C, C, C and C. On failure, C | 
| 625 |  |  |  |  |  |  | is passed. | 
| 626 |  |  |  |  |  |  |  | 
| 627 |  |  |  |  |  |  | The following POSIX IO::AIO::ST_* constants are defined: C and | 
| 628 |  |  |  |  |  |  | C. | 
| 629 |  |  |  |  |  |  |  | 
| 630 |  |  |  |  |  |  | The following non-POSIX IO::AIO::ST_* flag masks are defined to | 
| 631 |  |  |  |  |  |  | their correct value when available, or to C<0> on systems that do | 
| 632 |  |  |  |  |  |  | not support them:  C, C, C, | 
| 633 |  |  |  |  |  |  | C, C, C, C, C, | 
| 634 |  |  |  |  |  |  | C and C. | 
| 635 |  |  |  |  |  |  |  | 
| 636 |  |  |  |  |  |  | Example: stat C and dump out the data if successful. | 
| 637 |  |  |  |  |  |  |  | 
| 638 |  |  |  |  |  |  | aio_statvfs "/wd", sub { | 
| 639 |  |  |  |  |  |  | my $f = $_[0] | 
| 640 |  |  |  |  |  |  | or die "statvfs: $!"; | 
| 641 |  |  |  |  |  |  |  | 
| 642 |  |  |  |  |  |  | use Data::Dumper; | 
| 643 |  |  |  |  |  |  | say Dumper $f; | 
| 644 |  |  |  |  |  |  | }; | 
| 645 |  |  |  |  |  |  |  | 
| 646 |  |  |  |  |  |  | # result: | 
| 647 |  |  |  |  |  |  | { | 
| 648 |  |  |  |  |  |  | bsize   => 1024, | 
| 649 |  |  |  |  |  |  | bfree   => 4333064312, | 
| 650 |  |  |  |  |  |  | blocks  => 10253828096, | 
| 651 |  |  |  |  |  |  | files   => 2050765568, | 
| 652 |  |  |  |  |  |  | flag    => 4096, | 
| 653 |  |  |  |  |  |  | favail  => 2042092649, | 
| 654 |  |  |  |  |  |  | bavail  => 4333064312, | 
| 655 |  |  |  |  |  |  | ffree   => 2042092649, | 
| 656 |  |  |  |  |  |  | namemax => 255, | 
| 657 |  |  |  |  |  |  | frsize  => 1024, | 
| 658 |  |  |  |  |  |  | fsid    => 1810 | 
| 659 |  |  |  |  |  |  | } | 
| 660 |  |  |  |  |  |  |  | 
| 661 |  |  |  |  |  |  | =item aio_utime $fh_or_path, $atime, $mtime, $callback->($status) | 
| 662 |  |  |  |  |  |  |  | 
| 663 |  |  |  |  |  |  | Works like perl's C function (including the special case of $atime | 
| 664 |  |  |  |  |  |  | and $mtime being undef). Fractional times are supported if the underlying | 
| 665 |  |  |  |  |  |  | syscalls support them. | 
| 666 |  |  |  |  |  |  |  | 
| 667 |  |  |  |  |  |  | When called with a pathname, uses utimensat(2) or utimes(2) if available, | 
| 668 |  |  |  |  |  |  | otherwise utime(2). If called on a file descriptor, uses futimens(2) | 
| 669 |  |  |  |  |  |  | or futimes(2) if available, otherwise returns ENOSYS, so this is not | 
| 670 |  |  |  |  |  |  | portable. | 
| 671 |  |  |  |  |  |  |  | 
| 672 |  |  |  |  |  |  | Examples: | 
| 673 |  |  |  |  |  |  |  | 
| 674 |  |  |  |  |  |  | # set atime and mtime to current time (basically touch(1)): | 
| 675 |  |  |  |  |  |  | aio_utime "path", undef, undef; | 
| 676 |  |  |  |  |  |  | # set atime to current time and mtime to beginning of the epoch: | 
| 677 |  |  |  |  |  |  | aio_utime "path", time, undef; # undef==0 | 
| 678 |  |  |  |  |  |  |  | 
| 679 |  |  |  |  |  |  |  | 
| 680 |  |  |  |  |  |  | =item aio_chown $fh_or_path, $uid, $gid, $callback->($status) | 
| 681 |  |  |  |  |  |  |  | 
| 682 |  |  |  |  |  |  | Works like perl's C function, except that C for either $uid | 
| 683 |  |  |  |  |  |  | or $gid is being interpreted as "do not change" (but -1 can also be used). | 
| 684 |  |  |  |  |  |  |  | 
| 685 |  |  |  |  |  |  | Examples: | 
| 686 |  |  |  |  |  |  |  | 
| 687 |  |  |  |  |  |  | # same as "chown root path" in the shell: | 
| 688 |  |  |  |  |  |  | aio_chown "path", 0, -1; | 
| 689 |  |  |  |  |  |  | # same as above: | 
| 690 |  |  |  |  |  |  | aio_chown "path", 0, undef; | 
| 691 |  |  |  |  |  |  |  | 
| 692 |  |  |  |  |  |  |  | 
| 693 |  |  |  |  |  |  | =item aio_truncate $fh_or_path, $offset, $callback->($status) | 
| 694 |  |  |  |  |  |  |  | 
| 695 |  |  |  |  |  |  | Works like truncate(2) or ftruncate(2). | 
| 696 |  |  |  |  |  |  |  | 
| 697 |  |  |  |  |  |  |  | 
| 698 |  |  |  |  |  |  | =item aio_allocate $fh, $mode, $offset, $len, $callback->($status) | 
| 699 |  |  |  |  |  |  |  | 
| 700 |  |  |  |  |  |  | Allocates or frees disk space according to the C<$mode> argument. See the | 
| 701 |  |  |  |  |  |  | linux C documentation for details. | 
| 702 |  |  |  |  |  |  |  | 
| 703 |  |  |  |  |  |  | C<$mode> is usually C<0> or C to allocate | 
| 704 |  |  |  |  |  |  | space, or C, | 
| 705 |  |  |  |  |  |  | to deallocate a file range. | 
| 706 |  |  |  |  |  |  |  | 
| 707 |  |  |  |  |  |  | IO::AIO also supports C, to remove a range | 
| 708 |  |  |  |  |  |  | (without leaving a hole), C, to zero a range, | 
| 709 |  |  |  |  |  |  | C to insert a range and C | 
| 710 |  |  |  |  |  |  | to unshare shared blocks (see your L manpage). | 
| 711 |  |  |  |  |  |  |  | 
| 712 |  |  |  |  |  |  | The file system block size used by C is presumably the | 
| 713 |  |  |  |  |  |  | C returned by C, but different filesystems and filetypes | 
| 714 |  |  |  |  |  |  | can dictate other limitations. | 
| 715 |  |  |  |  |  |  |  | 
| 716 |  |  |  |  |  |  | If C isn't available or cannot be emulated (currently no | 
| 717 |  |  |  |  |  |  | emulation will be attempted), passes C<-1> and sets C<$!> to C. | 
| 718 |  |  |  |  |  |  |  | 
| 719 |  |  |  |  |  |  |  | 
| 720 |  |  |  |  |  |  | =item aio_chmod $fh_or_path, $mode, $callback->($status) | 
| 721 |  |  |  |  |  |  |  | 
| 722 |  |  |  |  |  |  | Works like perl's C function. | 
| 723 |  |  |  |  |  |  |  | 
| 724 |  |  |  |  |  |  |  | 
| 725 |  |  |  |  |  |  | =item aio_unlink $pathname, $callback->($status) | 
| 726 |  |  |  |  |  |  |  | 
| 727 |  |  |  |  |  |  | Asynchronously unlink (delete) a file and call the callback with the | 
| 728 |  |  |  |  |  |  | result code. | 
| 729 |  |  |  |  |  |  |  | 
| 730 |  |  |  |  |  |  |  | 
| 731 |  |  |  |  |  |  | =item aio_mknod $pathname, $mode, $dev, $callback->($status) | 
| 732 |  |  |  |  |  |  |  | 
| 733 |  |  |  |  |  |  | [EXPERIMENTAL] | 
| 734 |  |  |  |  |  |  |  | 
| 735 |  |  |  |  |  |  | Asynchronously create a device node (or fifo). See mknod(2). | 
| 736 |  |  |  |  |  |  |  | 
| 737 |  |  |  |  |  |  | The only (POSIX-) portable way of calling this function is: | 
| 738 |  |  |  |  |  |  |  | 
| 739 |  |  |  |  |  |  | aio_mknod $pathname, IO::AIO::S_IFIFO | $mode, 0, sub { ... | 
| 740 |  |  |  |  |  |  |  | 
| 741 |  |  |  |  |  |  | See C for info about some potentially helpful extra constants | 
| 742 |  |  |  |  |  |  | and functions. | 
| 743 |  |  |  |  |  |  |  | 
| 744 |  |  |  |  |  |  | =item aio_link $srcpath, $dstpath, $callback->($status) | 
| 745 |  |  |  |  |  |  |  | 
| 746 |  |  |  |  |  |  | Asynchronously create a new link to the existing object at C<$srcpath> at | 
| 747 |  |  |  |  |  |  | the path C<$dstpath> and call the callback with the result code. | 
| 748 |  |  |  |  |  |  |  | 
| 749 |  |  |  |  |  |  |  | 
| 750 |  |  |  |  |  |  | =item aio_symlink $srcpath, $dstpath, $callback->($status) | 
| 751 |  |  |  |  |  |  |  | 
| 752 |  |  |  |  |  |  | Asynchronously create a new symbolic link to the existing object at C<$srcpath> at | 
| 753 |  |  |  |  |  |  | the path C<$dstpath> and call the callback with the result code. | 
| 754 |  |  |  |  |  |  |  | 
| 755 |  |  |  |  |  |  |  | 
| 756 |  |  |  |  |  |  | =item aio_readlink $pathname, $callback->($link) | 
| 757 |  |  |  |  |  |  |  | 
| 758 |  |  |  |  |  |  | Asynchronously read the symlink specified by C<$path> and pass it to | 
| 759 |  |  |  |  |  |  | the callback. If an error occurs, nothing or undef gets passed to the | 
| 760 |  |  |  |  |  |  | callback. | 
| 761 |  |  |  |  |  |  |  | 
| 762 |  |  |  |  |  |  |  | 
| 763 |  |  |  |  |  |  | =item aio_realpath $pathname, $callback->($path) | 
| 764 |  |  |  |  |  |  |  | 
| 765 |  |  |  |  |  |  | Asynchronously make the path absolute and resolve any symlinks in | 
| 766 |  |  |  |  |  |  | C<$path>. The resulting path only consists of directories (same as | 
| 767 |  |  |  |  |  |  | L). | 
| 768 |  |  |  |  |  |  |  | 
| 769 |  |  |  |  |  |  | This request can be used to get the absolute path of the current working | 
| 770 |  |  |  |  |  |  | directory by passing it a path of F<.> (a single dot). | 
| 771 |  |  |  |  |  |  |  | 
| 772 |  |  |  |  |  |  |  | 
| 773 |  |  |  |  |  |  | =item aio_rename $srcpath, $dstpath, $callback->($status) | 
| 774 |  |  |  |  |  |  |  | 
| 775 |  |  |  |  |  |  | Asynchronously rename the object at C<$srcpath> to C<$dstpath>, just as | 
| 776 |  |  |  |  |  |  | rename(2) and call the callback with the result code. | 
| 777 |  |  |  |  |  |  |  | 
| 778 |  |  |  |  |  |  | On systems that support the AIO::WD working directory abstraction | 
| 779 |  |  |  |  |  |  | natively, the case C<[$wd, "."]> as C<$srcpath> is specialcased - instead | 
| 780 |  |  |  |  |  |  | of failing, C is called on the absolute path of C<$wd>. | 
| 781 |  |  |  |  |  |  |  | 
| 782 |  |  |  |  |  |  |  | 
| 783 |  |  |  |  |  |  | =item aio_rename2 $srcpath, $dstpath, $flags, $callback->($status) | 
| 784 |  |  |  |  |  |  |  | 
| 785 |  |  |  |  |  |  | Basically a version of C with an additional C<$flags> | 
| 786 |  |  |  |  |  |  | argument. Calling this with C<$flags=0> is the same as calling | 
| 787 |  |  |  |  |  |  | C. | 
| 788 |  |  |  |  |  |  |  | 
| 789 |  |  |  |  |  |  | Non-zero flags are currently only supported on GNU/Linux systems that | 
| 790 |  |  |  |  |  |  | support renameat2. Other systems fail with C in this case. | 
| 791 |  |  |  |  |  |  |  | 
| 792 |  |  |  |  |  |  | The following constants are available (missing ones are, as usual C<0>), | 
| 793 |  |  |  |  |  |  | see renameat2(2) for details: | 
| 794 |  |  |  |  |  |  |  | 
| 795 |  |  |  |  |  |  | C, C | 
| 796 |  |  |  |  |  |  | and C. | 
| 797 |  |  |  |  |  |  |  | 
| 798 |  |  |  |  |  |  |  | 
| 799 |  |  |  |  |  |  | =item aio_mkdir $pathname, $mode, $callback->($status) | 
| 800 |  |  |  |  |  |  |  | 
| 801 |  |  |  |  |  |  | Asynchronously mkdir (create) a directory and call the callback with | 
| 802 |  |  |  |  |  |  | the result code. C<$mode> will be modified by the umask at the time the | 
| 803 |  |  |  |  |  |  | request is executed, so do not change your umask. | 
| 804 |  |  |  |  |  |  |  | 
| 805 |  |  |  |  |  |  |  | 
| 806 |  |  |  |  |  |  | =item aio_rmdir $pathname, $callback->($status) | 
| 807 |  |  |  |  |  |  |  | 
| 808 |  |  |  |  |  |  | Asynchronously rmdir (delete) a directory and call the callback with the | 
| 809 |  |  |  |  |  |  | result code. | 
| 810 |  |  |  |  |  |  |  | 
| 811 |  |  |  |  |  |  | On systems that support the AIO::WD working directory abstraction | 
| 812 |  |  |  |  |  |  | natively, the case C<[$wd, "."]> is specialcased - instead of failing, | 
| 813 |  |  |  |  |  |  | C is called on the absolute path of C<$wd>. | 
| 814 |  |  |  |  |  |  |  | 
| 815 |  |  |  |  |  |  |  | 
| 816 |  |  |  |  |  |  | =item aio_readdir $pathname, $callback->($entries) | 
| 817 |  |  |  |  |  |  |  | 
| 818 |  |  |  |  |  |  | Unlike the POSIX call of the same name, C reads an entire | 
| 819 |  |  |  |  |  |  | directory (i.e. opendir + readdir + closedir). The entries will not be | 
| 820 |  |  |  |  |  |  | sorted, and will B include the C<.> and C<..> entries. | 
| 821 |  |  |  |  |  |  |  | 
| 822 |  |  |  |  |  |  | The callback is passed a single argument which is either C or an | 
| 823 |  |  |  |  |  |  | array-ref with the filenames. | 
| 824 |  |  |  |  |  |  |  | 
| 825 |  |  |  |  |  |  |  | 
| 826 |  |  |  |  |  |  | =item aio_readdirx $pathname, $flags, $callback->($entries, $flags) | 
| 827 |  |  |  |  |  |  |  | 
| 828 |  |  |  |  |  |  | Quite similar to C, but the C<$flags> argument allows one to | 
| 829 |  |  |  |  |  |  | tune behaviour and output format. In case of an error, C<$entries> will be | 
| 830 |  |  |  |  |  |  | C. | 
| 831 |  |  |  |  |  |  |  | 
| 832 |  |  |  |  |  |  | The flags are a combination of the following constants, ORed together (the | 
| 833 |  |  |  |  |  |  | flags will also be passed to the callback, possibly modified): | 
| 834 |  |  |  |  |  |  |  | 
| 835 |  |  |  |  |  |  | =over 4 | 
| 836 |  |  |  |  |  |  |  | 
| 837 |  |  |  |  |  |  | =item IO::AIO::READDIR_DENTS | 
| 838 |  |  |  |  |  |  |  | 
| 839 |  |  |  |  |  |  | Normally the callback gets an arrayref consisting of names only (as | 
| 840 |  |  |  |  |  |  | with C). If this flag is set, then the callback gets an | 
| 841 |  |  |  |  |  |  | arrayref with C<[$name, $type, $inode]> arrayrefs, each describing a | 
| 842 |  |  |  |  |  |  | single directory entry in more detail: | 
| 843 |  |  |  |  |  |  |  | 
| 844 |  |  |  |  |  |  | C<$name> is the name of the entry. | 
| 845 |  |  |  |  |  |  |  | 
| 846 |  |  |  |  |  |  | C<$type> is one of the C constants: | 
| 847 |  |  |  |  |  |  |  | 
| 848 |  |  |  |  |  |  | C, C, C, C, | 
| 849 |  |  |  |  |  |  | C, C, C, C, | 
| 850 |  |  |  |  |  |  | C. | 
| 851 |  |  |  |  |  |  |  | 
| 852 |  |  |  |  |  |  | C means just that: readdir does not know. If you need | 
| 853 |  |  |  |  |  |  | to know, you have to run stat yourself. Also, for speed/memory reasons, | 
| 854 |  |  |  |  |  |  | the C<$type> scalars are read-only: you must not modify them. | 
| 855 |  |  |  |  |  |  |  | 
| 856 |  |  |  |  |  |  | C<$inode> is the inode number (which might not be exact on systems with 64 | 
| 857 |  |  |  |  |  |  | bit inode numbers and 32 bit perls). This field has unspecified content on | 
| 858 |  |  |  |  |  |  | systems that do not deliver the inode information. | 
| 859 |  |  |  |  |  |  |  | 
| 860 |  |  |  |  |  |  | =item IO::AIO::READDIR_DIRS_FIRST | 
| 861 |  |  |  |  |  |  |  | 
| 862 |  |  |  |  |  |  | When this flag is set, then the names will be returned in an order where | 
| 863 |  |  |  |  |  |  | likely directories come first, in optimal stat order. This is useful when | 
| 864 |  |  |  |  |  |  | you need to quickly find directories, or you want to find all directories | 
| 865 |  |  |  |  |  |  | while avoiding to stat() each entry. | 
| 866 |  |  |  |  |  |  |  | 
| 867 |  |  |  |  |  |  | If the system returns type information in readdir, then this is used | 
| 868 |  |  |  |  |  |  | to find directories directly. Otherwise, likely directories are names | 
| 869 |  |  |  |  |  |  | beginning with ".", or otherwise names with no dots, of which names with | 
| 870 |  |  |  |  |  |  | short names are tried first. | 
| 871 |  |  |  |  |  |  |  | 
| 872 |  |  |  |  |  |  | =item IO::AIO::READDIR_STAT_ORDER | 
| 873 |  |  |  |  |  |  |  | 
| 874 |  |  |  |  |  |  | When this flag is set, then the names will be returned in an order | 
| 875 |  |  |  |  |  |  | suitable for stat()'ing each one. That is, when you plan to stat() most or | 
| 876 |  |  |  |  |  |  | all files in the given directory, then the returned order will likely be | 
| 877 |  |  |  |  |  |  | faster. | 
| 878 |  |  |  |  |  |  |  | 
| 879 |  |  |  |  |  |  | If both this flag and C are specified, | 
| 880 |  |  |  |  |  |  | then the likely dirs come first, resulting in a less optimal stat order | 
| 881 |  |  |  |  |  |  | for stat'ing all entries, but likely a more optimal order for finding | 
| 882 |  |  |  |  |  |  | subdirectories. | 
| 883 |  |  |  |  |  |  |  | 
| 884 |  |  |  |  |  |  | =item IO::AIO::READDIR_FOUND_UNKNOWN | 
| 885 |  |  |  |  |  |  |  | 
| 886 |  |  |  |  |  |  | This flag should not be set when calling C. Instead, it | 
| 887 |  |  |  |  |  |  | is being set by C, when any of the C<$type>'s found were | 
| 888 |  |  |  |  |  |  | C. The absence of this flag therefore indicates that all | 
| 889 |  |  |  |  |  |  | C<$type>'s are known, which can be used to speed up some algorithms. | 
| 890 |  |  |  |  |  |  |  | 
| 891 |  |  |  |  |  |  | =back | 
| 892 |  |  |  |  |  |  |  | 
| 893 |  |  |  |  |  |  |  | 
| 894 |  |  |  |  |  |  | =item aio_slurp $pathname, $offset, $length, $data, $callback->($status) | 
| 895 |  |  |  |  |  |  |  | 
| 896 |  |  |  |  |  |  | Opens, reads and closes the given file. The data is put into C<$data>, | 
| 897 |  |  |  |  |  |  | which is resized as required. | 
| 898 |  |  |  |  |  |  |  | 
| 899 |  |  |  |  |  |  | If C<$offset> is negative, then it is counted from the end of the file. | 
| 900 |  |  |  |  |  |  |  | 
| 901 |  |  |  |  |  |  | If C<$length> is zero, then the remaining length of the file is | 
| 902 |  |  |  |  |  |  | used. Also, in this case, the same limitations to modifying C<$data> apply | 
| 903 |  |  |  |  |  |  | as when IO::AIO::mmap is used, i.e. it must only be modified in-place | 
| 904 |  |  |  |  |  |  | with C. If the size of the file is known, specifying a non-zero | 
| 905 |  |  |  |  |  |  | C<$length> results in a performance advantage. | 
| 906 |  |  |  |  |  |  |  | 
| 907 |  |  |  |  |  |  | This request is similar to the older C request, but since it is | 
| 908 |  |  |  |  |  |  | a single request, it might be more efficient to use. | 
| 909 |  |  |  |  |  |  |  | 
| 910 |  |  |  |  |  |  | Example: load F into C<$passwd>. | 
| 911 |  |  |  |  |  |  |  | 
| 912 |  |  |  |  |  |  | my $passwd; | 
| 913 |  |  |  |  |  |  | aio_slurp "/etc/passwd", 0, 0, $passwd, sub { | 
| 914 |  |  |  |  |  |  | $_[0] >= 0 | 
| 915 |  |  |  |  |  |  | or die "/etc/passwd: $!\n"; | 
| 916 |  |  |  |  |  |  |  | 
| 917 |  |  |  |  |  |  | printf "/etc/passwd is %d bytes long, and contains:\n", length $passwd; | 
| 918 |  |  |  |  |  |  | print $passwd; | 
| 919 |  |  |  |  |  |  | }; | 
| 920 |  |  |  |  |  |  | IO::AIO::flush; | 
| 921 |  |  |  |  |  |  |  | 
| 922 |  |  |  |  |  |  |  | 
| 923 |  |  |  |  |  |  | =item aio_load $pathname, $data, $callback->($status) | 
| 924 |  |  |  |  |  |  |  | 
| 925 |  |  |  |  |  |  | This is a composite request that tries to fully load the given file into | 
| 926 |  |  |  |  |  |  | memory. Status is the same as with aio_read. | 
| 927 |  |  |  |  |  |  |  | 
| 928 |  |  |  |  |  |  | Using C might be more efficient, as it is a single request. | 
| 929 |  |  |  |  |  |  |  | 
| 930 |  |  |  |  |  |  | =cut | 
| 931 |  |  |  |  |  |  |  | 
| 932 |  |  |  |  |  |  | sub aio_load($$;$) { | 
| 933 | 0 |  |  | 0 | 1 | 0 | my ($path, undef, $cb) = @_; | 
| 934 | 0 |  |  |  |  | 0 | my $data = \$_[1]; | 
| 935 |  |  |  |  |  |  |  | 
| 936 | 0 |  |  |  |  | 0 | my $pri = aioreq_pri; | 
| 937 | 0 |  |  |  |  | 0 | my $grp = aio_group $cb; | 
| 938 |  |  |  |  |  |  |  | 
| 939 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 940 |  |  |  |  |  |  | add $grp aio_open $path, O_RDONLY, 0, sub { | 
| 941 | 0 | 0 |  | 0 |  | 0 | my $fh = shift | 
| 942 |  |  |  |  |  |  | or return $grp->result (-1); | 
| 943 |  |  |  |  |  |  |  | 
| 944 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 945 |  |  |  |  |  |  | add $grp aio_read $fh, 0, (-s $fh), $$data, 0, sub { | 
| 946 | 0 |  |  |  |  | 0 | $grp->result ($_[0]); | 
| 947 | 0 |  |  |  |  | 0 | }; | 
| 948 | 0 |  |  |  |  | 0 | }; | 
| 949 |  |  |  |  |  |  |  | 
| 950 | 0 |  |  |  |  | 0 | $grp | 
| 951 |  |  |  |  |  |  | } | 
| 952 |  |  |  |  |  |  |  | 
| 953 |  |  |  |  |  |  | =item aio_copy $srcpath, $dstpath, $callback->($status) | 
| 954 |  |  |  |  |  |  |  | 
| 955 |  |  |  |  |  |  | Try to copy the I (directories not supported as either source or | 
| 956 |  |  |  |  |  |  | destination) from C<$srcpath> to C<$dstpath> and call the callback with | 
| 957 |  |  |  |  |  |  | a status of C<0> (ok) or C<-1> (error, see C<$!>). | 
| 958 |  |  |  |  |  |  |  | 
| 959 |  |  |  |  |  |  | Existing destination files will be truncated. | 
| 960 |  |  |  |  |  |  |  | 
| 961 |  |  |  |  |  |  | This is a composite request that creates the destination file with | 
| 962 |  |  |  |  |  |  | mode 0200 and copies the contents of the source file into it using | 
| 963 |  |  |  |  |  |  | C, followed by restoring atime, mtime, access mode and | 
| 964 |  |  |  |  |  |  | uid/gid, in that order. | 
| 965 |  |  |  |  |  |  |  | 
| 966 |  |  |  |  |  |  | If an error occurs, the partial destination file will be unlinked, if | 
| 967 |  |  |  |  |  |  | possible, except when setting atime, mtime, access mode and uid/gid, where | 
| 968 |  |  |  |  |  |  | errors are being ignored. | 
| 969 |  |  |  |  |  |  |  | 
| 970 |  |  |  |  |  |  | =cut | 
| 971 |  |  |  |  |  |  |  | 
| 972 |  |  |  |  |  |  | sub aio_copy($$;$) { | 
| 973 | 0 |  |  | 0 | 1 | 0 | my ($src, $dst, $cb) = @_; | 
| 974 |  |  |  |  |  |  |  | 
| 975 | 0 |  |  |  |  | 0 | my $pri = aioreq_pri; | 
| 976 | 0 |  |  |  |  | 0 | my $grp = aio_group $cb; | 
| 977 |  |  |  |  |  |  |  | 
| 978 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 979 |  |  |  |  |  |  | add $grp aio_open $src, O_RDONLY, 0, sub { | 
| 980 | 0 | 0 |  | 0 |  | 0 | if (my $src_fh = $_[0]) { | 
| 981 | 0 |  |  |  |  | 0 | my @stat = stat $src_fh; # hmm, might block over nfs? | 
| 982 |  |  |  |  |  |  |  | 
| 983 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 984 |  |  |  |  |  |  | add $grp aio_open $dst, O_CREAT | O_WRONLY | O_TRUNC, 0200, sub { | 
| 985 | 0 | 0 |  |  |  | 0 | if (my $dst_fh = $_[0]) { | 
| 986 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 987 |  |  |  |  |  |  | add $grp aio_sendfile $dst_fh, $src_fh, 0, $stat[7], sub { | 
| 988 | 0 | 0 |  |  |  | 0 | if ($_[0] == $stat[7]) { | 
| 989 | 0 |  |  |  |  | 0 | $grp->result (0); | 
| 990 | 0 |  |  |  |  | 0 | close $src_fh; | 
| 991 |  |  |  |  |  |  |  | 
| 992 |  |  |  |  |  |  | my $ch = sub { | 
| 993 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 994 |  |  |  |  |  |  | add $grp aio_chmod $dst_fh, $stat[2] & 07777, sub { | 
| 995 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 996 |  |  |  |  |  |  | add $grp aio_chown $dst_fh, $stat[4], $stat[5], sub { | 
| 997 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 998 | 0 |  |  |  |  | 0 | add $grp aio_close $dst_fh; | 
| 999 |  |  |  |  |  |  | } | 
| 1000 | 0 |  |  |  |  | 0 | }; | 
|  | 0 |  |  |  |  | 0 |  | 
| 1001 | 0 |  |  |  |  | 0 | }; | 
| 1002 |  |  |  |  |  |  |  | 
| 1003 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 1004 |  |  |  |  |  |  | add $grp aio_utime $dst_fh, $stat[8], $stat[9], sub { | 
| 1005 | 0 | 0 | 0 |  |  | 0 | if ($_[0] < 0 && $! == ENOSYS) { | 
| 1006 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 1007 | 0 |  |  |  |  | 0 | add $grp aio_utime $dst, $stat[8], $stat[9], $ch; | 
| 1008 |  |  |  |  |  |  | } else { | 
| 1009 | 0 |  |  |  |  | 0 | $ch->(); | 
| 1010 |  |  |  |  |  |  | } | 
| 1011 | 0 |  |  |  |  | 0 | }; | 
| 1012 |  |  |  |  |  |  | } else { | 
| 1013 | 0 |  |  |  |  | 0 | $grp->result (-1); | 
| 1014 | 0 |  |  |  |  | 0 | close $src_fh; | 
| 1015 | 0 |  |  |  |  | 0 | close $dst_fh; | 
| 1016 |  |  |  |  |  |  |  | 
| 1017 | 0 |  |  |  |  | 0 | aioreq $pri; | 
| 1018 | 0 |  |  |  |  | 0 | add $grp aio_unlink $dst; | 
| 1019 |  |  |  |  |  |  | } | 
| 1020 | 0 |  |  |  |  | 0 | }; | 
| 1021 |  |  |  |  |  |  | } else { | 
| 1022 | 0 |  |  |  |  | 0 | $grp->result (-1); | 
| 1023 |  |  |  |  |  |  | } | 
| 1024 |  |  |  |  |  |  | }, | 
| 1025 |  |  |  |  |  |  |  | 
| 1026 | 0 |  |  |  |  | 0 | } else { | 
| 1027 | 0 |  |  |  |  | 0 | $grp->result (-1); | 
| 1028 |  |  |  |  |  |  | } | 
| 1029 | 0 |  |  |  |  | 0 | }; | 
| 1030 |  |  |  |  |  |  |  | 
| 1031 | 0 |  |  |  |  | 0 | $grp | 
| 1032 |  |  |  |  |  |  | } | 
| 1033 |  |  |  |  |  |  |  | 
| 1034 |  |  |  |  |  |  | =item aio_move $srcpath, $dstpath, $callback->($status) | 
| 1035 |  |  |  |  |  |  |  | 
| 1036 |  |  |  |  |  |  | Try to move the I (directories not supported as either source or | 
| 1037 |  |  |  |  |  |  | destination) from C<$srcpath> to C<$dstpath> and call the callback with | 
| 1038 |  |  |  |  |  |  | a status of C<0> (ok) or C<-1> (error, see C<$!>). | 
| 1039 |  |  |  |  |  |  |  | 
| 1040 |  |  |  |  |  |  | This is a composite request that tries to rename(2) the file first; if | 
| 1041 |  |  |  |  |  |  | rename fails with C, it copies the file with C and, if | 
| 1042 |  |  |  |  |  |  | that is successful, unlinks the C<$srcpath>. | 
| 1043 |  |  |  |  |  |  |  | 
| 1044 |  |  |  |  |  |  | =cut | 
| 1045 |  |  |  |  |  |  |  | 
| 1046 |  |  |  |  |  |  | sub aio_move($$;$) { | 
| 1047 | 0 |  |  | 0 | 1 | 0 | my ($src, $dst, $cb) = @_; | 
| 1048 |  |  |  |  |  |  |  | 
| 1049 | 0 |  |  |  |  | 0 | my $pri = aioreq_pri; | 
| 1050 | 0 |  |  |  |  | 0 | my $grp = aio_group $cb; | 
| 1051 |  |  |  |  |  |  |  | 
| 1052 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 1053 |  |  |  |  |  |  | add $grp aio_rename $src, $dst, sub { | 
| 1054 | 0 | 0 | 0 | 0 |  | 0 | if ($_[0] && $! == EXDEV) { | 
| 1055 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 1056 |  |  |  |  |  |  | add $grp aio_copy $src, $dst, sub { | 
| 1057 | 0 |  |  |  |  | 0 | $grp->result ($_[0]); | 
| 1058 |  |  |  |  |  |  |  | 
| 1059 | 0 | 0 |  |  |  | 0 | unless ($_[0]) { | 
| 1060 | 0 |  |  |  |  | 0 | aioreq_pri $pri; | 
| 1061 | 0 |  |  |  |  | 0 | add $grp aio_unlink $src; | 
| 1062 |  |  |  |  |  |  | } | 
| 1063 | 0 |  |  |  |  | 0 | }; | 
| 1064 |  |  |  |  |  |  | } else { | 
| 1065 | 0 |  |  |  |  | 0 | $grp->result ($_[0]); | 
| 1066 |  |  |  |  |  |  | } | 
| 1067 | 0 |  |  |  |  | 0 | }; | 
| 1068 |  |  |  |  |  |  |  | 
| 1069 | 0 |  |  |  |  | 0 | $grp | 
| 1070 |  |  |  |  |  |  | } | 
| 1071 |  |  |  |  |  |  |  | 
| 1072 |  |  |  |  |  |  | =item aio_scandir $pathname, $maxreq, $callback->($dirs, $nondirs) | 
| 1073 |  |  |  |  |  |  |  | 
| 1074 |  |  |  |  |  |  | Scans a directory (similar to C) but additionally tries to | 
| 1075 |  |  |  |  |  |  | efficiently separate the entries of directory C<$path> into two sets of | 
| 1076 |  |  |  |  |  |  | names, directories you can recurse into (directories), and ones you cannot | 
| 1077 |  |  |  |  |  |  | recurse into (everything else, including symlinks to directories). | 
| 1078 |  |  |  |  |  |  |  | 
| 1079 |  |  |  |  |  |  | C is a composite request that generates many sub requests. | 
| 1080 |  |  |  |  |  |  | C<$maxreq> specifies the maximum number of outstanding aio requests that | 
| 1081 |  |  |  |  |  |  | this function generates. If it is C<< <= 0 >>, then a suitable default | 
| 1082 |  |  |  |  |  |  | will be chosen (currently 4). | 
| 1083 |  |  |  |  |  |  |  | 
| 1084 |  |  |  |  |  |  | On error, the callback is called without arguments, otherwise it receives | 
| 1085 |  |  |  |  |  |  | two array-refs with path-relative entry names. | 
| 1086 |  |  |  |  |  |  |  | 
| 1087 |  |  |  |  |  |  | Example: | 
| 1088 |  |  |  |  |  |  |  | 
| 1089 |  |  |  |  |  |  | aio_scandir $dir, 0, sub { | 
| 1090 |  |  |  |  |  |  | my ($dirs, $nondirs) = @_; | 
| 1091 |  |  |  |  |  |  | print "real directories: @$dirs\n"; | 
| 1092 |  |  |  |  |  |  | print "everything else: @$nondirs\n"; | 
| 1093 |  |  |  |  |  |  | }; | 
| 1094 |  |  |  |  |  |  |  | 
| 1095 |  |  |  |  |  |  | Implementation notes. | 
| 1096 |  |  |  |  |  |  |  | 
| 1097 |  |  |  |  |  |  | The C cannot be avoided, but C'ing every entry can. | 
| 1098 |  |  |  |  |  |  |  | 
| 1099 |  |  |  |  |  |  | If readdir returns file type information, then this is used directly to | 
| 1100 |  |  |  |  |  |  | find directories. | 
| 1101 |  |  |  |  |  |  |  | 
| 1102 |  |  |  |  |  |  | Otherwise, after reading the directory, the modification time, size etc. | 
| 1103 |  |  |  |  |  |  | of the directory before and after the readdir is checked, and if they | 
| 1104 |  |  |  |  |  |  | match (and isn't the current time), the link count will be used to decide | 
| 1105 |  |  |  |  |  |  | how many entries are directories (if >= 2). Otherwise, no knowledge of the | 
| 1106 |  |  |  |  |  |  | number of subdirectories will be assumed. | 
| 1107 |  |  |  |  |  |  |  | 
| 1108 |  |  |  |  |  |  | Then entries will be sorted into likely directories a non-initial dot | 
| 1109 |  |  |  |  |  |  | currently) and likely non-directories (see C). Then every | 
| 1110 |  |  |  |  |  |  | entry plus an appended C will be C'ed, likely directories first, | 
| 1111 |  |  |  |  |  |  | in order of their inode numbers. If that succeeds, it assumes that the | 
| 1112 |  |  |  |  |  |  | entry is a directory or a symlink to directory (which will be checked | 
| 1113 |  |  |  |  |  |  | separately). This is often faster than stat'ing the entry itself because | 
| 1114 |  |  |  |  |  |  | filesystems might detect the type of the entry without reading the inode | 
| 1115 |  |  |  |  |  |  | data (e.g. ext2fs filetype feature), even on systems that cannot return | 
| 1116 |  |  |  |  |  |  | the filetype information on readdir. | 
| 1117 |  |  |  |  |  |  |  | 
| 1118 |  |  |  |  |  |  | If the known number of directories (link count - 2) has been reached, the | 
| 1119 |  |  |  |  |  |  | rest of the entries is assumed to be non-directories. | 
| 1120 |  |  |  |  |  |  |  | 
| 1121 |  |  |  |  |  |  | This only works with certainty on POSIX (= UNIX) filesystems, which | 
| 1122 |  |  |  |  |  |  | fortunately are the vast majority of filesystems around. | 
| 1123 |  |  |  |  |  |  |  | 
| 1124 |  |  |  |  |  |  | It will also likely work on non-POSIX filesystems with reduced efficiency | 
| 1125 |  |  |  |  |  |  | as those tend to return 0 or 1 as link counts, which disables the | 
| 1126 |  |  |  |  |  |  | directory counting heuristic. | 
| 1127 |  |  |  |  |  |  |  | 
| 1128 |  |  |  |  |  |  | =cut | 
| 1129 |  |  |  |  |  |  |  | 
| 1130 |  |  |  |  |  |  | sub aio_scandir($$;$) { | 
| 1131 | 1 |  |  | 1 | 1 | 1091 | my ($path, $maxreq, $cb) = @_; | 
| 1132 |  |  |  |  |  |  |  | 
| 1133 | 1 |  |  |  |  | 3 | my $pri = aioreq_pri; | 
| 1134 |  |  |  |  |  |  |  | 
| 1135 | 1 |  |  |  |  | 11 | my $grp = aio_group $cb; | 
| 1136 |  |  |  |  |  |  |  | 
| 1137 | 1 | 50 |  |  |  | 5 | $maxreq = 4 if $maxreq <= 0; | 
| 1138 |  |  |  |  |  |  |  | 
| 1139 |  |  |  |  |  |  | # get a wd object | 
| 1140 | 1 |  |  |  |  | 3 | aioreq_pri $pri; | 
| 1141 |  |  |  |  |  |  | add $grp aio_wd $path, sub { | 
| 1142 | 1 | 50 |  | 1 |  | 104 | $_[0] | 
| 1143 |  |  |  |  |  |  | or return $grp->result (); | 
| 1144 |  |  |  |  |  |  |  | 
| 1145 | 1 |  |  |  |  | 22 | my $wd = [shift, "."]; | 
| 1146 |  |  |  |  |  |  |  | 
| 1147 |  |  |  |  |  |  | # stat once | 
| 1148 | 1 |  |  |  |  | 4 | aioreq_pri $pri; | 
| 1149 |  |  |  |  |  |  | add $grp aio_stat $wd, sub { | 
| 1150 | 1 | 50 |  |  |  | 59 | return $grp->result () if $_[0]; | 
| 1151 | 1 |  |  |  |  | 2 | my $now = time; | 
| 1152 | 1 |  |  |  |  | 17 | my $hash1 = join ":", (stat _)[0,1,3,7,9]; | 
| 1153 | 1 |  |  |  |  | 4 | my $rdxflags = READDIR_DIRS_FIRST; | 
| 1154 |  |  |  |  |  |  |  | 
| 1155 | 1 | 50 |  |  |  | 5 | if ((stat _)[3] < 2) { | 
| 1156 |  |  |  |  |  |  | # at least one non-POSIX filesystem exists | 
| 1157 |  |  |  |  |  |  | # that returns useful DT_type values: btrfs, | 
| 1158 |  |  |  |  |  |  | # so optimise for this here by requesting dents | 
| 1159 | 0 |  |  |  |  | 0 | $rdxflags |= READDIR_DENTS; | 
| 1160 |  |  |  |  |  |  | } | 
| 1161 |  |  |  |  |  |  |  | 
| 1162 |  |  |  |  |  |  | # read the directory entries | 
| 1163 | 1 |  |  |  |  | 3 | aioreq_pri $pri; | 
| 1164 |  |  |  |  |  |  | add $grp aio_readdirx $wd, $rdxflags, sub { | 
| 1165 | 1 | 50 |  |  |  | 173 | my ($entries, $flags) = @_ | 
| 1166 |  |  |  |  |  |  | or return $grp->result (); | 
| 1167 |  |  |  |  |  |  |  | 
| 1168 | 1 | 50 |  |  |  | 4 | if ($rdxflags & READDIR_DENTS) { | 
| 1169 |  |  |  |  |  |  | # if we requested type values, see if we can use them directly. | 
| 1170 |  |  |  |  |  |  |  | 
| 1171 |  |  |  |  |  |  | # if there were any DT_UNKNOWN entries then we assume we | 
| 1172 |  |  |  |  |  |  | # don't know. alternatively, we could assume that if we get | 
| 1173 |  |  |  |  |  |  | # one DT_DIR, then all directories are indeed marked with | 
| 1174 |  |  |  |  |  |  | # DT_DIR, but this seems not required for btrfs, and this | 
| 1175 |  |  |  |  |  |  | # is basically the "btrfs can't get it's act together" code | 
| 1176 |  |  |  |  |  |  | # branch. | 
| 1177 | 0 | 0 |  |  |  | 0 | unless ($flags & READDIR_FOUND_UNKNOWN) { | 
| 1178 |  |  |  |  |  |  | # now we have valid DT_ information for all entries, | 
| 1179 |  |  |  |  |  |  | # so use it as an optimisation without further stat's. | 
| 1180 |  |  |  |  |  |  | # they must also all be at the beginning of @$entries | 
| 1181 |  |  |  |  |  |  | # by now. | 
| 1182 |  |  |  |  |  |  |  | 
| 1183 | 0 |  |  |  |  | 0 | my $dirs; | 
| 1184 |  |  |  |  |  |  |  | 
| 1185 | 0 | 0 |  |  |  | 0 | if (@$entries) { | 
| 1186 | 0 |  |  |  |  | 0 | for (0 .. $#$entries) { | 
| 1187 | 0 | 0 |  |  |  | 0 | if ($entries->[$_][1] != DT_DIR) { | 
| 1188 |  |  |  |  |  |  | # splice out directories | 
| 1189 | 0 |  |  |  |  | 0 | $dirs = [splice @$entries, 0, $_]; | 
| 1190 | 0 |  |  |  |  | 0 | last; | 
| 1191 |  |  |  |  |  |  | } | 
| 1192 |  |  |  |  |  |  | } | 
| 1193 |  |  |  |  |  |  |  | 
| 1194 |  |  |  |  |  |  | # if we didn't find any non-dir, then all entries are dirs | 
| 1195 | 0 | 0 |  |  |  | 0 | unless ($dirs) { | 
| 1196 | 0 |  |  |  |  | 0 | ($dirs, $entries) = ($entries, []); | 
| 1197 |  |  |  |  |  |  | } | 
| 1198 |  |  |  |  |  |  | } else { | 
| 1199 |  |  |  |  |  |  | # directory is empty, so there are no sbdirs | 
| 1200 | 0 |  |  |  |  | 0 | $dirs = []; | 
| 1201 |  |  |  |  |  |  | } | 
| 1202 |  |  |  |  |  |  |  | 
| 1203 |  |  |  |  |  |  | # either splice'd the directories out or the dir was empty. | 
| 1204 |  |  |  |  |  |  | # convert dents to filenames | 
| 1205 | 0 |  |  |  |  | 0 | $_ = $_->[0] for @$dirs; | 
| 1206 | 0 |  |  |  |  | 0 | $_ = $_->[0] for @$entries; | 
| 1207 |  |  |  |  |  |  |  | 
| 1208 | 0 |  |  |  |  | 0 | return $grp->result ($dirs, $entries); | 
| 1209 |  |  |  |  |  |  | } | 
| 1210 |  |  |  |  |  |  |  | 
| 1211 |  |  |  |  |  |  | # cannot use, so return to our old ways | 
| 1212 |  |  |  |  |  |  | # by pretending we only scanned for names. | 
| 1213 | 0 |  |  |  |  | 0 | $_ = $_->[0] for @$entries; | 
| 1214 |  |  |  |  |  |  | } | 
| 1215 |  |  |  |  |  |  |  | 
| 1216 |  |  |  |  |  |  | # stat the dir another time | 
| 1217 | 1 |  |  |  |  | 4 | aioreq_pri $pri; | 
| 1218 |  |  |  |  |  |  | add $grp aio_stat $wd, sub { | 
| 1219 | 1 |  |  |  |  | 145 | my $hash2 = join ":", (stat _)[0,1,3,7,9]; | 
| 1220 |  |  |  |  |  |  |  | 
| 1221 | 1 |  |  |  |  | 4 | my $ndirs; | 
| 1222 |  |  |  |  |  |  |  | 
| 1223 |  |  |  |  |  |  | # take the slow route if anything looks fishy | 
| 1224 | 1 | 50 | 33 |  |  | 10 | if ($hash1 ne $hash2 or (stat _)[9] == $now) { | 
| 1225 | 0 |  |  |  |  | 0 | $ndirs = -1; | 
| 1226 |  |  |  |  |  |  | } else { | 
| 1227 |  |  |  |  |  |  | # if nlink == 2, we are finished | 
| 1228 |  |  |  |  |  |  | # for non-posix-fs's, we rely on nlink < 2 | 
| 1229 | 1 | 50 |  |  |  | 24 | $ndirs = (stat _)[3] - 2 | 
| 1230 |  |  |  |  |  |  | or return $grp->result ([], $entries); | 
| 1231 |  |  |  |  |  |  | } | 
| 1232 |  |  |  |  |  |  |  | 
| 1233 | 1 |  |  |  |  | 4 | my (@dirs, @nondirs); | 
| 1234 |  |  |  |  |  |  |  | 
| 1235 |  |  |  |  |  |  | my $statgrp = add $grp aio_group sub { | 
| 1236 | 1 |  |  |  |  | 7 | $grp->result (\@dirs, \@nondirs); | 
| 1237 | 1 |  |  |  |  | 17 | }; | 
| 1238 |  |  |  |  |  |  |  | 
| 1239 | 1 |  |  |  |  | 5 | limit $statgrp $maxreq; | 
| 1240 |  |  |  |  |  |  | feed $statgrp sub { | 
| 1241 | 10 | 50 |  |  |  | 27 | return unless @$entries; | 
| 1242 | 10 |  |  |  |  | 13 | my $entry = shift @$entries; | 
| 1243 |  |  |  |  |  |  |  | 
| 1244 | 10 |  |  |  |  | 22 | aioreq_pri $pri; | 
| 1245 | 10 |  |  |  |  | 17 | $wd->[1] = "$entry/."; | 
| 1246 |  |  |  |  |  |  | add $statgrp aio_stat $wd, sub { | 
| 1247 | 10 | 100 |  |  |  | 130 | if ($_[0] < 0) { | 
| 1248 | 5 |  |  |  |  | 42 | push @nondirs, $entry; | 
| 1249 |  |  |  |  |  |  | } else { | 
| 1250 |  |  |  |  |  |  | # need to check for real directory | 
| 1251 | 5 |  |  |  |  | 12 | aioreq_pri $pri; | 
| 1252 | 5 |  |  |  |  | 8 | $wd->[1] = $entry; | 
| 1253 |  |  |  |  |  |  | add $statgrp aio_lstat $wd, sub { | 
| 1254 | 5 | 50 |  |  |  | 15 | if (-d _) { | 
| 1255 | 5 |  |  |  |  | 10 | push @dirs, $entry; | 
| 1256 |  |  |  |  |  |  |  | 
| 1257 | 5 | 100 |  |  |  | 13 | unless (--$ndirs) { | 
| 1258 | 1 |  |  |  |  | 7 | push @nondirs, @$entries; | 
| 1259 | 1 |  |  |  |  | 6 | feed $statgrp; | 
| 1260 |  |  |  |  |  |  | } | 
| 1261 |  |  |  |  |  |  | } else { | 
| 1262 | 0 |  |  |  |  | 0 | push @nondirs, $entry; | 
| 1263 |  |  |  |  |  |  | } | 
| 1264 |  |  |  |  |  |  | } | 
| 1265 | 5 |  |  |  |  | 205 | } | 
| 1266 | 10 |  |  |  |  | 603 | }; | 
| 1267 | 1 |  |  |  |  | 8 | }; | 
| 1268 | 1 |  |  |  |  | 40 | }; | 
| 1269 | 1 |  |  |  |  | 43 | }; | 
| 1270 | 1 |  |  |  |  | 46 | }; | 
| 1271 | 1 |  |  |  |  | 52 | }; | 
| 1272 |  |  |  |  |  |  |  | 
| 1273 | 1 |  |  |  |  | 4 | $grp | 
| 1274 |  |  |  |  |  |  | } | 
| 1275 |  |  |  |  |  |  |  | 
| 1276 |  |  |  |  |  |  | =item aio_rmtree $pathname, $callback->($status) | 
| 1277 |  |  |  |  |  |  |  | 
| 1278 |  |  |  |  |  |  | Delete a directory tree starting (and including) C<$path>, return the | 
| 1279 |  |  |  |  |  |  | status of the final C only. This is a composite request that | 
| 1280 |  |  |  |  |  |  | uses C to recurse into and rmdir directories, and unlink | 
| 1281 |  |  |  |  |  |  | everything else. | 
| 1282 |  |  |  |  |  |  |  | 
| 1283 |  |  |  |  |  |  | =cut | 
| 1284 |  |  |  |  |  |  |  | 
| 1285 |  |  |  |  |  |  | sub aio_rmtree; | 
| 1286 |  |  |  |  |  |  | sub aio_rmtree($;$) { | 
| 1287 | 0 |  |  | 0 | 1 |  | my ($path, $cb) = @_; | 
| 1288 |  |  |  |  |  |  |  | 
| 1289 | 0 |  |  |  |  |  | my $pri = aioreq_pri; | 
| 1290 | 0 |  |  |  |  |  | my $grp = aio_group $cb; | 
| 1291 |  |  |  |  |  |  |  | 
| 1292 | 0 |  |  |  |  |  | aioreq_pri $pri; | 
| 1293 |  |  |  |  |  |  | add $grp aio_scandir $path, 0, sub { | 
| 1294 | 0 |  |  | 0 |  |  | my ($dirs, $nondirs) = @_; | 
| 1295 |  |  |  |  |  |  |  | 
| 1296 |  |  |  |  |  |  | my $dirgrp = aio_group sub { | 
| 1297 |  |  |  |  |  |  | add $grp aio_rmdir $path, sub { | 
| 1298 | 0 |  |  |  |  |  | $grp->result ($_[0]); | 
| 1299 | 0 |  |  |  |  |  | }; | 
| 1300 | 0 |  |  |  |  |  | }; | 
| 1301 |  |  |  |  |  |  |  | 
| 1302 | 0 |  |  |  |  |  | (aioreq_pri $pri), add $dirgrp aio_rmtree "$path/$_" for @$dirs; | 
| 1303 | 0 |  |  |  |  |  | (aioreq_pri $pri), add $dirgrp aio_unlink "$path/$_" for @$nondirs; | 
| 1304 |  |  |  |  |  |  |  | 
| 1305 | 0 |  |  |  |  |  | add $grp $dirgrp; | 
| 1306 | 0 |  |  |  |  |  | }; | 
| 1307 |  |  |  |  |  |  |  | 
| 1308 | 0 |  |  |  |  |  | $grp | 
| 1309 |  |  |  |  |  |  | } | 
| 1310 |  |  |  |  |  |  |  | 
| 1311 |  |  |  |  |  |  | =item aio_fcntl $fh, $cmd, $arg, $callback->($status) | 
| 1312 |  |  |  |  |  |  |  | 
| 1313 |  |  |  |  |  |  | =item aio_ioctl $fh, $request, $buf, $callback->($status) | 
| 1314 |  |  |  |  |  |  |  | 
| 1315 |  |  |  |  |  |  | These work just like the C and C built-in functions, except | 
| 1316 |  |  |  |  |  |  | they execute asynchronously and pass the return value to the callback. | 
| 1317 |  |  |  |  |  |  |  | 
| 1318 |  |  |  |  |  |  | Both calls can be used for a lot of things, some of which make more sense | 
| 1319 |  |  |  |  |  |  | to run asynchronously in their own thread, while some others make less | 
| 1320 |  |  |  |  |  |  | sense. For example, calls that block waiting for external events, such | 
| 1321 |  |  |  |  |  |  | as locking, will also lock down an I/O thread while it is waiting, which | 
| 1322 |  |  |  |  |  |  | can deadlock the whole I/O system. At the same time, there might be no | 
| 1323 |  |  |  |  |  |  | alternative to using a thread to wait. | 
| 1324 |  |  |  |  |  |  |  | 
| 1325 |  |  |  |  |  |  | So in general, you should only use these calls for things that do | 
| 1326 |  |  |  |  |  |  | (filesystem) I/O, not for things that wait for other events (network, | 
| 1327 |  |  |  |  |  |  | other processes), although if you are careful and know what you are doing, | 
| 1328 |  |  |  |  |  |  | you still can. | 
| 1329 |  |  |  |  |  |  |  | 
| 1330 |  |  |  |  |  |  | The following constants are available and can be used for normal C | 
| 1331 |  |  |  |  |  |  | and C as well (missing ones are, as usual C<0>): | 
| 1332 |  |  |  |  |  |  |  | 
| 1333 |  |  |  |  |  |  | C, | 
| 1334 |  |  |  |  |  |  |  | 
| 1335 |  |  |  |  |  |  | C, C, C, | 
| 1336 |  |  |  |  |  |  |  | 
| 1337 |  |  |  |  |  |  | C, C, C, C, C, C. | 
| 1338 |  |  |  |  |  |  |  | 
| 1339 |  |  |  |  |  |  | C, C, C, C, C and | 
| 1340 |  |  |  |  |  |  | C. | 
| 1341 |  |  |  |  |  |  |  | 
| 1342 |  |  |  |  |  |  | C, C, C, C, | 
| 1343 |  |  |  |  |  |  | C. | 
| 1344 |  |  |  |  |  |  |  | 
| 1345 |  |  |  |  |  |  | C, C, C, | 
| 1346 |  |  |  |  |  |  | C, C, C. | 
| 1347 |  |  |  |  |  |  |  | 
| 1348 |  |  |  |  |  |  | C, C, C, C, C, | 
| 1349 |  |  |  |  |  |  | C, C, C, C, | 
| 1350 |  |  |  |  |  |  | C, C, C, C, | 
| 1351 |  |  |  |  |  |  | C, C, C, C, C, | 
| 1352 |  |  |  |  |  |  | C. | 
| 1353 |  |  |  |  |  |  |  | 
| 1354 |  |  |  |  |  |  | C, C, C, C, | 
| 1355 |  |  |  |  |  |  | C, C, C, C, | 
| 1356 |  |  |  |  |  |  | C, C, C, C, | 
| 1357 |  |  |  |  |  |  | C, C, C, C, | 
| 1358 |  |  |  |  |  |  |  | 
| 1359 |  |  |  |  |  |  | C, C, C, C, C, C, | 
| 1360 |  |  |  |  |  |  | C, C, C, C, C, C, | 
| 1361 |  |  |  |  |  |  | C, C, C, | 
| 1362 |  |  |  |  |  |  |  | 
| 1363 |  |  |  |  |  |  |  | 
| 1364 |  |  |  |  |  |  | =item aio_sync $callback->($status) | 
| 1365 |  |  |  |  |  |  |  | 
| 1366 |  |  |  |  |  |  | Asynchronously call sync and call the callback when finished. | 
| 1367 |  |  |  |  |  |  |  | 
| 1368 |  |  |  |  |  |  | =item aio_fsync $fh, $callback->($status) | 
| 1369 |  |  |  |  |  |  |  | 
| 1370 |  |  |  |  |  |  | Asynchronously call fsync on the given filehandle and call the callback | 
| 1371 |  |  |  |  |  |  | with the fsync result code. | 
| 1372 |  |  |  |  |  |  |  | 
| 1373 |  |  |  |  |  |  | =item aio_fdatasync $fh, $callback->($status) | 
| 1374 |  |  |  |  |  |  |  | 
| 1375 |  |  |  |  |  |  | Asynchronously call fdatasync on the given filehandle and call the | 
| 1376 |  |  |  |  |  |  | callback with the fdatasync result code. | 
| 1377 |  |  |  |  |  |  |  | 
| 1378 |  |  |  |  |  |  | If this call isn't available because your OS lacks it or it couldn't be | 
| 1379 |  |  |  |  |  |  | detected, it will be emulated by calling C instead. | 
| 1380 |  |  |  |  |  |  |  | 
| 1381 |  |  |  |  |  |  | =item aio_syncfs $fh, $callback->($status) | 
| 1382 |  |  |  |  |  |  |  | 
| 1383 |  |  |  |  |  |  | Asynchronously call the syncfs syscall to sync the filesystem associated | 
| 1384 |  |  |  |  |  |  | to the given filehandle and call the callback with the syncfs result | 
| 1385 |  |  |  |  |  |  | code. If syncfs is not available, calls sync(), but returns C<-1> and sets | 
| 1386 |  |  |  |  |  |  | errno to C nevertheless. | 
| 1387 |  |  |  |  |  |  |  | 
| 1388 |  |  |  |  |  |  | =item aio_sync_file_range $fh, $offset, $nbytes, $flags, $callback->($status) | 
| 1389 |  |  |  |  |  |  |  | 
| 1390 |  |  |  |  |  |  | Sync the data portion of the file specified by C<$offset> and C<$length> | 
| 1391 |  |  |  |  |  |  | to disk (but NOT the metadata), by calling the Linux-specific | 
| 1392 |  |  |  |  |  |  | sync_file_range call. If sync_file_range is not available or it returns | 
| 1393 |  |  |  |  |  |  | ENOSYS, then fdatasync or fsync is being substituted. | 
| 1394 |  |  |  |  |  |  |  | 
| 1395 |  |  |  |  |  |  | C<$flags> can be a combination of C, | 
| 1396 |  |  |  |  |  |  | C and | 
| 1397 |  |  |  |  |  |  | C: refer to the sync_file_range | 
| 1398 |  |  |  |  |  |  | manpage for details. | 
| 1399 |  |  |  |  |  |  |  | 
| 1400 |  |  |  |  |  |  | =item aio_pathsync $pathname, $callback->($status) | 
| 1401 |  |  |  |  |  |  |  | 
| 1402 |  |  |  |  |  |  | This request tries to open, fsync and close the given path. This is a | 
| 1403 |  |  |  |  |  |  | composite request intended to sync directories after directory operations | 
| 1404 |  |  |  |  |  |  | (E.g. rename). This might not work on all operating systems or have any | 
| 1405 |  |  |  |  |  |  | specific effect, but usually it makes sure that directory changes get | 
| 1406 |  |  |  |  |  |  | written to disc. It works for anything that can be opened for read-only, | 
| 1407 |  |  |  |  |  |  | not just directories. | 
| 1408 |  |  |  |  |  |  |  | 
| 1409 |  |  |  |  |  |  | Future versions of this function might fall back to other methods when | 
| 1410 |  |  |  |  |  |  | C on the directory fails (such as calling C). | 
| 1411 |  |  |  |  |  |  |  | 
| 1412 |  |  |  |  |  |  | Passes C<0> when everything went ok, and C<-1> on error. | 
| 1413 |  |  |  |  |  |  |  | 
| 1414 |  |  |  |  |  |  | =cut | 
| 1415 |  |  |  |  |  |  |  | 
| 1416 |  |  |  |  |  |  | sub aio_pathsync($;$) { | 
| 1417 | 0 |  |  | 0 | 1 |  | my ($path, $cb) = @_; | 
| 1418 |  |  |  |  |  |  |  | 
| 1419 | 0 |  |  |  |  |  | my $pri = aioreq_pri; | 
| 1420 | 0 |  |  |  |  |  | my $grp = aio_group $cb; | 
| 1421 |  |  |  |  |  |  |  | 
| 1422 | 0 |  |  |  |  |  | aioreq_pri $pri; | 
| 1423 |  |  |  |  |  |  | add $grp aio_open $path, O_RDONLY, 0, sub { | 
| 1424 | 0 |  |  | 0 |  |  | my ($fh) = @_; | 
| 1425 | 0 | 0 |  |  |  |  | if ($fh) { | 
| 1426 | 0 |  |  |  |  |  | aioreq_pri $pri; | 
| 1427 |  |  |  |  |  |  | add $grp aio_fsync $fh, sub { | 
| 1428 | 0 |  |  |  |  |  | $grp->result ($_[0]); | 
| 1429 |  |  |  |  |  |  |  | 
| 1430 | 0 |  |  |  |  |  | aioreq_pri $pri; | 
| 1431 | 0 |  |  |  |  |  | add $grp aio_close $fh; | 
| 1432 | 0 |  |  |  |  |  | }; | 
| 1433 |  |  |  |  |  |  | } else { | 
| 1434 | 0 |  |  |  |  |  | $grp->result (-1); | 
| 1435 |  |  |  |  |  |  | } | 
| 1436 | 0 |  |  |  |  |  | }; | 
| 1437 |  |  |  |  |  |  |  | 
| 1438 | 0 |  |  |  |  |  | $grp | 
| 1439 |  |  |  |  |  |  | } | 
| 1440 |  |  |  |  |  |  |  | 
| 1441 |  |  |  |  |  |  | =item aio_msync $scalar, $offset = 0, $length = undef, flags = MS_SYNC, $callback->($status) | 
| 1442 |  |  |  |  |  |  |  | 
| 1443 |  |  |  |  |  |  | This is a rather advanced IO::AIO call, which only works on mmap(2)ed | 
| 1444 |  |  |  |  |  |  | scalars (see the C function, although it also works on data | 
| 1445 |  |  |  |  |  |  | scalars managed by the L or L modules, note that the | 
| 1446 |  |  |  |  |  |  | scalar must only be modified in-place while an aio operation is pending on | 
| 1447 |  |  |  |  |  |  | it). | 
| 1448 |  |  |  |  |  |  |  | 
| 1449 |  |  |  |  |  |  | It calls the C function of your OS, if available, with the memory | 
| 1450 |  |  |  |  |  |  | area starting at C<$offset> in the string and ending C<$length> bytes | 
| 1451 |  |  |  |  |  |  | later. If C<$length> is negative, counts from the end, and if C<$length> | 
| 1452 |  |  |  |  |  |  | is C, then it goes till the end of the string. The flags can be | 
| 1453 |  |  |  |  |  |  | either C or C, plus an optional | 
| 1454 |  |  |  |  |  |  | C. | 
| 1455 |  |  |  |  |  |  |  | 
| 1456 |  |  |  |  |  |  | =item aio_mtouch $scalar, $offset = 0, $length = undef, flags = 0, $callback->($status) | 
| 1457 |  |  |  |  |  |  |  | 
| 1458 |  |  |  |  |  |  | This is a rather advanced IO::AIO call, which works best on mmap(2)ed | 
| 1459 |  |  |  |  |  |  | scalars. | 
| 1460 |  |  |  |  |  |  |  | 
| 1461 |  |  |  |  |  |  | It touches (reads or writes) all memory pages in the specified | 
| 1462 |  |  |  |  |  |  | range inside the scalar. All caveats and parameters are the same | 
| 1463 |  |  |  |  |  |  | as for C, above, except for flags, which must be either | 
| 1464 |  |  |  |  |  |  | C<0> (which reads all pages and ensures they are instantiated) or | 
| 1465 |  |  |  |  |  |  | C, which modifies the memory pages (by reading and | 
| 1466 |  |  |  |  |  |  | writing an octet from it, which dirties the page). | 
| 1467 |  |  |  |  |  |  |  | 
| 1468 |  |  |  |  |  |  | =item aio_mlock $scalar, $offset = 0, $length = undef, $callback->($status) | 
| 1469 |  |  |  |  |  |  |  | 
| 1470 |  |  |  |  |  |  | This is a rather advanced IO::AIO call, which works best on mmap(2)ed | 
| 1471 |  |  |  |  |  |  | scalars. | 
| 1472 |  |  |  |  |  |  |  | 
| 1473 |  |  |  |  |  |  | It reads in all the pages of the underlying storage into memory (if any) | 
| 1474 |  |  |  |  |  |  | and locks them, so they are not getting swapped/paged out or removed. | 
| 1475 |  |  |  |  |  |  |  | 
| 1476 |  |  |  |  |  |  | If C<$length> is undefined, then the scalar will be locked till the end. | 
| 1477 |  |  |  |  |  |  |  | 
| 1478 |  |  |  |  |  |  | On systems that do not implement C, this function returns C<-1> | 
| 1479 |  |  |  |  |  |  | and sets errno to C. | 
| 1480 |  |  |  |  |  |  |  | 
| 1481 |  |  |  |  |  |  | Note that the corresponding C is synchronous and is | 
| 1482 |  |  |  |  |  |  | documented under L. | 
| 1483 |  |  |  |  |  |  |  | 
| 1484 |  |  |  |  |  |  | Example: open a file, mmap and mlock it - both will be undone when | 
| 1485 |  |  |  |  |  |  | C<$data> gets destroyed. | 
| 1486 |  |  |  |  |  |  |  | 
| 1487 |  |  |  |  |  |  | open my $fh, "<", $path or die "$path: $!"; | 
| 1488 |  |  |  |  |  |  | my $data; | 
| 1489 |  |  |  |  |  |  | IO::AIO::mmap $data, -s $fh, IO::AIO::PROT_READ, IO::AIO::MAP_SHARED, $fh; | 
| 1490 |  |  |  |  |  |  | aio_mlock $data; # mlock in background | 
| 1491 |  |  |  |  |  |  |  | 
| 1492 |  |  |  |  |  |  | =item aio_mlockall $flags, $callback->($status) | 
| 1493 |  |  |  |  |  |  |  | 
| 1494 |  |  |  |  |  |  | Calls the C function with the given C<$flags> (a | 
| 1495 |  |  |  |  |  |  | combination of C, C and | 
| 1496 |  |  |  |  |  |  | C). | 
| 1497 |  |  |  |  |  |  |  | 
| 1498 |  |  |  |  |  |  | On systems that do not implement C, this function returns C<-1> | 
| 1499 |  |  |  |  |  |  | and sets errno to C. Similarly, flag combinations not supported | 
| 1500 |  |  |  |  |  |  | by the system result in a return value of C<-1> with errno being set to | 
| 1501 |  |  |  |  |  |  | C. | 
| 1502 |  |  |  |  |  |  |  | 
| 1503 |  |  |  |  |  |  | Note that the corresponding C is synchronous and is | 
| 1504 |  |  |  |  |  |  | documented under L. | 
| 1505 |  |  |  |  |  |  |  | 
| 1506 |  |  |  |  |  |  | Example: asynchronously lock all current and future pages into memory. | 
| 1507 |  |  |  |  |  |  |  | 
| 1508 |  |  |  |  |  |  | aio_mlockall IO::AIO::MCL_FUTURE; | 
| 1509 |  |  |  |  |  |  |  | 
| 1510 |  |  |  |  |  |  | =item aio_fiemap $fh, $start, $length, $flags, $count, $cb->(\@extents) | 
| 1511 |  |  |  |  |  |  |  | 
| 1512 |  |  |  |  |  |  | Queries the extents of the given file (by calling the Linux C | 
| 1513 |  |  |  |  |  |  | ioctl, see L for details). If | 
| 1514 |  |  |  |  |  |  | the ioctl is not available on your OS, then this request will fail with | 
| 1515 |  |  |  |  |  |  | C. | 
| 1516 |  |  |  |  |  |  |  | 
| 1517 |  |  |  |  |  |  | C<$start> is the starting offset to query extents for, C<$length> is the | 
| 1518 |  |  |  |  |  |  | size of the range to query - if it is C, then the whole file will | 
| 1519 |  |  |  |  |  |  | be queried. | 
| 1520 |  |  |  |  |  |  |  | 
| 1521 |  |  |  |  |  |  | C<$flags> is a combination of flags (C or | 
| 1522 |  |  |  |  |  |  | C - C is also | 
| 1523 |  |  |  |  |  |  | exported), and is normally C<0> or C to query | 
| 1524 |  |  |  |  |  |  | the data portion. | 
| 1525 |  |  |  |  |  |  |  | 
| 1526 |  |  |  |  |  |  | C<$count> is the maximum number of extent records to return. If it is | 
| 1527 |  |  |  |  |  |  | C, then IO::AIO queries all extents of the range. As a very special | 
| 1528 |  |  |  |  |  |  | case, if it is C<0>, then the callback receives the number of extents | 
| 1529 |  |  |  |  |  |  | instead of the extents themselves (which is unreliable, see below). | 
| 1530 |  |  |  |  |  |  |  | 
| 1531 |  |  |  |  |  |  | If an error occurs, the callback receives no arguments. The special | 
| 1532 |  |  |  |  |  |  | C value C is available to test for flag errors. | 
| 1533 |  |  |  |  |  |  |  | 
| 1534 |  |  |  |  |  |  | Otherwise, the callback receives an array reference with extent | 
| 1535 |  |  |  |  |  |  | structures. Each extent structure is an array reference itself, with the | 
| 1536 |  |  |  |  |  |  | following members: | 
| 1537 |  |  |  |  |  |  |  | 
| 1538 |  |  |  |  |  |  | [$logical, $physical, $length, $flags] | 
| 1539 |  |  |  |  |  |  |  | 
| 1540 |  |  |  |  |  |  | Flags is any combination of the following flag values (typically either C<0> | 
| 1541 |  |  |  |  |  |  | or C (1)): | 
| 1542 |  |  |  |  |  |  |  | 
| 1543 |  |  |  |  |  |  | C, C, | 
| 1544 |  |  |  |  |  |  | C, C, | 
| 1545 |  |  |  |  |  |  | C, C, | 
| 1546 |  |  |  |  |  |  | C, C, | 
| 1547 |  |  |  |  |  |  | C, C or | 
| 1548 |  |  |  |  |  |  | C. | 
| 1549 |  |  |  |  |  |  |  | 
| 1550 |  |  |  |  |  |  | At the time of this writing (Linux 3.2), this request is unreliable unless | 
| 1551 |  |  |  |  |  |  | C<$count> is C, as the kernel has all sorts of bugs preventing | 
| 1552 |  |  |  |  |  |  | it to return all extents of a range for files with a large number of | 
| 1553 |  |  |  |  |  |  | extents. The code (only) works around all these issues if C<$count> is | 
| 1554 |  |  |  |  |  |  | C. | 
| 1555 |  |  |  |  |  |  |  | 
| 1556 |  |  |  |  |  |  | =item aio_group $callback->(...) | 
| 1557 |  |  |  |  |  |  |  | 
| 1558 |  |  |  |  |  |  | This is a very special aio request: Instead of doing something, it is a | 
| 1559 |  |  |  |  |  |  | container for other aio requests, which is useful if you want to bundle | 
| 1560 |  |  |  |  |  |  | many requests into a single, composite, request with a definite callback | 
| 1561 |  |  |  |  |  |  | and the ability to cancel the whole request with its subrequests. | 
| 1562 |  |  |  |  |  |  |  | 
| 1563 |  |  |  |  |  |  | Returns an object of class L. See its documentation below | 
| 1564 |  |  |  |  |  |  | for more info. | 
| 1565 |  |  |  |  |  |  |  | 
| 1566 |  |  |  |  |  |  | Example: | 
| 1567 |  |  |  |  |  |  |  | 
| 1568 |  |  |  |  |  |  | my $grp = aio_group sub { | 
| 1569 |  |  |  |  |  |  | print "all stats done\n"; | 
| 1570 |  |  |  |  |  |  | }; | 
| 1571 |  |  |  |  |  |  |  | 
| 1572 |  |  |  |  |  |  | add $grp | 
| 1573 |  |  |  |  |  |  | (aio_stat ...), | 
| 1574 |  |  |  |  |  |  | (aio_stat ...), | 
| 1575 |  |  |  |  |  |  | ...; | 
| 1576 |  |  |  |  |  |  |  | 
| 1577 |  |  |  |  |  |  | =item aio_nop $callback->() | 
| 1578 |  |  |  |  |  |  |  | 
| 1579 |  |  |  |  |  |  | This is a special request - it does nothing in itself and is only used for | 
| 1580 |  |  |  |  |  |  | side effects, such as when you want to add a dummy request to a group so | 
| 1581 |  |  |  |  |  |  | that finishing the requests in the group depends on executing the given | 
| 1582 |  |  |  |  |  |  | code. | 
| 1583 |  |  |  |  |  |  |  | 
| 1584 |  |  |  |  |  |  | While this request does nothing, it still goes through the execution | 
| 1585 |  |  |  |  |  |  | phase and still requires a worker thread. Thus, the callback will not | 
| 1586 |  |  |  |  |  |  | be executed immediately but only after other requests in the queue have | 
| 1587 |  |  |  |  |  |  | entered their execution phase. This can be used to measure request | 
| 1588 |  |  |  |  |  |  | latency. | 
| 1589 |  |  |  |  |  |  |  | 
| 1590 |  |  |  |  |  |  | =item IO::AIO::aio_busy $fractional_seconds, $callback->()  *NOT EXPORTED* | 
| 1591 |  |  |  |  |  |  |  | 
| 1592 |  |  |  |  |  |  | Mainly used for debugging and benchmarking, this aio request puts one of | 
| 1593 |  |  |  |  |  |  | the request workers to sleep for the given time. | 
| 1594 |  |  |  |  |  |  |  | 
| 1595 |  |  |  |  |  |  | While it is theoretically handy to have simple I/O scheduling requests | 
| 1596 |  |  |  |  |  |  | like sleep and file handle readable/writable, the overhead this creates is | 
| 1597 |  |  |  |  |  |  | immense (it blocks a thread for a long time) so do not use this function | 
| 1598 |  |  |  |  |  |  | except to put your application under artificial I/O pressure. | 
| 1599 |  |  |  |  |  |  |  | 
| 1600 |  |  |  |  |  |  | =back | 
| 1601 |  |  |  |  |  |  |  | 
| 1602 |  |  |  |  |  |  |  | 
| 1603 |  |  |  |  |  |  | =head2 IO::AIO::WD - multiple working directories | 
| 1604 |  |  |  |  |  |  |  | 
| 1605 |  |  |  |  |  |  | Your process only has one current working directory, which is used by all | 
| 1606 |  |  |  |  |  |  | threads. This makes it hard to use relative paths (some other component | 
| 1607 |  |  |  |  |  |  | could call C at any time, and it is hard to control when the path | 
| 1608 |  |  |  |  |  |  | will be used by IO::AIO). | 
| 1609 |  |  |  |  |  |  |  | 
| 1610 |  |  |  |  |  |  | One solution for this is to always use absolute paths. This usually works, | 
| 1611 |  |  |  |  |  |  | but can be quite slow (the kernel has to walk the whole path on every | 
| 1612 |  |  |  |  |  |  | access), and can also be a hassle to implement. | 
| 1613 |  |  |  |  |  |  |  | 
| 1614 |  |  |  |  |  |  | Newer POSIX systems have a number of functions (openat, fdopendir, | 
| 1615 |  |  |  |  |  |  | futimensat and so on) that make it possible to specify working directories | 
| 1616 |  |  |  |  |  |  | per operation. | 
| 1617 |  |  |  |  |  |  |  | 
| 1618 |  |  |  |  |  |  | For portability, and because the clowns who "designed", or shall I write, | 
| 1619 |  |  |  |  |  |  | perpetrated this new interface were obviously half-drunk, this abstraction | 
| 1620 |  |  |  |  |  |  | cannot be perfect, though. | 
| 1621 |  |  |  |  |  |  |  | 
| 1622 |  |  |  |  |  |  | IO::AIO allows you to convert directory paths into a so-called IO::AIO::WD | 
| 1623 |  |  |  |  |  |  | object. This object stores the canonicalised, absolute version of the | 
| 1624 |  |  |  |  |  |  | path, and on systems that allow it, also a directory file descriptor. | 
| 1625 |  |  |  |  |  |  |  | 
| 1626 |  |  |  |  |  |  | Everywhere where a pathname is accepted by IO::AIO (e.g. in C | 
| 1627 |  |  |  |  |  |  | or C), one can specify an array reference with an IO::AIO::WD | 
| 1628 |  |  |  |  |  |  | object and a pathname instead (or the IO::AIO::WD object alone, which | 
| 1629 |  |  |  |  |  |  | gets interpreted as C<[$wd, "."]>). If the pathname is absolute, the | 
| 1630 |  |  |  |  |  |  | IO::AIO::WD object is ignored, otherwise the pathname is resolved relative | 
| 1631 |  |  |  |  |  |  | to that IO::AIO::WD object. | 
| 1632 |  |  |  |  |  |  |  | 
| 1633 |  |  |  |  |  |  | For example, to get a wd object for F and then stat F | 
| 1634 |  |  |  |  |  |  | inside, you would write: | 
| 1635 |  |  |  |  |  |  |  | 
| 1636 |  |  |  |  |  |  | aio_wd "/etc", sub { | 
| 1637 |  |  |  |  |  |  | my $etcdir = shift; | 
| 1638 |  |  |  |  |  |  |  | 
| 1639 |  |  |  |  |  |  | # although $etcdir can be undef on error, there is generally no reason | 
| 1640 |  |  |  |  |  |  | # to check for errors here, as aio_stat will fail with ENOENT | 
| 1641 |  |  |  |  |  |  | # when $etcdir is undef. | 
| 1642 |  |  |  |  |  |  |  | 
| 1643 |  |  |  |  |  |  | aio_stat [$etcdir, "passwd"], sub { | 
| 1644 |  |  |  |  |  |  | # yay | 
| 1645 |  |  |  |  |  |  | }; | 
| 1646 |  |  |  |  |  |  | }; | 
| 1647 |  |  |  |  |  |  |  | 
| 1648 |  |  |  |  |  |  | The fact that C is a request and not a normal function shows that | 
| 1649 |  |  |  |  |  |  | creating an IO::AIO::WD object is itself a potentially blocking operation, | 
| 1650 |  |  |  |  |  |  | which is why it is done asynchronously. | 
| 1651 |  |  |  |  |  |  |  | 
| 1652 |  |  |  |  |  |  | To stat the directory obtained with C above, one could write | 
| 1653 |  |  |  |  |  |  | either of the following three request calls: | 
| 1654 |  |  |  |  |  |  |  | 
| 1655 |  |  |  |  |  |  | aio_lstat "/etc"    , sub { ...  # pathname as normal string | 
| 1656 |  |  |  |  |  |  | aio_lstat [$wd, "."], sub { ...  # "." relative to $wd (i.e. $wd itself) | 
| 1657 |  |  |  |  |  |  | aio_lstat $wd       , sub { ...  # shorthand for the previous | 
| 1658 |  |  |  |  |  |  |  | 
| 1659 |  |  |  |  |  |  | As with normal pathnames, IO::AIO keeps a copy of the working directory | 
| 1660 |  |  |  |  |  |  | object and the pathname string, so you could write the following without | 
| 1661 |  |  |  |  |  |  | causing any issues due to C<$path> getting reused: | 
| 1662 |  |  |  |  |  |  |  | 
| 1663 |  |  |  |  |  |  | my $path = [$wd, undef]; | 
| 1664 |  |  |  |  |  |  |  | 
| 1665 |  |  |  |  |  |  | for my $name (qw(abc def ghi)) { | 
| 1666 |  |  |  |  |  |  | $path->[1] = $name; | 
| 1667 |  |  |  |  |  |  | aio_stat $path, sub { | 
| 1668 |  |  |  |  |  |  | # ... | 
| 1669 |  |  |  |  |  |  | }; | 
| 1670 |  |  |  |  |  |  | } | 
| 1671 |  |  |  |  |  |  |  | 
| 1672 |  |  |  |  |  |  | There are some caveats: when directories get renamed (or deleted), the | 
| 1673 |  |  |  |  |  |  | pathname string doesn't change, so will point to the new directory (or | 
| 1674 |  |  |  |  |  |  | nowhere at all), while the directory fd, if available on the system, | 
| 1675 |  |  |  |  |  |  | will still point to the original directory. Most functions accepting a | 
| 1676 |  |  |  |  |  |  | pathname will use the directory fd on newer systems, and the string on | 
| 1677 |  |  |  |  |  |  | older systems. Some functions (such as C) will always rely on | 
| 1678 |  |  |  |  |  |  | the string form of the pathname. | 
| 1679 |  |  |  |  |  |  |  | 
| 1680 |  |  |  |  |  |  | So this functionality is mainly useful to get some protection against | 
| 1681 |  |  |  |  |  |  | C, to easily get an absolute path out of a relative path for future | 
| 1682 |  |  |  |  |  |  | reference, and to speed up doing many operations in the same directory | 
| 1683 |  |  |  |  |  |  | (e.g. when stat'ing all files in a directory). | 
| 1684 |  |  |  |  |  |  |  | 
| 1685 |  |  |  |  |  |  | The following functions implement this working directory abstraction: | 
| 1686 |  |  |  |  |  |  |  | 
| 1687 |  |  |  |  |  |  | =over 4 | 
| 1688 |  |  |  |  |  |  |  | 
| 1689 |  |  |  |  |  |  | =item aio_wd $pathname, $callback->($wd) | 
| 1690 |  |  |  |  |  |  |  | 
| 1691 |  |  |  |  |  |  | Asynchonously canonicalise the given pathname and convert it to an | 
| 1692 |  |  |  |  |  |  | IO::AIO::WD object representing it. If possible and supported on the | 
| 1693 |  |  |  |  |  |  | system, also open a directory fd to speed up pathname resolution relative | 
| 1694 |  |  |  |  |  |  | to this working directory. | 
| 1695 |  |  |  |  |  |  |  | 
| 1696 |  |  |  |  |  |  | If something goes wrong, then C is passwd to the callback instead | 
| 1697 |  |  |  |  |  |  | of a working directory object and C<$!> is set appropriately. Since | 
| 1698 |  |  |  |  |  |  | passing C as working directory component of a pathname fails the | 
| 1699 |  |  |  |  |  |  | request with C, there is often no need for error checking in the | 
| 1700 |  |  |  |  |  |  | C callback, as future requests using the value will fail in the | 
| 1701 |  |  |  |  |  |  | expected way. | 
| 1702 |  |  |  |  |  |  |  | 
| 1703 |  |  |  |  |  |  | =item IO::AIO::CWD | 
| 1704 |  |  |  |  |  |  |  | 
| 1705 |  |  |  |  |  |  | This is a compile time constant (object) that represents the process | 
| 1706 |  |  |  |  |  |  | current working directory. | 
| 1707 |  |  |  |  |  |  |  | 
| 1708 |  |  |  |  |  |  | Specifying this object as working directory object for a pathname is as if | 
| 1709 |  |  |  |  |  |  | the pathname would be specified directly, without a directory object. For | 
| 1710 |  |  |  |  |  |  | example, these calls are functionally identical: | 
| 1711 |  |  |  |  |  |  |  | 
| 1712 |  |  |  |  |  |  | aio_stat "somefile", sub { ... }; | 
| 1713 |  |  |  |  |  |  | aio_stat [IO::AIO::CWD, "somefile"], sub { ... }; | 
| 1714 |  |  |  |  |  |  |  | 
| 1715 |  |  |  |  |  |  | =back | 
| 1716 |  |  |  |  |  |  |  | 
| 1717 |  |  |  |  |  |  | To recover the path associated with an IO::AIO::WD object, you can use | 
| 1718 |  |  |  |  |  |  | C: | 
| 1719 |  |  |  |  |  |  |  | 
| 1720 |  |  |  |  |  |  | aio_realpath $wd, sub { | 
| 1721 |  |  |  |  |  |  | warn "path is $_[0]\n"; | 
| 1722 |  |  |  |  |  |  | }; | 
| 1723 |  |  |  |  |  |  |  | 
| 1724 |  |  |  |  |  |  | Currently, C always, and C and C | 
| 1725 |  |  |  |  |  |  | sometimes, fall back to using an absolue path. | 
| 1726 |  |  |  |  |  |  |  | 
| 1727 |  |  |  |  |  |  | =head2 IO::AIO::REQ CLASS | 
| 1728 |  |  |  |  |  |  |  | 
| 1729 |  |  |  |  |  |  | All non-aggregate C functions return an object of this class when | 
| 1730 |  |  |  |  |  |  | called in non-void context. | 
| 1731 |  |  |  |  |  |  |  | 
| 1732 |  |  |  |  |  |  | =over 4 | 
| 1733 |  |  |  |  |  |  |  | 
| 1734 |  |  |  |  |  |  | =item cancel $req | 
| 1735 |  |  |  |  |  |  |  | 
| 1736 |  |  |  |  |  |  | Cancels the request, if possible. Has the effect of skipping execution | 
| 1737 |  |  |  |  |  |  | when entering the B state and skipping calling the callback when | 
| 1738 |  |  |  |  |  |  | entering the the B state, but will leave the request otherwise | 
| 1739 |  |  |  |  |  |  | untouched (with the exception of readdir). That means that requests that | 
| 1740 |  |  |  |  |  |  | currently execute will not be stopped and resources held by the request | 
| 1741 |  |  |  |  |  |  | will not be freed prematurely. | 
| 1742 |  |  |  |  |  |  |  | 
| 1743 |  |  |  |  |  |  | =item cb $req $callback->(...) | 
| 1744 |  |  |  |  |  |  |  | 
| 1745 |  |  |  |  |  |  | Replace (or simply set) the callback registered to the request. | 
| 1746 |  |  |  |  |  |  |  | 
| 1747 |  |  |  |  |  |  | =back | 
| 1748 |  |  |  |  |  |  |  | 
| 1749 |  |  |  |  |  |  | =head2 IO::AIO::GRP CLASS | 
| 1750 |  |  |  |  |  |  |  | 
| 1751 |  |  |  |  |  |  | This class is a subclass of L, so all its methods apply to | 
| 1752 |  |  |  |  |  |  | objects of this class, too. | 
| 1753 |  |  |  |  |  |  |  | 
| 1754 |  |  |  |  |  |  | A IO::AIO::GRP object is a special request that can contain multiple other | 
| 1755 |  |  |  |  |  |  | aio requests. | 
| 1756 |  |  |  |  |  |  |  | 
| 1757 |  |  |  |  |  |  | You create one by calling the C constructing function with a | 
| 1758 |  |  |  |  |  |  | callback that will be called when all contained requests have entered the | 
| 1759 |  |  |  |  |  |  | C state: | 
| 1760 |  |  |  |  |  |  |  | 
| 1761 |  |  |  |  |  |  | my $grp = aio_group sub { | 
| 1762 |  |  |  |  |  |  | print "all requests are done\n"; | 
| 1763 |  |  |  |  |  |  | }; | 
| 1764 |  |  |  |  |  |  |  | 
| 1765 |  |  |  |  |  |  | You add requests by calling the C method with one or more | 
| 1766 |  |  |  |  |  |  | C objects: | 
| 1767 |  |  |  |  |  |  |  | 
| 1768 |  |  |  |  |  |  | $grp->add (aio_unlink "..."); | 
| 1769 |  |  |  |  |  |  |  | 
| 1770 |  |  |  |  |  |  | add $grp aio_stat "...", sub { | 
| 1771 |  |  |  |  |  |  | $_[0] or return $grp->result ("error"); | 
| 1772 |  |  |  |  |  |  |  | 
| 1773 |  |  |  |  |  |  | # add another request dynamically, if first succeeded | 
| 1774 |  |  |  |  |  |  | add $grp aio_open "...", sub { | 
| 1775 |  |  |  |  |  |  | $grp->result ("ok"); | 
| 1776 |  |  |  |  |  |  | }; | 
| 1777 |  |  |  |  |  |  | }; | 
| 1778 |  |  |  |  |  |  |  | 
| 1779 |  |  |  |  |  |  | This makes it very easy to create composite requests (see the source of | 
| 1780 |  |  |  |  |  |  | C for an application) that work and feel like simple requests. | 
| 1781 |  |  |  |  |  |  |  | 
| 1782 |  |  |  |  |  |  | =over 4 | 
| 1783 |  |  |  |  |  |  |  | 
| 1784 |  |  |  |  |  |  | =item * The IO::AIO::GRP objects will be cleaned up during calls to | 
| 1785 |  |  |  |  |  |  | C, just like any other request. | 
| 1786 |  |  |  |  |  |  |  | 
| 1787 |  |  |  |  |  |  | =item * They can be canceled like any other request. Canceling will cancel not | 
| 1788 |  |  |  |  |  |  | only the request itself, but also all requests it contains. | 
| 1789 |  |  |  |  |  |  |  | 
| 1790 |  |  |  |  |  |  | =item * They can also can also be added to other IO::AIO::GRP objects. | 
| 1791 |  |  |  |  |  |  |  | 
| 1792 |  |  |  |  |  |  | =item * You must not add requests to a group from within the group callback (or | 
| 1793 |  |  |  |  |  |  | any later time). | 
| 1794 |  |  |  |  |  |  |  | 
| 1795 |  |  |  |  |  |  | =back | 
| 1796 |  |  |  |  |  |  |  | 
| 1797 |  |  |  |  |  |  | Their lifetime, simplified, looks like this: when they are empty, they | 
| 1798 |  |  |  |  |  |  | will finish very quickly. If they contain only requests that are in the | 
| 1799 |  |  |  |  |  |  | C state, they will also finish. Otherwise they will continue to | 
| 1800 |  |  |  |  |  |  | exist. | 
| 1801 |  |  |  |  |  |  |  | 
| 1802 |  |  |  |  |  |  | That means after creating a group you have some time to add requests | 
| 1803 |  |  |  |  |  |  | (precisely before the callback has been invoked, which is only done within | 
| 1804 |  |  |  |  |  |  | the C). And in the callbacks of those requests, you can add | 
| 1805 |  |  |  |  |  |  | further requests to the group. And only when all those requests have | 
| 1806 |  |  |  |  |  |  | finished will the the group itself finish. | 
| 1807 |  |  |  |  |  |  |  | 
| 1808 |  |  |  |  |  |  | =over 4 | 
| 1809 |  |  |  |  |  |  |  | 
| 1810 |  |  |  |  |  |  | =item add $grp ... | 
| 1811 |  |  |  |  |  |  |  | 
| 1812 |  |  |  |  |  |  | =item $grp->add (...) | 
| 1813 |  |  |  |  |  |  |  | 
| 1814 |  |  |  |  |  |  | Add one or more requests to the group. Any type of L can | 
| 1815 |  |  |  |  |  |  | be added, including other groups, as long as you do not create circular | 
| 1816 |  |  |  |  |  |  | dependencies. | 
| 1817 |  |  |  |  |  |  |  | 
| 1818 |  |  |  |  |  |  | Returns all its arguments. | 
| 1819 |  |  |  |  |  |  |  | 
| 1820 |  |  |  |  |  |  | =item $grp->cancel_subs | 
| 1821 |  |  |  |  |  |  |  | 
| 1822 |  |  |  |  |  |  | Cancel all subrequests and clears any feeder, but not the group request | 
| 1823 |  |  |  |  |  |  | itself. Useful when you queued a lot of events but got a result early. | 
| 1824 |  |  |  |  |  |  |  | 
| 1825 |  |  |  |  |  |  | The group request will finish normally (you cannot add requests to the | 
| 1826 |  |  |  |  |  |  | group). | 
| 1827 |  |  |  |  |  |  |  | 
| 1828 |  |  |  |  |  |  | =item $grp->result (...) | 
| 1829 |  |  |  |  |  |  |  | 
| 1830 |  |  |  |  |  |  | Set the result value(s) that will be passed to the group callback when all | 
| 1831 |  |  |  |  |  |  | subrequests have finished and set the groups errno to the current value | 
| 1832 |  |  |  |  |  |  | of errno (just like calling C without an error number). By default, | 
| 1833 |  |  |  |  |  |  | no argument will be passed and errno is zero. | 
| 1834 |  |  |  |  |  |  |  | 
| 1835 |  |  |  |  |  |  | =item $grp->errno ([$errno]) | 
| 1836 |  |  |  |  |  |  |  | 
| 1837 |  |  |  |  |  |  | Sets the group errno value to C<$errno>, or the current value of errno | 
| 1838 |  |  |  |  |  |  | when the argument is missing. | 
| 1839 |  |  |  |  |  |  |  | 
| 1840 |  |  |  |  |  |  | Every aio request has an associated errno value that is restored when | 
| 1841 |  |  |  |  |  |  | the callback is invoked. This method lets you change this value from its | 
| 1842 |  |  |  |  |  |  | default (0). | 
| 1843 |  |  |  |  |  |  |  | 
| 1844 |  |  |  |  |  |  | Calling C will also set errno, so make sure you either set C<$!> | 
| 1845 |  |  |  |  |  |  | before the call to C, or call c after it. | 
| 1846 |  |  |  |  |  |  |  | 
| 1847 |  |  |  |  |  |  | =item feed $grp $callback->($grp) | 
| 1848 |  |  |  |  |  |  |  | 
| 1849 |  |  |  |  |  |  | Sets a feeder/generator on this group: every group can have an attached | 
| 1850 |  |  |  |  |  |  | generator that generates requests if idle. The idea behind this is that, | 
| 1851 |  |  |  |  |  |  | although you could just queue as many requests as you want in a group, | 
| 1852 |  |  |  |  |  |  | this might starve other requests for a potentially long time. For example, | 
| 1853 |  |  |  |  |  |  | C might generate hundreds of thousands of C | 
| 1854 |  |  |  |  |  |  | requests, delaying any later requests for a long time. | 
| 1855 |  |  |  |  |  |  |  | 
| 1856 |  |  |  |  |  |  | To avoid this, and allow incremental generation of requests, you can | 
| 1857 |  |  |  |  |  |  | instead a group and set a feeder on it that generates those requests. The | 
| 1858 |  |  |  |  |  |  | feed callback will be called whenever there are few enough (see C, | 
| 1859 |  |  |  |  |  |  | below) requests active in the group itself and is expected to queue more | 
| 1860 |  |  |  |  |  |  | requests. | 
| 1861 |  |  |  |  |  |  |  | 
| 1862 |  |  |  |  |  |  | The feed callback can queue as many requests as it likes (i.e. C does | 
| 1863 |  |  |  |  |  |  | not impose any limits). | 
| 1864 |  |  |  |  |  |  |  | 
| 1865 |  |  |  |  |  |  | If the feed does not queue more requests when called, it will be | 
| 1866 |  |  |  |  |  |  | automatically removed from the group. | 
| 1867 |  |  |  |  |  |  |  | 
| 1868 |  |  |  |  |  |  | If the feed limit is C<0> when this method is called, it will be set to | 
| 1869 |  |  |  |  |  |  | C<2> automatically. | 
| 1870 |  |  |  |  |  |  |  | 
| 1871 |  |  |  |  |  |  | Example: | 
| 1872 |  |  |  |  |  |  |  | 
| 1873 |  |  |  |  |  |  | # stat all files in @files, but only ever use four aio requests concurrently: | 
| 1874 |  |  |  |  |  |  |  | 
| 1875 |  |  |  |  |  |  | my $grp = aio_group sub { print "finished\n" }; | 
| 1876 |  |  |  |  |  |  | limit $grp 4; | 
| 1877 |  |  |  |  |  |  | feed $grp sub { | 
| 1878 |  |  |  |  |  |  | my $file = pop @files | 
| 1879 |  |  |  |  |  |  | or return; | 
| 1880 |  |  |  |  |  |  |  | 
| 1881 |  |  |  |  |  |  | add $grp aio_stat $file, sub { ... }; | 
| 1882 |  |  |  |  |  |  | }; | 
| 1883 |  |  |  |  |  |  |  | 
| 1884 |  |  |  |  |  |  | =item limit $grp $num | 
| 1885 |  |  |  |  |  |  |  | 
| 1886 |  |  |  |  |  |  | Sets the feeder limit for the group: The feeder will be called whenever | 
| 1887 |  |  |  |  |  |  | the group contains less than this many requests. | 
| 1888 |  |  |  |  |  |  |  | 
| 1889 |  |  |  |  |  |  | Setting the limit to C<0> will pause the feeding process. | 
| 1890 |  |  |  |  |  |  |  | 
| 1891 |  |  |  |  |  |  | The default value for the limit is C<0>, but note that setting a feeder | 
| 1892 |  |  |  |  |  |  | automatically bumps it up to C<2>. | 
| 1893 |  |  |  |  |  |  |  | 
| 1894 |  |  |  |  |  |  | =back | 
| 1895 |  |  |  |  |  |  |  | 
| 1896 |  |  |  |  |  |  |  | 
| 1897 |  |  |  |  |  |  | =head2 SUPPORT FUNCTIONS | 
| 1898 |  |  |  |  |  |  |  | 
| 1899 |  |  |  |  |  |  | =head3 EVENT PROCESSING AND EVENT LOOP INTEGRATION | 
| 1900 |  |  |  |  |  |  |  | 
| 1901 |  |  |  |  |  |  | =over 4 | 
| 1902 |  |  |  |  |  |  |  | 
| 1903 |  |  |  |  |  |  | =item $fileno = IO::AIO::poll_fileno | 
| 1904 |  |  |  |  |  |  |  | 
| 1905 |  |  |  |  |  |  | Return the I. This filehandle must be | 
| 1906 |  |  |  |  |  |  | polled for reading by some mechanism outside this module (e.g. EV, Glib, | 
| 1907 |  |  |  |  |  |  | select and so on, see below or the SYNOPSIS). If the pipe becomes readable | 
| 1908 |  |  |  |  |  |  | you have to call C to check the results. | 
| 1909 |  |  |  |  |  |  |  | 
| 1910 |  |  |  |  |  |  | See C for an example. | 
| 1911 |  |  |  |  |  |  |  | 
| 1912 |  |  |  |  |  |  | =item IO::AIO::poll_cb | 
| 1913 |  |  |  |  |  |  |  | 
| 1914 |  |  |  |  |  |  | Process some requests that have reached the result phase (i.e. they have | 
| 1915 |  |  |  |  |  |  | been executed but the results are not yet reported). You have to call | 
| 1916 |  |  |  |  |  |  | this "regularly" to finish outstanding requests. | 
| 1917 |  |  |  |  |  |  |  | 
| 1918 |  |  |  |  |  |  | Returns C<0> if all events could be processed (or there were no | 
| 1919 |  |  |  |  |  |  | events to process), or C<-1> if it returned earlier for whatever | 
| 1920 |  |  |  |  |  |  | reason. Returns immediately when no events are outstanding. The amount | 
| 1921 |  |  |  |  |  |  | of events processed depends on the settings of C, | 
| 1922 |  |  |  |  |  |  | C and C. | 
| 1923 |  |  |  |  |  |  |  | 
| 1924 |  |  |  |  |  |  | If not all requests were processed for whatever reason, the poll file | 
| 1925 |  |  |  |  |  |  | descriptor will still be ready when C returns, so normally you | 
| 1926 |  |  |  |  |  |  | don't have to do anything special to have it called later. | 
| 1927 |  |  |  |  |  |  |  | 
| 1928 |  |  |  |  |  |  | Apart from calling C when the event filehandle becomes | 
| 1929 |  |  |  |  |  |  | ready, it can be beneficial to call this function from loops which submit | 
| 1930 |  |  |  |  |  |  | a lot of requests, to make sure the results get processed when they become | 
| 1931 |  |  |  |  |  |  | available and not just when the loop is finished and the event loop takes | 
| 1932 |  |  |  |  |  |  | over again. This function returns very fast when there are no outstanding | 
| 1933 |  |  |  |  |  |  | requests. | 
| 1934 |  |  |  |  |  |  |  | 
| 1935 |  |  |  |  |  |  | Example: Install an Event watcher that automatically calls | 
| 1936 |  |  |  |  |  |  | IO::AIO::poll_cb with high priority (more examples can be found in the | 
| 1937 |  |  |  |  |  |  | SYNOPSIS section, at the top of this document): | 
| 1938 |  |  |  |  |  |  |  | 
| 1939 |  |  |  |  |  |  | Event->io (fd => IO::AIO::poll_fileno, | 
| 1940 |  |  |  |  |  |  | poll => 'r', async => 1, | 
| 1941 |  |  |  |  |  |  | cb => \&IO::AIO::poll_cb); | 
| 1942 |  |  |  |  |  |  |  | 
| 1943 |  |  |  |  |  |  | =item IO::AIO::poll_wait | 
| 1944 |  |  |  |  |  |  |  | 
| 1945 |  |  |  |  |  |  | Wait until either at least one request is in the result phase or no | 
| 1946 |  |  |  |  |  |  | requests are outstanding anymore. | 
| 1947 |  |  |  |  |  |  |  | 
| 1948 |  |  |  |  |  |  | This is useful if you want to synchronously wait for some requests to | 
| 1949 |  |  |  |  |  |  | become ready, without actually handling them. | 
| 1950 |  |  |  |  |  |  |  | 
| 1951 |  |  |  |  |  |  | See C for an example. | 
| 1952 |  |  |  |  |  |  |  | 
| 1953 |  |  |  |  |  |  | =item IO::AIO::poll | 
| 1954 |  |  |  |  |  |  |  | 
| 1955 |  |  |  |  |  |  | Waits until some requests have been handled. | 
| 1956 |  |  |  |  |  |  |  | 
| 1957 |  |  |  |  |  |  | Returns the number of requests processed, but is otherwise strictly | 
| 1958 |  |  |  |  |  |  | equivalent to: | 
| 1959 |  |  |  |  |  |  |  | 
| 1960 |  |  |  |  |  |  | IO::AIO::poll_wait, IO::AIO::poll_cb | 
| 1961 |  |  |  |  |  |  |  | 
| 1962 |  |  |  |  |  |  | =item IO::AIO::flush | 
| 1963 |  |  |  |  |  |  |  | 
| 1964 |  |  |  |  |  |  | Wait till all outstanding AIO requests have been handled. | 
| 1965 |  |  |  |  |  |  |  | 
| 1966 |  |  |  |  |  |  | Strictly equivalent to: | 
| 1967 |  |  |  |  |  |  |  | 
| 1968 |  |  |  |  |  |  | IO::AIO::poll_wait, IO::AIO::poll_cb | 
| 1969 |  |  |  |  |  |  | while IO::AIO::nreqs; | 
| 1970 |  |  |  |  |  |  |  | 
| 1971 |  |  |  |  |  |  | This function can be useful at program aborts, to make sure outstanding | 
| 1972 |  |  |  |  |  |  | I/O has been done (C uses an C block which already calls | 
| 1973 |  |  |  |  |  |  | this function on normal exits), or when you are merely using C | 
| 1974 |  |  |  |  |  |  | for its more advanced functions, rather than for async I/O, e.g.: | 
| 1975 |  |  |  |  |  |  |  | 
| 1976 |  |  |  |  |  |  | my ($dirs, $nondirs); | 
| 1977 |  |  |  |  |  |  | IO::AIO::aio_scandir "/tmp", 0, sub { ($dirs, $nondirs) = @_ }; | 
| 1978 |  |  |  |  |  |  | IO::AIO::flush; | 
| 1979 |  |  |  |  |  |  | # $dirs, $nondirs are now set | 
| 1980 |  |  |  |  |  |  |  | 
| 1981 |  |  |  |  |  |  | =item IO::AIO::max_poll_reqs $nreqs | 
| 1982 |  |  |  |  |  |  |  | 
| 1983 |  |  |  |  |  |  | =item IO::AIO::max_poll_time $seconds | 
| 1984 |  |  |  |  |  |  |  | 
| 1985 |  |  |  |  |  |  | These set the maximum number of requests (default C<0>, meaning infinity) | 
| 1986 |  |  |  |  |  |  | that are being processed by C in one call, respectively | 
| 1987 |  |  |  |  |  |  | the maximum amount of time (default C<0>, meaning infinity) spent in | 
| 1988 |  |  |  |  |  |  | C to process requests (more correctly the mininum amount | 
| 1989 |  |  |  |  |  |  | of time C is allowed to use). | 
| 1990 |  |  |  |  |  |  |  | 
| 1991 |  |  |  |  |  |  | Setting C to a non-zero value creates an overhead of one | 
| 1992 |  |  |  |  |  |  | syscall per request processed, which is not normally a problem unless your | 
| 1993 |  |  |  |  |  |  | callbacks are really really fast or your OS is really really slow (I am | 
| 1994 |  |  |  |  |  |  | not mentioning Solaris here). Using C incurs no overhead. | 
| 1995 |  |  |  |  |  |  |  | 
| 1996 |  |  |  |  |  |  | Setting these is useful if you want to ensure some level of | 
| 1997 |  |  |  |  |  |  | interactiveness when perl is not fast enough to process all requests in | 
| 1998 |  |  |  |  |  |  | time. | 
| 1999 |  |  |  |  |  |  |  | 
| 2000 |  |  |  |  |  |  | For interactive programs, values such as C<0.01> to C<0.1> should be fine. | 
| 2001 |  |  |  |  |  |  |  | 
| 2002 |  |  |  |  |  |  | Example: Install an Event watcher that automatically calls | 
| 2003 |  |  |  |  |  |  | IO::AIO::poll_cb with low priority, to ensure that other parts of the | 
| 2004 |  |  |  |  |  |  | program get the CPU sometimes even under high AIO load. | 
| 2005 |  |  |  |  |  |  |  | 
| 2006 |  |  |  |  |  |  | # try not to spend much more than 0.1s in poll_cb | 
| 2007 |  |  |  |  |  |  | IO::AIO::max_poll_time 0.1; | 
| 2008 |  |  |  |  |  |  |  | 
| 2009 |  |  |  |  |  |  | # use a low priority so other tasks have priority | 
| 2010 |  |  |  |  |  |  | Event->io (fd => IO::AIO::poll_fileno, | 
| 2011 |  |  |  |  |  |  | poll => 'r', nice => 1, | 
| 2012 |  |  |  |  |  |  | cb => &IO::AIO::poll_cb); | 
| 2013 |  |  |  |  |  |  |  | 
| 2014 |  |  |  |  |  |  | =back | 
| 2015 |  |  |  |  |  |  |  | 
| 2016 |  |  |  |  |  |  |  | 
| 2017 |  |  |  |  |  |  | =head3 CONTROLLING THE NUMBER OF THREADS | 
| 2018 |  |  |  |  |  |  |  | 
| 2019 |  |  |  |  |  |  | =over | 
| 2020 |  |  |  |  |  |  |  | 
| 2021 |  |  |  |  |  |  | =item IO::AIO::min_parallel $nthreads | 
| 2022 |  |  |  |  |  |  |  | 
| 2023 |  |  |  |  |  |  | Set the minimum number of AIO threads to C<$nthreads>. The current | 
| 2024 |  |  |  |  |  |  | default is C<8>, which means eight asynchronous operations can execute | 
| 2025 |  |  |  |  |  |  | concurrently at any one time (the number of outstanding requests, | 
| 2026 |  |  |  |  |  |  | however, is unlimited). | 
| 2027 |  |  |  |  |  |  |  | 
| 2028 |  |  |  |  |  |  | IO::AIO starts threads only on demand, when an AIO request is queued and | 
| 2029 |  |  |  |  |  |  | no free thread exists. Please note that queueing up a hundred requests can | 
| 2030 |  |  |  |  |  |  | create demand for a hundred threads, even if it turns out that everything | 
| 2031 |  |  |  |  |  |  | is in the cache and could have been processed faster by a single thread. | 
| 2032 |  |  |  |  |  |  |  | 
| 2033 |  |  |  |  |  |  | It is recommended to keep the number of threads relatively low, as some | 
| 2034 |  |  |  |  |  |  | Linux kernel versions will scale negatively with the number of threads | 
| 2035 |  |  |  |  |  |  | (higher parallelity => MUCH higher latency). With current Linux 2.6 | 
| 2036 |  |  |  |  |  |  | versions, 4-32 threads should be fine. | 
| 2037 |  |  |  |  |  |  |  | 
| 2038 |  |  |  |  |  |  | Under most circumstances you don't need to call this function, as the | 
| 2039 |  |  |  |  |  |  | module selects a default that is suitable for low to moderate load. | 
| 2040 |  |  |  |  |  |  |  | 
| 2041 |  |  |  |  |  |  | =item IO::AIO::max_parallel $nthreads | 
| 2042 |  |  |  |  |  |  |  | 
| 2043 |  |  |  |  |  |  | Sets the maximum number of AIO threads to C<$nthreads>. If more than the | 
| 2044 |  |  |  |  |  |  | specified number of threads are currently running, this function kills | 
| 2045 |  |  |  |  |  |  | them. This function blocks until the limit is reached. | 
| 2046 |  |  |  |  |  |  |  | 
| 2047 |  |  |  |  |  |  | While C<$nthreads> are zero, aio requests get queued but not executed | 
| 2048 |  |  |  |  |  |  | until the number of threads has been increased again. | 
| 2049 |  |  |  |  |  |  |  | 
| 2050 |  |  |  |  |  |  | This module automatically runs C at program end, to ensure | 
| 2051 |  |  |  |  |  |  | that all threads are killed and that there are no outstanding requests. | 
| 2052 |  |  |  |  |  |  |  | 
| 2053 |  |  |  |  |  |  | Under normal circumstances you don't need to call this function. | 
| 2054 |  |  |  |  |  |  |  | 
| 2055 |  |  |  |  |  |  | =item IO::AIO::max_idle $nthreads | 
| 2056 |  |  |  |  |  |  |  | 
| 2057 |  |  |  |  |  |  | Limit the number of threads (default: 4) that are allowed to idle | 
| 2058 |  |  |  |  |  |  | (i.e., threads that did not get a request to process within the idle | 
| 2059 |  |  |  |  |  |  | timeout (default: 10 seconds). That means if a thread becomes idle while | 
| 2060 |  |  |  |  |  |  | C<$nthreads> other threads are also idle, it will free its resources and | 
| 2061 |  |  |  |  |  |  | exit. | 
| 2062 |  |  |  |  |  |  |  | 
| 2063 |  |  |  |  |  |  | This is useful when you allow a large number of threads (e.g. 100 or 1000) | 
| 2064 |  |  |  |  |  |  | to allow for extremely high load situations, but want to free resources | 
| 2065 |  |  |  |  |  |  | under normal circumstances (1000 threads can easily consume 30MB of RAM). | 
| 2066 |  |  |  |  |  |  |  | 
| 2067 |  |  |  |  |  |  | The default is probably ok in most situations, especially if thread | 
| 2068 |  |  |  |  |  |  | creation is fast. If thread creation is very slow on your system you might | 
| 2069 |  |  |  |  |  |  | want to use larger values. | 
| 2070 |  |  |  |  |  |  |  | 
| 2071 |  |  |  |  |  |  | =item IO::AIO::idle_timeout $seconds | 
| 2072 |  |  |  |  |  |  |  | 
| 2073 |  |  |  |  |  |  | Sets the minimum idle timeout (default 10) after which worker threads are | 
| 2074 |  |  |  |  |  |  | allowed to exit. SEe C. | 
| 2075 |  |  |  |  |  |  |  | 
| 2076 |  |  |  |  |  |  | =item IO::AIO::max_outstanding $maxreqs | 
| 2077 |  |  |  |  |  |  |  | 
| 2078 |  |  |  |  |  |  | Sets the maximum number of outstanding requests to C<$nreqs>. If | 
| 2079 |  |  |  |  |  |  | you do queue up more than this number of requests, the next call to | 
| 2080 |  |  |  |  |  |  | C (and other functions calling C, such as | 
| 2081 |  |  |  |  |  |  | C or C) will block until the limit is no | 
| 2082 |  |  |  |  |  |  | longer exceeded. | 
| 2083 |  |  |  |  |  |  |  | 
| 2084 |  |  |  |  |  |  | In other words, this setting does not enforce a queue limit, but can be | 
| 2085 |  |  |  |  |  |  | used to make poll functions block if the limit is exceeded. | 
| 2086 |  |  |  |  |  |  |  | 
| 2087 |  |  |  |  |  |  | This is a bad function to use in interactive programs because it blocks, | 
| 2088 |  |  |  |  |  |  | and a bad way to reduce concurrency because it is inexact. If you need to | 
| 2089 |  |  |  |  |  |  | issue many requests without being able to call a poll function on demand, | 
| 2090 |  |  |  |  |  |  | it is better to use an C together with a feed callback. | 
| 2091 |  |  |  |  |  |  |  | 
| 2092 |  |  |  |  |  |  | Its main use is in scripts without an event loop - when you want to stat a | 
| 2093 |  |  |  |  |  |  | lot of files, you can write something like this: | 
| 2094 |  |  |  |  |  |  |  | 
| 2095 |  |  |  |  |  |  | IO::AIO::max_outstanding 32; | 
| 2096 |  |  |  |  |  |  |  | 
| 2097 |  |  |  |  |  |  | for my $path (...) { | 
| 2098 |  |  |  |  |  |  | aio_stat $path , ...; | 
| 2099 |  |  |  |  |  |  | IO::AIO::poll_cb; | 
| 2100 |  |  |  |  |  |  | } | 
| 2101 |  |  |  |  |  |  |  | 
| 2102 |  |  |  |  |  |  | IO::AIO::flush; | 
| 2103 |  |  |  |  |  |  |  | 
| 2104 |  |  |  |  |  |  | The call to C inside the loop will normally return instantly, | 
| 2105 |  |  |  |  |  |  | allowing the loop to progress, but as soon as more than C<32> requests | 
| 2106 |  |  |  |  |  |  | are in-flight, it will block until some requests have been handled. This | 
| 2107 |  |  |  |  |  |  | keeps the loop from pushing a large number of C requests onto | 
| 2108 |  |  |  |  |  |  | the queue (which, with many paths to stat, can use up a lot of memory). | 
| 2109 |  |  |  |  |  |  |  | 
| 2110 |  |  |  |  |  |  | The default value for C is very large, so there is no | 
| 2111 |  |  |  |  |  |  | practical limit on the number of outstanding requests. | 
| 2112 |  |  |  |  |  |  |  | 
| 2113 |  |  |  |  |  |  | =back | 
| 2114 |  |  |  |  |  |  |  | 
| 2115 |  |  |  |  |  |  |  | 
| 2116 |  |  |  |  |  |  | =head3 STATISTICAL INFORMATION | 
| 2117 |  |  |  |  |  |  |  | 
| 2118 |  |  |  |  |  |  | =over | 
| 2119 |  |  |  |  |  |  |  | 
| 2120 |  |  |  |  |  |  | =item IO::AIO::nreqs | 
| 2121 |  |  |  |  |  |  |  | 
| 2122 |  |  |  |  |  |  | Returns the number of requests currently in the ready, execute or pending | 
| 2123 |  |  |  |  |  |  | states (i.e. for which their callback has not been invoked yet). | 
| 2124 |  |  |  |  |  |  |  | 
| 2125 |  |  |  |  |  |  | Example: wait till there are no outstanding requests anymore: | 
| 2126 |  |  |  |  |  |  |  | 
| 2127 |  |  |  |  |  |  | IO::AIO::poll_wait, IO::AIO::poll_cb | 
| 2128 |  |  |  |  |  |  | while IO::AIO::nreqs; | 
| 2129 |  |  |  |  |  |  |  | 
| 2130 |  |  |  |  |  |  | =item IO::AIO::nready | 
| 2131 |  |  |  |  |  |  |  | 
| 2132 |  |  |  |  |  |  | Returns the number of requests currently in the ready state (not yet | 
| 2133 |  |  |  |  |  |  | executed). | 
| 2134 |  |  |  |  |  |  |  | 
| 2135 |  |  |  |  |  |  | =item IO::AIO::npending | 
| 2136 |  |  |  |  |  |  |  | 
| 2137 |  |  |  |  |  |  | Returns the number of requests currently in the pending state (executed, | 
| 2138 |  |  |  |  |  |  | but not yet processed by poll_cb). | 
| 2139 |  |  |  |  |  |  |  | 
| 2140 |  |  |  |  |  |  | =back | 
| 2141 |  |  |  |  |  |  |  | 
| 2142 |  |  |  |  |  |  |  | 
| 2143 |  |  |  |  |  |  | =head3 SUBSECOND STAT TIME ACCESS | 
| 2144 |  |  |  |  |  |  |  | 
| 2145 |  |  |  |  |  |  | Both C/C and perl's C/C functions can | 
| 2146 |  |  |  |  |  |  | generally find access/modification and change times with subsecond time | 
| 2147 |  |  |  |  |  |  | accuracy of the system supports it, but perl's built-in functions only | 
| 2148 |  |  |  |  |  |  | return the integer part. | 
| 2149 |  |  |  |  |  |  |  | 
| 2150 |  |  |  |  |  |  | The following functions return the timestamps of the most recent | 
| 2151 |  |  |  |  |  |  | stat with subsecond precision on most systems and work both after | 
| 2152 |  |  |  |  |  |  | C/C and perl's C/C calls. Their return | 
| 2153 |  |  |  |  |  |  | value is only meaningful after a successful C/C call, or | 
| 2154 |  |  |  |  |  |  | during/after a successful C/C callback. | 
| 2155 |  |  |  |  |  |  |  | 
| 2156 |  |  |  |  |  |  | This is similar to the L C functions, but can return | 
| 2157 |  |  |  |  |  |  | full resolution without rounding and work with standard perl C, | 
| 2158 |  |  |  |  |  |  | alleviating the need to call the special C functions, which | 
| 2159 |  |  |  |  |  |  | do not act like their perl counterparts. | 
| 2160 |  |  |  |  |  |  |  | 
| 2161 |  |  |  |  |  |  | On operating systems or file systems where subsecond time resolution is | 
| 2162 |  |  |  |  |  |  | not supported or could not be detected, a fractional part of C<0> is | 
| 2163 |  |  |  |  |  |  | returned, so it is always safe to call these functions. | 
| 2164 |  |  |  |  |  |  |  | 
| 2165 |  |  |  |  |  |  | =over 4 | 
| 2166 |  |  |  |  |  |  |  | 
| 2167 |  |  |  |  |  |  | =item $seconds = IO::AIO::st_atime, IO::AIO::st_mtime, IO::AIO::st_ctime, IO::AIO::st_btime | 
| 2168 |  |  |  |  |  |  |  | 
| 2169 |  |  |  |  |  |  | Return the access, modication, change or birth time, respectively, | 
| 2170 |  |  |  |  |  |  | including fractional part. Due to the limited precision of floating point, | 
| 2171 |  |  |  |  |  |  | the accuracy on most platforms is only a bit better than milliseconds | 
| 2172 |  |  |  |  |  |  | for times around now - see the I function family, below, for full | 
| 2173 |  |  |  |  |  |  | accuracy. | 
| 2174 |  |  |  |  |  |  |  | 
| 2175 |  |  |  |  |  |  | File birth time is only available when the OS and perl support it (on | 
| 2176 |  |  |  |  |  |  | FreeBSD and NetBSD at the time of this writing, although support is | 
| 2177 |  |  |  |  |  |  | adaptive, so if your OS/perl gains support, IO::AIO can take advantage of | 
| 2178 |  |  |  |  |  |  | it). On systems where it isn't available, C<0> is currently returned, but | 
| 2179 |  |  |  |  |  |  | this might change to C in a future version. | 
| 2180 |  |  |  |  |  |  |  | 
| 2181 |  |  |  |  |  |  | =item ($atime, $mtime, $ctime, $btime, ...) = IO::AIO::st_xtime | 
| 2182 |  |  |  |  |  |  |  | 
| 2183 |  |  |  |  |  |  | Returns access, modification, change and birth time all in one go, and | 
| 2184 |  |  |  |  |  |  | maybe more times in the future version. | 
| 2185 |  |  |  |  |  |  |  | 
| 2186 |  |  |  |  |  |  | =item $nanoseconds = IO::AIO::st_atimensec, IO::AIO::st_mtimensec, IO::AIO::st_ctimensec, IO::AIO::st_btimensec | 
| 2187 |  |  |  |  |  |  |  | 
| 2188 |  |  |  |  |  |  | Return the fractional access, modifcation, change or birth time, in nanoseconds, | 
| 2189 |  |  |  |  |  |  | as an integer in the range C<0> to C<999999999>. | 
| 2190 |  |  |  |  |  |  |  | 
| 2191 |  |  |  |  |  |  | Note that no accessors are provided for access, modification and | 
| 2192 |  |  |  |  |  |  | change times - you need to get those from C if required (C | 
| 2193 |  |  |  |  |  |  | IO::AIO::st_atime> and so on will I generally give you the correct | 
| 2194 |  |  |  |  |  |  | value). | 
| 2195 |  |  |  |  |  |  |  | 
| 2196 |  |  |  |  |  |  | =item $seconds = IO::AIO::st_btimesec | 
| 2197 |  |  |  |  |  |  |  | 
| 2198 |  |  |  |  |  |  | The (integral) seconds part of the file birth time, if available. | 
| 2199 |  |  |  |  |  |  |  | 
| 2200 |  |  |  |  |  |  | =item ($atime, $mtime, $ctime, $btime, ...) = IO::AIO::st_xtimensec | 
| 2201 |  |  |  |  |  |  |  | 
| 2202 |  |  |  |  |  |  | Like the functions above, but returns all four times in one go (and maybe | 
| 2203 |  |  |  |  |  |  | more in future versions). | 
| 2204 |  |  |  |  |  |  |  | 
| 2205 |  |  |  |  |  |  | =item $counter = IO::AIO::st_gen | 
| 2206 |  |  |  |  |  |  |  | 
| 2207 |  |  |  |  |  |  | Returns the generation counter (in practice this is just a random number) | 
| 2208 |  |  |  |  |  |  | of the file. This is only available on platforms which have this member in | 
| 2209 |  |  |  |  |  |  | their C (most BSDs at the time of this writing) and generally | 
| 2210 |  |  |  |  |  |  | only to the root usert. If unsupported, C<0> is returned, but this might | 
| 2211 |  |  |  |  |  |  | change to C in a future version. | 
| 2212 |  |  |  |  |  |  |  | 
| 2213 |  |  |  |  |  |  | =back | 
| 2214 |  |  |  |  |  |  |  | 
| 2215 |  |  |  |  |  |  | Example: print the high resolution modification time of F, using | 
| 2216 |  |  |  |  |  |  | C, and C. | 
| 2217 |  |  |  |  |  |  |  | 
| 2218 |  |  |  |  |  |  | if (stat "/etc") { | 
| 2219 |  |  |  |  |  |  | printf "stat(/etc) mtime: %f\n", IO::AIO::st_mtime; | 
| 2220 |  |  |  |  |  |  | } | 
| 2221 |  |  |  |  |  |  |  | 
| 2222 |  |  |  |  |  |  | IO::AIO::aio_stat "/etc", sub { | 
| 2223 |  |  |  |  |  |  | $_[0] | 
| 2224 |  |  |  |  |  |  | and return; | 
| 2225 |  |  |  |  |  |  |  | 
| 2226 |  |  |  |  |  |  | printf "aio_stat(/etc) mtime: %d.%09d\n", (stat _)[9], IO::AIO::st_mtimensec; | 
| 2227 |  |  |  |  |  |  | }; | 
| 2228 |  |  |  |  |  |  |  | 
| 2229 |  |  |  |  |  |  | IO::AIO::flush; | 
| 2230 |  |  |  |  |  |  |  | 
| 2231 |  |  |  |  |  |  | Output of the awbove on my system, showing reduced and full accuracy: | 
| 2232 |  |  |  |  |  |  |  | 
| 2233 |  |  |  |  |  |  | stat(/etc) mtime: 1534043702.020808 | 
| 2234 |  |  |  |  |  |  | aio_stat(/etc) mtime: 1534043702.020807792 | 
| 2235 |  |  |  |  |  |  |  | 
| 2236 |  |  |  |  |  |  |  | 
| 2237 |  |  |  |  |  |  | =head3 MISCELLANEOUS FUNCTIONS | 
| 2238 |  |  |  |  |  |  |  | 
| 2239 |  |  |  |  |  |  | IO::AIO implements some functions that are useful when you want to use | 
| 2240 |  |  |  |  |  |  | some "Advanced I/O" function not available to in Perl, without going the | 
| 2241 |  |  |  |  |  |  | "Asynchronous I/O" route. Many of these have an asynchronous C | 
| 2242 |  |  |  |  |  |  | counterpart. | 
| 2243 |  |  |  |  |  |  |  | 
| 2244 |  |  |  |  |  |  | =over 4 | 
| 2245 |  |  |  |  |  |  |  | 
| 2246 |  |  |  |  |  |  | =item $retval = IO::AIO::fexecve $fh, $argv, $envp | 
| 2247 |  |  |  |  |  |  |  | 
| 2248 |  |  |  |  |  |  | A more-or-less direct equivalent to the POSIX C functions, which | 
| 2249 |  |  |  |  |  |  | allows you to specify the program to be executed via a file descriptor (or | 
| 2250 |  |  |  |  |  |  | handle). Returns C<-1> and sets errno to C if not available. | 
| 2251 |  |  |  |  |  |  |  | 
| 2252 |  |  |  |  |  |  | =item $retval = IO::AIO::mount $special, $path, $fstype, $flags = 0, $data = undef | 
| 2253 |  |  |  |  |  |  |  | 
| 2254 |  |  |  |  |  |  | Calls the GNU/Linux mount syscall with the given arguments. All except | 
| 2255 |  |  |  |  |  |  | C<$flags> are strings, and if C<$data> is C, a C will be | 
| 2256 |  |  |  |  |  |  | passed. | 
| 2257 |  |  |  |  |  |  |  | 
| 2258 |  |  |  |  |  |  | The following values for C<$flags> are available: | 
| 2259 |  |  |  |  |  |  |  | 
| 2260 |  |  |  |  |  |  | C, C, C, C, C, | 
| 2261 |  |  |  |  |  |  | C, C, C, C, | 
| 2262 |  |  |  |  |  |  | C, C, C, C, C, | 
| 2263 |  |  |  |  |  |  | C, C, C, C, C, | 
| 2264 |  |  |  |  |  |  | C, C, C, C, | 
| 2265 |  |  |  |  |  |  | C, C, C, C, C and | 
| 2266 |  |  |  |  |  |  | C. | 
| 2267 |  |  |  |  |  |  |  | 
| 2268 |  |  |  |  |  |  | =item $retval = IO::AIO::umount $path, $flags = 0 | 
| 2269 |  |  |  |  |  |  |  | 
| 2270 |  |  |  |  |  |  | Invokes the GNU/Linux C or C syscalls. Always calls | 
| 2271 |  |  |  |  |  |  | C if C<$flags> is C<0>, otherwqise always tries to call | 
| 2272 |  |  |  |  |  |  | C. | 
| 2273 |  |  |  |  |  |  |  | 
| 2274 |  |  |  |  |  |  | The following C<$flags> are available: | 
| 2275 |  |  |  |  |  |  |  | 
| 2276 |  |  |  |  |  |  | C, C, C and C. | 
| 2277 |  |  |  |  |  |  |  | 
| 2278 |  |  |  |  |  |  | =item $numfd = IO::AIO::get_fdlimit | 
| 2279 |  |  |  |  |  |  |  | 
| 2280 |  |  |  |  |  |  | Tries to find the current file descriptor limit and returns it, or | 
| 2281 |  |  |  |  |  |  | C and sets C<$!> in case of an error. The limit is one larger than | 
| 2282 |  |  |  |  |  |  | the highest valid file descriptor number. | 
| 2283 |  |  |  |  |  |  |  | 
| 2284 |  |  |  |  |  |  | =item IO::AIO::min_fdlimit [$numfd] | 
| 2285 |  |  |  |  |  |  |  | 
| 2286 |  |  |  |  |  |  | Try to increase the current file descriptor limit(s) to at least C<$numfd> | 
| 2287 |  |  |  |  |  |  | by changing the soft or hard file descriptor resource limit. If C<$numfd> | 
| 2288 |  |  |  |  |  |  | is missing, it will try to set a very high limit, although this is not | 
| 2289 |  |  |  |  |  |  | recommended when you know the actual minimum that you require. | 
| 2290 |  |  |  |  |  |  |  | 
| 2291 |  |  |  |  |  |  | If the limit cannot be raised enough, the function makes a best-effort | 
| 2292 |  |  |  |  |  |  | attempt to increase the limit as much as possible, using various | 
| 2293 |  |  |  |  |  |  | tricks, while still failing. You can query the resulting limit using | 
| 2294 |  |  |  |  |  |  | C. | 
| 2295 |  |  |  |  |  |  |  | 
| 2296 |  |  |  |  |  |  | If an error occurs, returns C and sets C<$!>, otherwise returns | 
| 2297 |  |  |  |  |  |  | true. | 
| 2298 |  |  |  |  |  |  |  | 
| 2299 |  |  |  |  |  |  | =item IO::AIO::sendfile $ofh, $ifh, $offset, $count | 
| 2300 |  |  |  |  |  |  |  | 
| 2301 |  |  |  |  |  |  | Calls the C function, which is like C, | 
| 2302 |  |  |  |  |  |  | but is blocking (this makes most sense if you know the input data is | 
| 2303 |  |  |  |  |  |  | likely cached already and the output filehandle is set to non-blocking | 
| 2304 |  |  |  |  |  |  | operations). | 
| 2305 |  |  |  |  |  |  |  | 
| 2306 |  |  |  |  |  |  | Returns the number of bytes copied, or C<-1> on error. | 
| 2307 |  |  |  |  |  |  |  | 
| 2308 |  |  |  |  |  |  | =item IO::AIO::fadvise $fh, $offset, $len, $advice | 
| 2309 |  |  |  |  |  |  |  | 
| 2310 |  |  |  |  |  |  | Simply calls the C function (see its | 
| 2311 |  |  |  |  |  |  | manpage for details). The following advice constants are | 
| 2312 |  |  |  |  |  |  | available: C, C, | 
| 2313 |  |  |  |  |  |  | C, C, | 
| 2314 |  |  |  |  |  |  | C, C. | 
| 2315 |  |  |  |  |  |  |  | 
| 2316 |  |  |  |  |  |  | On systems that do not implement C, this function returns | 
| 2317 |  |  |  |  |  |  | ENOSYS, otherwise the return value of C. | 
| 2318 |  |  |  |  |  |  |  | 
| 2319 |  |  |  |  |  |  | =item IO::AIO::madvise $scalar, $offset, $len, $advice | 
| 2320 |  |  |  |  |  |  |  | 
| 2321 |  |  |  |  |  |  | Simply calls the C function (see its | 
| 2322 |  |  |  |  |  |  | manpage for details). The following advice constants are | 
| 2323 |  |  |  |  |  |  | available: C, C, | 
| 2324 |  |  |  |  |  |  | C, C, | 
| 2325 |  |  |  |  |  |  | C. | 
| 2326 |  |  |  |  |  |  |  | 
| 2327 |  |  |  |  |  |  | If C<$offset> is negative, counts from the end. If C<$length> is negative, | 
| 2328 |  |  |  |  |  |  | the remaining length of the C<$scalar> is used. If possible, C<$length> | 
| 2329 |  |  |  |  |  |  | will be reduced to fit into the C<$scalar>. | 
| 2330 |  |  |  |  |  |  |  | 
| 2331 |  |  |  |  |  |  | On systems that do not implement C, this function returns | 
| 2332 |  |  |  |  |  |  | ENOSYS, otherwise the return value of C. | 
| 2333 |  |  |  |  |  |  |  | 
| 2334 |  |  |  |  |  |  | =item IO::AIO::mprotect $scalar, $offset, $len, $protect | 
| 2335 |  |  |  |  |  |  |  | 
| 2336 |  |  |  |  |  |  | Simply calls the C function on the preferably AIO::mmap'ed | 
| 2337 |  |  |  |  |  |  | $scalar (see its manpage for details). The following protect | 
| 2338 |  |  |  |  |  |  | constants are available: C, C, | 
| 2339 |  |  |  |  |  |  | C, C. | 
| 2340 |  |  |  |  |  |  |  | 
| 2341 |  |  |  |  |  |  | If C<$offset> is negative, counts from the end. If C<$length> is negative, | 
| 2342 |  |  |  |  |  |  | the remaining length of the C<$scalar> is used. If possible, C<$length> | 
| 2343 |  |  |  |  |  |  | will be reduced to fit into the C<$scalar>. | 
| 2344 |  |  |  |  |  |  |  | 
| 2345 |  |  |  |  |  |  | On systems that do not implement C, this function returns | 
| 2346 |  |  |  |  |  |  | ENOSYS, otherwise the return value of C. | 
| 2347 |  |  |  |  |  |  |  | 
| 2348 |  |  |  |  |  |  | =item IO::AIO::mmap $scalar, $length, $prot, $flags, $fh[, $offset] | 
| 2349 |  |  |  |  |  |  |  | 
| 2350 |  |  |  |  |  |  | Memory-maps a file (or anonymous memory range) and attaches it to the | 
| 2351 |  |  |  |  |  |  | given C<$scalar>, which will act like a string scalar. Returns true on | 
| 2352 |  |  |  |  |  |  | success, and false otherwise. | 
| 2353 |  |  |  |  |  |  |  | 
| 2354 |  |  |  |  |  |  | The scalar must exist, but its contents do not matter - this means you | 
| 2355 |  |  |  |  |  |  | cannot use a nonexistant array or hash element. When in doubt, C | 
| 2356 |  |  |  |  |  |  | the scalar first. | 
| 2357 |  |  |  |  |  |  |  | 
| 2358 |  |  |  |  |  |  | The only operations allowed on the mmapped scalar are C/C, | 
| 2359 |  |  |  |  |  |  | which don't change the string length, and most read-only operations such | 
| 2360 |  |  |  |  |  |  | as copying it or searching it with regexes and so on. | 
| 2361 |  |  |  |  |  |  |  | 
| 2362 |  |  |  |  |  |  | Anything else is unsafe and will, at best, result in memory leaks. | 
| 2363 |  |  |  |  |  |  |  | 
| 2364 |  |  |  |  |  |  | The memory map associated with the C<$scalar> is automatically removed | 
| 2365 |  |  |  |  |  |  | when the C<$scalar> is undef'd or destroyed, or when the C | 
| 2366 |  |  |  |  |  |  | or C functions are called on it. | 
| 2367 |  |  |  |  |  |  |  | 
| 2368 |  |  |  |  |  |  | This calls the C(2) function internally. See your system's manual | 
| 2369 |  |  |  |  |  |  | page for details on the C<$length>, C<$prot> and C<$flags> parameters. | 
| 2370 |  |  |  |  |  |  |  | 
| 2371 |  |  |  |  |  |  | The C<$length> must be larger than zero and smaller than the actual | 
| 2372 |  |  |  |  |  |  | filesize. | 
| 2373 |  |  |  |  |  |  |  | 
| 2374 |  |  |  |  |  |  | C<$prot> is a combination of C, C, | 
| 2375 |  |  |  |  |  |  | C and/or C, | 
| 2376 |  |  |  |  |  |  |  | 
| 2377 |  |  |  |  |  |  | C<$flags> can be a combination of | 
| 2378 |  |  |  |  |  |  | C or | 
| 2379 |  |  |  |  |  |  | C, | 
| 2380 |  |  |  |  |  |  | or a number of system-specific flags (when not available, the are C<0>): | 
| 2381 |  |  |  |  |  |  | C (which is set to C if your system only provides this constant), | 
| 2382 |  |  |  |  |  |  | C, | 
| 2383 |  |  |  |  |  |  | C, | 
| 2384 |  |  |  |  |  |  | C, | 
| 2385 |  |  |  |  |  |  | C, | 
| 2386 |  |  |  |  |  |  | C, | 
| 2387 |  |  |  |  |  |  | C, | 
| 2388 |  |  |  |  |  |  | C, | 
| 2389 |  |  |  |  |  |  | C, | 
| 2390 |  |  |  |  |  |  | C, | 
| 2391 |  |  |  |  |  |  | C, | 
| 2392 |  |  |  |  |  |  | C, | 
| 2393 |  |  |  |  |  |  | C or | 
| 2394 |  |  |  |  |  |  | C. | 
| 2395 |  |  |  |  |  |  |  | 
| 2396 |  |  |  |  |  |  | If C<$fh> is C, then a file descriptor of C<-1> is passed. | 
| 2397 |  |  |  |  |  |  |  | 
| 2398 |  |  |  |  |  |  | C<$offset> is the offset from the start of the file - it generally must be | 
| 2399 |  |  |  |  |  |  | a multiple of C and defaults to C<0>. | 
| 2400 |  |  |  |  |  |  |  | 
| 2401 |  |  |  |  |  |  | Example: | 
| 2402 |  |  |  |  |  |  |  | 
| 2403 |  |  |  |  |  |  | use Digest::MD5; | 
| 2404 |  |  |  |  |  |  | use IO::AIO; | 
| 2405 |  |  |  |  |  |  |  | 
| 2406 |  |  |  |  |  |  | open my $fh, " | 
| 2407 |  |  |  |  |  |  | or die "$!"; | 
| 2408 |  |  |  |  |  |  |  | 
| 2409 |  |  |  |  |  |  | IO::AIO::mmap my $data, -s $fh, IO::AIO::PROT_READ, IO::AIO::MAP_SHARED, $fh | 
| 2410 |  |  |  |  |  |  | or die "verybigfile: $!"; | 
| 2411 |  |  |  |  |  |  |  | 
| 2412 |  |  |  |  |  |  | my $fast_md5 = md5 $data; | 
| 2413 |  |  |  |  |  |  |  | 
| 2414 |  |  |  |  |  |  | =item IO::AIO::munmap $scalar | 
| 2415 |  |  |  |  |  |  |  | 
| 2416 |  |  |  |  |  |  | Removes a previous mmap and undefines the C<$scalar>. | 
| 2417 |  |  |  |  |  |  |  | 
| 2418 |  |  |  |  |  |  | =item IO::AIO::mremap $scalar, $new_length, $flags = MREMAP_MAYMOVE[, $new_address = 0] | 
| 2419 |  |  |  |  |  |  |  | 
| 2420 |  |  |  |  |  |  | Calls the Linux-specific mremap(2) system call. The C<$scalar> must have | 
| 2421 |  |  |  |  |  |  | been mapped by C, and C<$flags> must currently either be | 
| 2422 |  |  |  |  |  |  | C<0> or C. | 
| 2423 |  |  |  |  |  |  |  | 
| 2424 |  |  |  |  |  |  | Returns true if successful, and false otherwise. If the underlying mmapped | 
| 2425 |  |  |  |  |  |  | region has changed address, then the true value has the numerical value | 
| 2426 |  |  |  |  |  |  | C<1>, otherwise it has the numerical value C<0>: | 
| 2427 |  |  |  |  |  |  |  | 
| 2428 |  |  |  |  |  |  | my $success = IO::AIO::mremap $mmapped, 8192, IO::AIO::MREMAP_MAYMOVE | 
| 2429 |  |  |  |  |  |  | or die "mremap: $!"; | 
| 2430 |  |  |  |  |  |  |  | 
| 2431 |  |  |  |  |  |  | if ($success*1) { | 
| 2432 |  |  |  |  |  |  | warn "scalar has chanegd address in memory\n"; | 
| 2433 |  |  |  |  |  |  | } | 
| 2434 |  |  |  |  |  |  |  | 
| 2435 |  |  |  |  |  |  | C and the C<$new_address> argument are currently | 
| 2436 |  |  |  |  |  |  | implemented, but not supported and might go away in a future version. | 
| 2437 |  |  |  |  |  |  |  | 
| 2438 |  |  |  |  |  |  | On systems where this call is not supported or is not emulated, this call | 
| 2439 |  |  |  |  |  |  | returns falls and sets C<$!> to C. | 
| 2440 |  |  |  |  |  |  |  | 
| 2441 |  |  |  |  |  |  | =item IO::AIO::mlockall $flags | 
| 2442 |  |  |  |  |  |  |  | 
| 2443 |  |  |  |  |  |  | Calls the C function, which is like C, | 
| 2444 |  |  |  |  |  |  | but is blocking. | 
| 2445 |  |  |  |  |  |  |  | 
| 2446 |  |  |  |  |  |  | =item IO::AIO::munlock $scalar, $offset = 0, $length = undef | 
| 2447 |  |  |  |  |  |  |  | 
| 2448 |  |  |  |  |  |  | Calls the C function, undoing the effects of a previous | 
| 2449 |  |  |  |  |  |  | C call (see its description for details). | 
| 2450 |  |  |  |  |  |  |  | 
| 2451 |  |  |  |  |  |  | =item IO::AIO::munlockall | 
| 2452 |  |  |  |  |  |  |  | 
| 2453 |  |  |  |  |  |  | Calls the C function. | 
| 2454 |  |  |  |  |  |  |  | 
| 2455 |  |  |  |  |  |  | On systems that do not implement C, this function returns | 
| 2456 |  |  |  |  |  |  | ENOSYS, otherwise the return value of C. | 
| 2457 |  |  |  |  |  |  |  | 
| 2458 |  |  |  |  |  |  | =item $fh = IO::AIO::accept4 $r_fh, $sockaddr, $sockaddr_maxlen, $flags | 
| 2459 |  |  |  |  |  |  |  | 
| 2460 |  |  |  |  |  |  | Uses the GNU/Linux C syscall, if available, to accept a socket | 
| 2461 |  |  |  |  |  |  | and return the new file handle on success, or sets C<$!> and returns | 
| 2462 |  |  |  |  |  |  | C on error. | 
| 2463 |  |  |  |  |  |  |  | 
| 2464 |  |  |  |  |  |  | The remote name of the new socket will be stored in C<$sockaddr>, which | 
| 2465 |  |  |  |  |  |  | will be extended to allow for at least C<$sockaddr_maxlen> octets. If the | 
| 2466 |  |  |  |  |  |  | socket name does not fit into C<$sockaddr_maxlen> octets, this is signaled | 
| 2467 |  |  |  |  |  |  | by returning a longer string in C<$sockaddr>, which might or might not be | 
| 2468 |  |  |  |  |  |  | truncated. | 
| 2469 |  |  |  |  |  |  |  | 
| 2470 |  |  |  |  |  |  | To accept name-less sockets, use C for C<$sockaddr> and C<0> for | 
| 2471 |  |  |  |  |  |  | C<$sockaddr_maxlen>. | 
| 2472 |  |  |  |  |  |  |  | 
| 2473 |  |  |  |  |  |  | The main reasons to use this syscall rather than portable C | 
| 2474 |  |  |  |  |  |  | are that you can specify C and/or C | 
| 2475 |  |  |  |  |  |  | flags and you can accept name-less sockets by specifying C<0> for | 
| 2476 |  |  |  |  |  |  | C<$sockaddr_maxlen>, which is sadly not possible with perl's interface to | 
| 2477 |  |  |  |  |  |  | C. | 
| 2478 |  |  |  |  |  |  |  | 
| 2479 |  |  |  |  |  |  | =item IO::AIO::splice $r_fh, $r_off, $w_fh, $w_off, $length, $flags | 
| 2480 |  |  |  |  |  |  |  | 
| 2481 |  |  |  |  |  |  | Calls the GNU/Linux C syscall, if available. If C<$r_off> or | 
| 2482 |  |  |  |  |  |  | C<$w_off> are C, then C is passed for these, otherwise they | 
| 2483 |  |  |  |  |  |  | should be the file offset. | 
| 2484 |  |  |  |  |  |  |  | 
| 2485 |  |  |  |  |  |  | C<$r_fh> and C<$w_fh> should not refer to the same file, as splice might | 
| 2486 |  |  |  |  |  |  | silently corrupt the data in this case. | 
| 2487 |  |  |  |  |  |  |  | 
| 2488 |  |  |  |  |  |  | The following symbol flag values are available: C, | 
| 2489 |  |  |  |  |  |  | C, C and | 
| 2490 |  |  |  |  |  |  | C. | 
| 2491 |  |  |  |  |  |  |  | 
| 2492 |  |  |  |  |  |  | See the C manpage for details. | 
| 2493 |  |  |  |  |  |  |  | 
| 2494 |  |  |  |  |  |  | =item IO::AIO::tee $r_fh, $w_fh, $length, $flags | 
| 2495 |  |  |  |  |  |  |  | 
| 2496 |  |  |  |  |  |  | Calls the GNU/Linux C syscall, see its manpage and the | 
| 2497 |  |  |  |  |  |  | description for C above for details. | 
| 2498 |  |  |  |  |  |  |  | 
| 2499 |  |  |  |  |  |  | =item $actual_size = IO::AIO::pipesize $r_fh[, $new_size] | 
| 2500 |  |  |  |  |  |  |  | 
| 2501 |  |  |  |  |  |  | Attempts to query or change the pipe buffer size. Obviously works only | 
| 2502 |  |  |  |  |  |  | on pipes, and currently works only on GNU/Linux systems, and fails with | 
| 2503 |  |  |  |  |  |  | C<-1>/C everywhere else. If anybody knows how to influence pipe buffer | 
| 2504 |  |  |  |  |  |  | size on other systems, drop me a note. | 
| 2505 |  |  |  |  |  |  |  | 
| 2506 |  |  |  |  |  |  | =item ($rfh, $wfh) = IO::AIO::pipe2 [$flags] | 
| 2507 |  |  |  |  |  |  |  | 
| 2508 |  |  |  |  |  |  | This is a direct interface to the Linux L system call. If | 
| 2509 |  |  |  |  |  |  | C<$flags> is missing or C<0>, then this should be the same as a call to | 
| 2510 |  |  |  |  |  |  | perl's built-in C function and create a new pipe, and works on | 
| 2511 |  |  |  |  |  |  | systems that lack the pipe2 syscall. On win32, this case invokes C<_pipe | 
| 2512 |  |  |  |  |  |  | (..., 4096, O_BINARY)>. | 
| 2513 |  |  |  |  |  |  |  | 
| 2514 |  |  |  |  |  |  | If C<$flags> is non-zero, it tries to invoke the pipe2 system call with | 
| 2515 |  |  |  |  |  |  | the given flags (Linux 2.6.27, glibc 2.9). | 
| 2516 |  |  |  |  |  |  |  | 
| 2517 |  |  |  |  |  |  | On success, the read and write file handles are returned. | 
| 2518 |  |  |  |  |  |  |  | 
| 2519 |  |  |  |  |  |  | On error, nothing will be returned. If the pipe2 syscall is missing and | 
| 2520 |  |  |  |  |  |  | C<$flags> is non-zero, fails with C. | 
| 2521 |  |  |  |  |  |  |  | 
| 2522 |  |  |  |  |  |  | Please refer to L for more info on the C<$flags>, but at the | 
| 2523 |  |  |  |  |  |  | time of this writing, C, C and | 
| 2524 |  |  |  |  |  |  | C (Linux 3.4, for packet-based pipes) were supported. | 
| 2525 |  |  |  |  |  |  |  | 
| 2526 |  |  |  |  |  |  | Example: create a pipe race-free w.r.t. threads and fork: | 
| 2527 |  |  |  |  |  |  |  | 
| 2528 |  |  |  |  |  |  | my ($rfh, $wfh) = IO::AIO::pipe2 IO::AIO::O_CLOEXEC | 
| 2529 |  |  |  |  |  |  | or die "pipe2: $!\n"; | 
| 2530 |  |  |  |  |  |  |  | 
| 2531 |  |  |  |  |  |  | =item $fh = IO::AIO::memfd_create $pathname[, $flags] | 
| 2532 |  |  |  |  |  |  |  | 
| 2533 |  |  |  |  |  |  | This is a direct interface to the Linux L system | 
| 2534 |  |  |  |  |  |  | call. The (unhelpful) default for C<$flags> is C<0>, but your default | 
| 2535 |  |  |  |  |  |  | should be C. | 
| 2536 |  |  |  |  |  |  |  | 
| 2537 |  |  |  |  |  |  | On success, the new memfd filehandle is returned, otherwise returns | 
| 2538 |  |  |  |  |  |  | C. If the memfd_create syscall is missing, fails with C. | 
| 2539 |  |  |  |  |  |  |  | 
| 2540 |  |  |  |  |  |  | Please refer to L for more info on this call. | 
| 2541 |  |  |  |  |  |  |  | 
| 2542 |  |  |  |  |  |  | The following C<$flags> values are available: C, | 
| 2543 |  |  |  |  |  |  | C, C, | 
| 2544 |  |  |  |  |  |  | C and C. | 
| 2545 |  |  |  |  |  |  |  | 
| 2546 |  |  |  |  |  |  | Example: create a new memfd. | 
| 2547 |  |  |  |  |  |  |  | 
| 2548 |  |  |  |  |  |  | my $fh = IO::AIO::memfd_create "somenameforprocfd", IO::AIO::MFD_CLOEXEC | 
| 2549 |  |  |  |  |  |  | or die "memfd_create: $!\n"; | 
| 2550 |  |  |  |  |  |  |  | 
| 2551 |  |  |  |  |  |  | =item $fh = IO::AIO::pidfd_open $pid[, $flags] | 
| 2552 |  |  |  |  |  |  |  | 
| 2553 |  |  |  |  |  |  | This is an interface to the Linux L system call. The | 
| 2554 |  |  |  |  |  |  | default for C<$flags> is C<0>. | 
| 2555 |  |  |  |  |  |  |  | 
| 2556 |  |  |  |  |  |  | On success, a new pidfd filehandle is returned (that is already set to | 
| 2557 |  |  |  |  |  |  | close-on-exec), otherwise returns C. If the syscall is missing, | 
| 2558 |  |  |  |  |  |  | fails with C. | 
| 2559 |  |  |  |  |  |  |  | 
| 2560 |  |  |  |  |  |  | Example: open pid 6341 as pidfd. | 
| 2561 |  |  |  |  |  |  |  | 
| 2562 |  |  |  |  |  |  | my $fh = IO::AIO::pidfd_open 6341 | 
| 2563 |  |  |  |  |  |  | or die "pidfd_open: $!\n"; | 
| 2564 |  |  |  |  |  |  |  | 
| 2565 |  |  |  |  |  |  | =item $status = IO::AIO::pidfd_send_signal $pidfh, $signal[, $siginfo[, $flags]] | 
| 2566 |  |  |  |  |  |  |  | 
| 2567 |  |  |  |  |  |  | This is an interface to the Linux L system call. The | 
| 2568 |  |  |  |  |  |  | default for C<$siginfo> is C and the default for C<$flags> is C<0>. | 
| 2569 |  |  |  |  |  |  |  | 
| 2570 |  |  |  |  |  |  | Returns the system call status.  If the syscall is missing, fails with | 
| 2571 |  |  |  |  |  |  | C. | 
| 2572 |  |  |  |  |  |  |  | 
| 2573 |  |  |  |  |  |  | When specified, C<$siginfo> must be a reference to a hash with one or more | 
| 2574 |  |  |  |  |  |  | of the following members: | 
| 2575 |  |  |  |  |  |  |  | 
| 2576 |  |  |  |  |  |  | =over | 
| 2577 |  |  |  |  |  |  |  | 
| 2578 |  |  |  |  |  |  | =item code - the C member | 
| 2579 |  |  |  |  |  |  |  | 
| 2580 |  |  |  |  |  |  | =item pid - the C member | 
| 2581 |  |  |  |  |  |  |  | 
| 2582 |  |  |  |  |  |  | =item uid - the C member | 
| 2583 |  |  |  |  |  |  |  | 
| 2584 |  |  |  |  |  |  | =item value_int - the C member | 
| 2585 |  |  |  |  |  |  |  | 
| 2586 |  |  |  |  |  |  | =item value_ptr - the C member, specified as an integer | 
| 2587 |  |  |  |  |  |  |  | 
| 2588 |  |  |  |  |  |  | =back | 
| 2589 |  |  |  |  |  |  |  | 
| 2590 |  |  |  |  |  |  | Example: send a SIGKILL to the specified process. | 
| 2591 |  |  |  |  |  |  |  | 
| 2592 |  |  |  |  |  |  | my $status = IO::AIO::pidfd_send_signal $pidfh, 9, undef | 
| 2593 |  |  |  |  |  |  | and die "pidfd_send_signal: $!\n"; | 
| 2594 |  |  |  |  |  |  |  | 
| 2595 |  |  |  |  |  |  | Example: send a SIGKILL to the specified process with extra data. | 
| 2596 |  |  |  |  |  |  |  | 
| 2597 |  |  |  |  |  |  | my $status = IO::AIO::pidfd_send_signal $pidfh, 9,  { code => -1, value_int => 7 } | 
| 2598 |  |  |  |  |  |  | and die "pidfd_send_signal: $!\n"; | 
| 2599 |  |  |  |  |  |  |  | 
| 2600 |  |  |  |  |  |  | =item $fh = IO::AIO::pidfd_getfd $pidfh, $targetfd[, $flags] | 
| 2601 |  |  |  |  |  |  |  | 
| 2602 |  |  |  |  |  |  | This is an interface to the Linux L system call. The default | 
| 2603 |  |  |  |  |  |  | for C<$flags> is C<0>. | 
| 2604 |  |  |  |  |  |  |  | 
| 2605 |  |  |  |  |  |  | On success, returns a dup'ed copy of the target file descriptor (specified | 
| 2606 |  |  |  |  |  |  | as an integer) returned (that is already set to close-on-exec), otherwise | 
| 2607 |  |  |  |  |  |  | returns C. If the syscall is missing, fails with C. | 
| 2608 |  |  |  |  |  |  |  | 
| 2609 |  |  |  |  |  |  | Example: get a copy of standard error of another process and print soemthing to it. | 
| 2610 |  |  |  |  |  |  |  | 
| 2611 |  |  |  |  |  |  | my $errfh = IO::AIO::pidfd_getfd $pidfh, 2 | 
| 2612 |  |  |  |  |  |  | or die "pidfd_getfd: $!\n"; | 
| 2613 |  |  |  |  |  |  | print $errfh "stderr\n"; | 
| 2614 |  |  |  |  |  |  |  | 
| 2615 |  |  |  |  |  |  | =item $fh = IO::AIO::eventfd [$initval, [$flags]] | 
| 2616 |  |  |  |  |  |  |  | 
| 2617 |  |  |  |  |  |  | This is a direct interface to the Linux L system call. The | 
| 2618 |  |  |  |  |  |  | (unhelpful) defaults for C<$initval> and C<$flags> are C<0> for both. | 
| 2619 |  |  |  |  |  |  |  | 
| 2620 |  |  |  |  |  |  | On success, the new eventfd filehandle is returned, otherwise returns | 
| 2621 |  |  |  |  |  |  | C. If the eventfd syscall is missing, fails with C. | 
| 2622 |  |  |  |  |  |  |  | 
| 2623 |  |  |  |  |  |  | Please refer to L for more info on this call. | 
| 2624 |  |  |  |  |  |  |  | 
| 2625 |  |  |  |  |  |  | The following symbol flag values are available: C, | 
| 2626 |  |  |  |  |  |  | C and C (Linux 2.6.30). | 
| 2627 |  |  |  |  |  |  |  | 
| 2628 |  |  |  |  |  |  | Example: create a new eventfd filehandle: | 
| 2629 |  |  |  |  |  |  |  | 
| 2630 |  |  |  |  |  |  | $fh = IO::AIO::eventfd 0, IO::AIO::EFD_CLOEXEC | 
| 2631 |  |  |  |  |  |  | or die "eventfd: $!\n"; | 
| 2632 |  |  |  |  |  |  |  | 
| 2633 |  |  |  |  |  |  | =item $fh = IO::AIO::timerfd_create $clockid[, $flags] | 
| 2634 |  |  |  |  |  |  |  | 
| 2635 |  |  |  |  |  |  | This is a direct interface to the Linux L system | 
| 2636 |  |  |  |  |  |  | call. The (unhelpful) default for C<$flags> is C<0>, but your default | 
| 2637 |  |  |  |  |  |  | should be C. | 
| 2638 |  |  |  |  |  |  |  | 
| 2639 |  |  |  |  |  |  | On success, the new timerfd filehandle is returned, otherwise returns | 
| 2640 |  |  |  |  |  |  | C. If the timerfd_create syscall is missing, fails with C. | 
| 2641 |  |  |  |  |  |  |  | 
| 2642 |  |  |  |  |  |  | Please refer to L for more info on this call. | 
| 2643 |  |  |  |  |  |  |  | 
| 2644 |  |  |  |  |  |  | The following C<$clockid> values are | 
| 2645 |  |  |  |  |  |  | available: C, C | 
| 2646 |  |  |  |  |  |  | C (Linux 3.15) | 
| 2647 |  |  |  |  |  |  | C (Linux 3.11) and | 
| 2648 |  |  |  |  |  |  | C (Linux 3.11). | 
| 2649 |  |  |  |  |  |  |  | 
| 2650 |  |  |  |  |  |  | The following C<$flags> values are available (Linux | 
| 2651 |  |  |  |  |  |  | 2.6.27): C and C. | 
| 2652 |  |  |  |  |  |  |  | 
| 2653 |  |  |  |  |  |  | Example: create a new timerfd and set it to one-second repeated alarms, | 
| 2654 |  |  |  |  |  |  | then wait for two alarms: | 
| 2655 |  |  |  |  |  |  |  | 
| 2656 |  |  |  |  |  |  | my $fh = IO::AIO::timerfd_create IO::AIO::CLOCK_BOOTTIME, IO::AIO::TFD_CLOEXEC | 
| 2657 |  |  |  |  |  |  | or die "timerfd_create: $!\n"; | 
| 2658 |  |  |  |  |  |  |  | 
| 2659 |  |  |  |  |  |  | defined IO::AIO::timerfd_settime $fh, 0, 1, 1 | 
| 2660 |  |  |  |  |  |  | or die "timerfd_settime: $!\n"; | 
| 2661 |  |  |  |  |  |  |  | 
| 2662 |  |  |  |  |  |  | for (1..2) { | 
| 2663 |  |  |  |  |  |  | 8 == sysread $fh, my $buf, 8 | 
| 2664 |  |  |  |  |  |  | or die "timerfd read failure\n"; | 
| 2665 |  |  |  |  |  |  |  | 
| 2666 |  |  |  |  |  |  | printf "number of expirations (likely 1): %d\n", | 
| 2667 |  |  |  |  |  |  | unpack "Q", $buf; | 
| 2668 |  |  |  |  |  |  | } | 
| 2669 |  |  |  |  |  |  |  | 
| 2670 |  |  |  |  |  |  | =item ($cur_interval, $cur_value) = IO::AIO::timerfd_settime $fh, $flags, $new_interval, $nbw_value | 
| 2671 |  |  |  |  |  |  |  | 
| 2672 |  |  |  |  |  |  | This is a direct interface to the Linux L system | 
| 2673 |  |  |  |  |  |  | call. Please refer to its manpage for more info on this call. | 
| 2674 |  |  |  |  |  |  |  | 
| 2675 |  |  |  |  |  |  | The new itimerspec is specified using two (possibly fractional) second | 
| 2676 |  |  |  |  |  |  | values, C<$new_interval> and C<$new_value>). | 
| 2677 |  |  |  |  |  |  |  | 
| 2678 |  |  |  |  |  |  | On success, the current interval and value are returned (as per | 
| 2679 |  |  |  |  |  |  | C). On failure, the empty list is returned. | 
| 2680 |  |  |  |  |  |  |  | 
| 2681 |  |  |  |  |  |  | The following C<$flags> values are | 
| 2682 |  |  |  |  |  |  | available: C and | 
| 2683 |  |  |  |  |  |  | C. | 
| 2684 |  |  |  |  |  |  |  | 
| 2685 |  |  |  |  |  |  | See C for a full example. | 
| 2686 |  |  |  |  |  |  |  | 
| 2687 |  |  |  |  |  |  | =item ($cur_interval, $cur_value) = IO::AIO::timerfd_gettime $fh | 
| 2688 |  |  |  |  |  |  |  | 
| 2689 |  |  |  |  |  |  | This is a direct interface to the Linux L system | 
| 2690 |  |  |  |  |  |  | call. Please refer to its manpage for more info on this call. | 
| 2691 |  |  |  |  |  |  |  | 
| 2692 |  |  |  |  |  |  | On success, returns the current values of interval and value for the given | 
| 2693 |  |  |  |  |  |  | timerfd (as potentially fractional second values). On failure, the empty | 
| 2694 |  |  |  |  |  |  | list is returned. | 
| 2695 |  |  |  |  |  |  |  | 
| 2696 |  |  |  |  |  |  | =back | 
| 2697 |  |  |  |  |  |  |  | 
| 2698 |  |  |  |  |  |  | =cut | 
| 2699 |  |  |  |  |  |  |  | 
| 2700 |  |  |  |  |  |  | min_parallel 8; | 
| 2701 |  |  |  |  |  |  |  | 
| 2702 | 9 |  |  | 9 |  | 1008581 | END { flush } | 
| 2703 |  |  |  |  |  |  |  | 
| 2704 |  |  |  |  |  |  | 1; | 
| 2705 |  |  |  |  |  |  |  | 
| 2706 |  |  |  |  |  |  | =head1 EVENT LOOP INTEGRATION | 
| 2707 |  |  |  |  |  |  |  | 
| 2708 |  |  |  |  |  |  | It is recommended to use L to integrate IO::AIO | 
| 2709 |  |  |  |  |  |  | automatically into many event loops: | 
| 2710 |  |  |  |  |  |  |  | 
| 2711 |  |  |  |  |  |  | # AnyEvent integration (EV, Event, Glib, Tk, POE, urxvt, pureperl...) | 
| 2712 |  |  |  |  |  |  | use AnyEvent::AIO; | 
| 2713 |  |  |  |  |  |  |  | 
| 2714 |  |  |  |  |  |  | You can also integrate IO::AIO manually into many event loops, here are | 
| 2715 |  |  |  |  |  |  | some examples of how to do this: | 
| 2716 |  |  |  |  |  |  |  | 
| 2717 |  |  |  |  |  |  | # EV integration | 
| 2718 |  |  |  |  |  |  | my $aio_w = EV::io IO::AIO::poll_fileno, EV::READ, \&IO::AIO::poll_cb; | 
| 2719 |  |  |  |  |  |  |  | 
| 2720 |  |  |  |  |  |  | # Event integration | 
| 2721 |  |  |  |  |  |  | Event->io (fd => IO::AIO::poll_fileno, | 
| 2722 |  |  |  |  |  |  | poll => 'r', | 
| 2723 |  |  |  |  |  |  | cb => \&IO::AIO::poll_cb); | 
| 2724 |  |  |  |  |  |  |  | 
| 2725 |  |  |  |  |  |  | # Glib/Gtk2 integration | 
| 2726 |  |  |  |  |  |  | add_watch Glib::IO IO::AIO::poll_fileno, | 
| 2727 |  |  |  |  |  |  | in => sub { IO::AIO::poll_cb; 1 }; | 
| 2728 |  |  |  |  |  |  |  | 
| 2729 |  |  |  |  |  |  | # Tk integration | 
| 2730 |  |  |  |  |  |  | Tk::Event::IO->fileevent (IO::AIO::poll_fileno, "", | 
| 2731 |  |  |  |  |  |  | readable => \&IO::AIO::poll_cb); | 
| 2732 |  |  |  |  |  |  |  | 
| 2733 |  |  |  |  |  |  | # Danga::Socket integration | 
| 2734 |  |  |  |  |  |  | Danga::Socket->AddOtherFds (IO::AIO::poll_fileno => | 
| 2735 |  |  |  |  |  |  | \&IO::AIO::poll_cb); | 
| 2736 |  |  |  |  |  |  |  | 
| 2737 |  |  |  |  |  |  | =head2 FORK BEHAVIOUR | 
| 2738 |  |  |  |  |  |  |  | 
| 2739 |  |  |  |  |  |  | Usage of pthreads in a program changes the semantics of fork | 
| 2740 |  |  |  |  |  |  | considerably. Specifically, only async-safe functions can be called after | 
| 2741 |  |  |  |  |  |  | fork. Perl doesn't know about this, so in general, you cannot call fork | 
| 2742 |  |  |  |  |  |  | with defined behaviour in perl if pthreads are involved. IO::AIO uses | 
| 2743 |  |  |  |  |  |  | pthreads, so this applies, but many other extensions and (for inexplicable | 
| 2744 |  |  |  |  |  |  | reasons) perl itself often is linked against pthreads, so this limitation | 
| 2745 |  |  |  |  |  |  | applies to quite a lot of perls. | 
| 2746 |  |  |  |  |  |  |  | 
| 2747 |  |  |  |  |  |  | This module no longer tries to fight your OS, or POSIX. That means IO::AIO | 
| 2748 |  |  |  |  |  |  | only works in the process that loaded it. Forking is fully supported, but | 
| 2749 |  |  |  |  |  |  | using IO::AIO in the child is not. | 
| 2750 |  |  |  |  |  |  |  | 
| 2751 |  |  |  |  |  |  | You might get around by not I IO::AIO before (or after) | 
| 2752 |  |  |  |  |  |  | forking. You could also try to call the L function in the | 
| 2753 |  |  |  |  |  |  | child: | 
| 2754 |  |  |  |  |  |  |  | 
| 2755 |  |  |  |  |  |  | =over 4 | 
| 2756 |  |  |  |  |  |  |  | 
| 2757 |  |  |  |  |  |  | =item IO::AIO::reinit | 
| 2758 |  |  |  |  |  |  |  | 
| 2759 |  |  |  |  |  |  | Abandons all current requests and I/O threads and simply reinitialises all | 
| 2760 |  |  |  |  |  |  | data structures. This is not an operation supported by any standards, but | 
| 2761 |  |  |  |  |  |  | happens to work on GNU/Linux and some newer BSD systems. | 
| 2762 |  |  |  |  |  |  |  | 
| 2763 |  |  |  |  |  |  | The only reasonable use for this function is to call it after forking, if | 
| 2764 |  |  |  |  |  |  | C was used in the parent. Calling it while IO::AIO is active in | 
| 2765 |  |  |  |  |  |  | the process will result in undefined behaviour. Calling it at any time | 
| 2766 |  |  |  |  |  |  | will also result in any undefined (by POSIX) behaviour. | 
| 2767 |  |  |  |  |  |  |  | 
| 2768 |  |  |  |  |  |  | =back | 
| 2769 |  |  |  |  |  |  |  | 
| 2770 |  |  |  |  |  |  | =head2 LINUX-SPECIFIC CALLS | 
| 2771 |  |  |  |  |  |  |  | 
| 2772 |  |  |  |  |  |  | When a call is documented as "linux-specific" then this means it | 
| 2773 |  |  |  |  |  |  | originated on GNU/Linux. C will usually try to autodetect the | 
| 2774 |  |  |  |  |  |  | availability and compatibility of such calls regardless of the platform | 
| 2775 |  |  |  |  |  |  | it is compiled on, so platforms such as FreeBSD which often implement | 
| 2776 |  |  |  |  |  |  | these calls will work. When in doubt, call them and see if they fail wth | 
| 2777 |  |  |  |  |  |  | C. | 
| 2778 |  |  |  |  |  |  |  | 
| 2779 |  |  |  |  |  |  | =head2 MEMORY USAGE | 
| 2780 |  |  |  |  |  |  |  | 
| 2781 |  |  |  |  |  |  | Per-request usage: | 
| 2782 |  |  |  |  |  |  |  | 
| 2783 |  |  |  |  |  |  | Each aio request uses - depending on your architecture - around 100-200 | 
| 2784 |  |  |  |  |  |  | bytes of memory. In addition, stat requests need a stat buffer (possibly | 
| 2785 |  |  |  |  |  |  | a few hundred bytes), readdir requires a result buffer and so on. Perl | 
| 2786 |  |  |  |  |  |  | scalars and other data passed into aio requests will also be locked and | 
| 2787 |  |  |  |  |  |  | will consume memory till the request has entered the done state. | 
| 2788 |  |  |  |  |  |  |  | 
| 2789 |  |  |  |  |  |  | This is not awfully much, so queuing lots of requests is not usually a | 
| 2790 |  |  |  |  |  |  | problem. | 
| 2791 |  |  |  |  |  |  |  | 
| 2792 |  |  |  |  |  |  | Per-thread usage: | 
| 2793 |  |  |  |  |  |  |  | 
| 2794 |  |  |  |  |  |  | In the execution phase, some aio requests require more memory for | 
| 2795 |  |  |  |  |  |  | temporary buffers, and each thread requires a stack and other data | 
| 2796 |  |  |  |  |  |  | structures (usually around 16k-128k, depending on the OS). | 
| 2797 |  |  |  |  |  |  |  | 
| 2798 |  |  |  |  |  |  | =head1 KNOWN BUGS | 
| 2799 |  |  |  |  |  |  |  | 
| 2800 |  |  |  |  |  |  | Known bugs will be fixed in the next release :) | 
| 2801 |  |  |  |  |  |  |  | 
| 2802 |  |  |  |  |  |  | =head1 KNOWN ISSUES | 
| 2803 |  |  |  |  |  |  |  | 
| 2804 |  |  |  |  |  |  | Calls that try to "import" foreign memory areas (such as C | 
| 2805 |  |  |  |  |  |  | or C) do not work with generic lvalues, such as | 
| 2806 |  |  |  |  |  |  | non-created hash slots or other scalars I didn't think of. It's best to | 
| 2807 |  |  |  |  |  |  | avoid such and either use scalar variables or making sure that the scalar | 
| 2808 |  |  |  |  |  |  | exists (e.g. by storing C) and isn't "funny" (e.g. tied). | 
| 2809 |  |  |  |  |  |  |  | 
| 2810 |  |  |  |  |  |  | I am not sure anything can be done about this, so this is considered a | 
| 2811 |  |  |  |  |  |  | known issue, rather than a bug. | 
| 2812 |  |  |  |  |  |  |  | 
| 2813 |  |  |  |  |  |  | =head1 SEE ALSO | 
| 2814 |  |  |  |  |  |  |  | 
| 2815 |  |  |  |  |  |  | L for easy integration into event loops, L for a | 
| 2816 |  |  |  |  |  |  | more natural syntax and L for file descriptor passing. | 
| 2817 |  |  |  |  |  |  |  | 
| 2818 |  |  |  |  |  |  | =head1 AUTHOR | 
| 2819 |  |  |  |  |  |  |  | 
| 2820 |  |  |  |  |  |  | Marc Lehmann | 
| 2821 |  |  |  |  |  |  | http://home.schmorp.de/ | 
| 2822 |  |  |  |  |  |  |  | 
| 2823 |  |  |  |  |  |  | =cut | 
| 2824 |  |  |  |  |  |  |  |