… | |
… | |
168 | use common::sense; |
168 | use common::sense; |
169 | |
169 | |
170 | use base 'Exporter'; |
170 | use base 'Exporter'; |
171 | |
171 | |
172 | BEGIN { |
172 | BEGIN { |
173 | our $VERSION = '4.0'; |
173 | our $VERSION = '4.12'; |
174 | |
174 | |
175 | our @AIO_REQ = qw(aio_sendfile aio_read aio_write aio_open aio_close |
175 | our @AIO_REQ = qw(aio_sendfile aio_read aio_write aio_open aio_close |
176 | aio_stat aio_lstat aio_unlink aio_rmdir aio_readdir aio_readdirx |
176 | aio_stat aio_lstat aio_unlink aio_rmdir aio_readdir aio_readdirx |
177 | aio_scandir aio_symlink aio_readlink aio_realpath aio_sync |
177 | aio_scandir aio_symlink aio_readlink aio_realpath aio_sync |
178 | aio_fsync aio_syncfs aio_fdatasync aio_sync_file_range aio_fallocate |
178 | aio_fsync aio_syncfs aio_fdatasync aio_sync_file_range aio_fallocate |
… | |
… | |
233 | aio_rmdir $pathname, $callback->($status) |
233 | aio_rmdir $pathname, $callback->($status) |
234 | aio_readdir $pathname, $callback->($entries) |
234 | aio_readdir $pathname, $callback->($entries) |
235 | aio_readdirx $pathname, $flags, $callback->($entries, $flags) |
235 | aio_readdirx $pathname, $flags, $callback->($entries, $flags) |
236 | IO::AIO::READDIR_DENTS IO::AIO::READDIR_DIRS_FIRST |
236 | IO::AIO::READDIR_DENTS IO::AIO::READDIR_DIRS_FIRST |
237 | IO::AIO::READDIR_STAT_ORDER IO::AIO::READDIR_FOUND_UNKNOWN |
237 | IO::AIO::READDIR_STAT_ORDER IO::AIO::READDIR_FOUND_UNKNOWN |
|
|
238 | aio_scandir $pathname, $maxreq, $callback->($dirs, $nondirs) |
238 | aio_load $pathname, $data, $callback->($status) |
239 | aio_load $pathname, $data, $callback->($status) |
239 | aio_copy $srcpath, $dstpath, $callback->($status) |
240 | aio_copy $srcpath, $dstpath, $callback->($status) |
240 | aio_move $srcpath, $dstpath, $callback->($status) |
241 | aio_move $srcpath, $dstpath, $callback->($status) |
241 | aio_scandir $pathname, $maxreq, $callback->($dirs, $nondirs) |
|
|
242 | aio_rmtree $pathname, $callback->($status) |
242 | aio_rmtree $pathname, $callback->($status) |
243 | aio_sync $callback->($status) |
243 | aio_sync $callback->($status) |
244 | aio_syncfs $fh, $callback->($status) |
244 | aio_syncfs $fh, $callback->($status) |
245 | aio_fsync $fh, $callback->($status) |
245 | aio_fsync $fh, $callback->($status) |
246 | aio_fdatasync $fh, $callback->($status) |
246 | aio_fdatasync $fh, $callback->($status) |
… | |
… | |
276 | IO::AIO::madvise $scalar, $offset, $length, $advice |
276 | IO::AIO::madvise $scalar, $offset, $length, $advice |
277 | IO::AIO::mprotect $scalar, $offset, $length, $protect |
277 | IO::AIO::mprotect $scalar, $offset, $length, $protect |
278 | IO::AIO::munlock $scalar, $offset = 0, $length = undef |
278 | IO::AIO::munlock $scalar, $offset = 0, $length = undef |
279 | IO::AIO::munlockall |
279 | IO::AIO::munlockall |
280 | |
280 | |
281 | =head2 AIO REQUEST FUNCTIONS |
281 | =head2 API NOTES |
282 | |
282 | |
283 | All the C<aio_*> calls are more or less thin wrappers around the syscall |
283 | All the C<aio_*> calls are more or less thin wrappers around the syscall |
284 | with the same name (sans C<aio_>). The arguments are similar or identical, |
284 | with the same name (sans C<aio_>). The arguments are similar or identical, |
285 | and they all accept an additional (and optional) C<$callback> argument |
285 | and they all accept an additional (and optional) C<$callback> argument |
286 | which must be a code reference. This code reference will be called after |
286 | which must be a code reference. This code reference will be called after |
… | |
… | |
316 | unicode filenames or e) use something else to ensure your scalar has the |
316 | unicode filenames or e) use something else to ensure your scalar has the |
317 | correct contents. |
317 | correct contents. |
318 | |
318 | |
319 | This works, btw. independent of the internal UTF-8 bit, which IO::AIO |
319 | This works, btw. independent of the internal UTF-8 bit, which IO::AIO |
320 | handles correctly whether it is set or not. |
320 | handles correctly whether it is set or not. |
|
|
321 | |
|
|
322 | =head2 AIO REQUEST FUNCTIONS |
321 | |
323 | |
322 | =over 4 |
324 | =over 4 |
323 | |
325 | |
324 | =item $prev_pri = aioreq_pri [$pri] |
326 | =item $prev_pri = aioreq_pri [$pri] |
325 | |
327 | |
… | |
… | |
1304 | object. This object stores the canonicalised, absolute version of the |
1306 | object. This object stores the canonicalised, absolute version of the |
1305 | path, and on systems that allow it, also a directory file descriptor. |
1307 | path, and on systems that allow it, also a directory file descriptor. |
1306 | |
1308 | |
1307 | Everywhere where a pathname is accepted by IO::AIO (e.g. in C<aio_stat> |
1309 | Everywhere where a pathname is accepted by IO::AIO (e.g. in C<aio_stat> |
1308 | or C<aio_unlink>), one can specify an array reference with an IO::AIO::WD |
1310 | or C<aio_unlink>), one can specify an array reference with an IO::AIO::WD |
1309 | object and a pathname instead. If the pathname is absolute, the |
1311 | object and a pathname instead (or the IO::AIO::WD object alone, which |
|
|
1312 | gets interpreted as C<[$wd, "."]>). If the pathname is absolute, the |
1310 | IO::AIO::WD objetc is ignored, otherwise the pathname is resolved relative |
1313 | IO::AIO::WD object is ignored, otherwise the pathname is resolved relative |
1311 | to that IO::AIO::WD object. |
1314 | to that IO::AIO::WD object. |
1312 | |
1315 | |
1313 | For example, to get a wd object for F</etc> and then stat F<passwd> |
1316 | For example, to get a wd object for F</etc> and then stat F<passwd> |
1314 | inside, you would write: |
1317 | inside, you would write: |
1315 | |
1318 | |
… | |
… | |
1323 | aio_stat [$etcdir, "passwd"], sub { |
1326 | aio_stat [$etcdir, "passwd"], sub { |
1324 | # yay |
1327 | # yay |
1325 | }; |
1328 | }; |
1326 | }; |
1329 | }; |
1327 | |
1330 | |
1328 | This shows that creating an IO::AIO::WD object is itself a potentially |
1331 | That C<aio_wd> is a request and not a normal function shows that creating |
1329 | blocking operation, which is why it is done asynchronously. |
1332 | an IO::AIO::WD object is itself a potentially blocking operation, which is |
|
|
1333 | why it is done asynchronously. |
|
|
1334 | |
|
|
1335 | To stat the directory obtained with C<aio_wd> above, one could write |
|
|
1336 | either of the following three request calls: |
|
|
1337 | |
|
|
1338 | aio_lstat "/etc" , sub { ... # pathname as normal string |
|
|
1339 | aio_lstat [$wd, "."], sub { ... # "." relative to $wd (i.e. $wd itself) |
|
|
1340 | aio_lstat $wd , sub { ... # shorthand for the previous |
1330 | |
1341 | |
1331 | As with normal pathnames, IO::AIO keeps a copy of the working directory |
1342 | As with normal pathnames, IO::AIO keeps a copy of the working directory |
1332 | object and the pathname string, so you could write the following without |
1343 | object and the pathname string, so you could write the following without |
1333 | causing any issues due to C<$path> getting reused: |
1344 | causing any issues due to C<$path> getting reused: |
1334 | |
1345 | |