… | |
… | |
171 | use common::sense; |
171 | use common::sense; |
172 | |
172 | |
173 | use base 'Exporter'; |
173 | use base 'Exporter'; |
174 | |
174 | |
175 | BEGIN { |
175 | BEGIN { |
176 | our $VERSION = 4.71; |
176 | our $VERSION = 4.72; |
177 | |
177 | |
178 | our @AIO_REQ = qw(aio_sendfile aio_seek aio_read aio_write aio_open aio_close |
178 | 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 |
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 |
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 |
181 | aio_sync aio_fsync aio_syncfs aio_fdatasync aio_sync_file_range |
… | |
… | |
278 | IO::AIO::idle_timeout $seconds |
278 | IO::AIO::idle_timeout $seconds |
279 | IO::AIO::max_outstanding $maxreqs |
279 | IO::AIO::max_outstanding $maxreqs |
280 | IO::AIO::nreqs |
280 | IO::AIO::nreqs |
281 | IO::AIO::nready |
281 | IO::AIO::nready |
282 | IO::AIO::npending |
282 | IO::AIO::npending |
|
|
283 | IO::AIO::reinit |
|
|
284 | |
283 | $nfd = IO::AIO::get_fdlimit [EXPERIMENTAL] |
285 | $nfd = IO::AIO::get_fdlimit [EXPERIMENTAL] |
284 | IO::AIO::min_fdlimit $nfd [EXPERIMENTAL] |
286 | IO::AIO::min_fdlimit $nfd [EXPERIMENTAL] |
285 | |
287 | |
286 | IO::AIO::sendfile $ofh, $ifh, $offset, $count |
288 | IO::AIO::sendfile $ofh, $ifh, $offset, $count |
287 | IO::AIO::fadvise $fh, $offset, $len, $advice |
289 | IO::AIO::fadvise $fh, $offset, $len, $advice |
|
|
290 | |
288 | IO::AIO::mmap $scalar, $length, $prot, $flags[, $fh[, $offset]] |
291 | IO::AIO::mmap $scalar, $length, $prot, $flags[, $fh[, $offset]] |
289 | IO::AIO::munmap $scalar |
292 | IO::AIO::munmap $scalar |
290 | IO::AIO::mremap $scalar, $new_length, $flags[, $new_address] |
293 | IO::AIO::mremap $scalar, $new_length, $flags[, $new_address] |
291 | IO::AIO::madvise $scalar, $offset, $length, $advice |
294 | IO::AIO::madvise $scalar, $offset, $length, $advice |
292 | IO::AIO::mprotect $scalar, $offset, $length, $protect |
295 | IO::AIO::mprotect $scalar, $offset, $length, $protect |
293 | IO::AIO::munlock $scalar, $offset = 0, $length = undef |
296 | IO::AIO::munlock $scalar, $offset = 0, $length = undef |
294 | IO::AIO::munlockall |
297 | IO::AIO::munlockall |
|
|
298 | |
|
|
299 | # stat extensions |
|
|
300 | $counter = IO::AIO::st_gen |
|
|
301 | $seconds = IO::AIO::st_atime, IO::AIO::st_mtime, IO::AIO::st_ctime, IO::AIO::st_btime |
|
|
302 | ($atime, $mtime, $ctime, $btime, ...) = IO::AIO::st_xtime |
|
|
303 | $nanoseconds = IO::AIO::st_atimensec, IO::AIO::st_mtimensec, IO::AIO::st_ctimensec, IO::AIO::st_btimensec |
|
|
304 | $seconds = IO::AIO::st_btimesec |
|
|
305 | ($atime, $mtime, $ctime, $btime, ...) = IO::AIO::st_xtimensec |
|
|
306 | |
|
|
307 | # very much unportable syscalls |
|
|
308 | IO::AIO::splice $r_fh, $r_off, $w_fh, $w_off, $length, $flags |
|
|
309 | IO::AIO::tee $r_fh, $w_fh, $length, $flags |
|
|
310 | $actual_size = IO::AIO::pipesize $r_fh[, $new_size] |
|
|
311 | ($rfh, $wfh) = IO::AIO::pipe2 [$flags] |
|
|
312 | $fh = IO::AIO::memfd_create $pathname[, $flags] |
|
|
313 | $fh = IO::AIO::eventfd [$initval, [$flags]] |
|
|
314 | $fh = IO::AIO::timerfd_create $clockid[, $flags] |
|
|
315 | ($cur_interval, $cur_value) = IO::AIO::timerfd_settime $fh, $flags, $new_interval, $nbw_value |
|
|
316 | ($cur_interval, $cur_value) = IO::AIO::timerfd_gettime $fh |
295 | |
317 | |
296 | =head2 API NOTES |
318 | =head2 API NOTES |
297 | |
319 | |
298 | All the C<aio_*> calls are more or less thin wrappers around the syscall |
320 | All the C<aio_*> calls are more or less thin wrappers around the syscall |
299 | with the same name (sans C<aio_>). The arguments are similar or identical, |
321 | with the same name (sans C<aio_>). The arguments are similar or identical, |
… | |
… | |
2423 | Example: create a pipe race-free w.r.t. threads and fork: |
2445 | Example: create a pipe race-free w.r.t. threads and fork: |
2424 | |
2446 | |
2425 | my ($rfh, $wfh) = IO::AIO::pipe2 IO::AIO::O_CLOEXEC |
2447 | my ($rfh, $wfh) = IO::AIO::pipe2 IO::AIO::O_CLOEXEC |
2426 | or die "pipe2: $!\n"; |
2448 | or die "pipe2: $!\n"; |
2427 | |
2449 | |
|
|
2450 | =item $fh = IO::AIO::memfd_create $pathname[, $flags] |
|
|
2451 | |
|
|
2452 | This is a direct interface to the Linux L<memfd_create(2)> system |
|
|
2453 | call. The (unhelpful) default for C<$flags> is C<0>, but your default |
|
|
2454 | should be C<IO::AIO::MFD_CLOEXEC>. |
|
|
2455 | |
|
|
2456 | On success, the new memfd filehandle is returned, otherwise returns |
|
|
2457 | C<undef>. If the memfd_create syscall is missing, fails with C<ENOSYS>. |
|
|
2458 | |
|
|
2459 | Please refer to L<memfd_create(2)> for more info on this call. |
|
|
2460 | |
|
|
2461 | The following C<$flags> values are available: C<IO::AIO::MFD_CLOEXEC>, |
|
|
2462 | C<IO::AIO::MFD_ALLOW_SEALING> and C<IO::AIO::MFD_HUGETLB>. |
|
|
2463 | |
|
|
2464 | Example: create a new memfd. |
|
|
2465 | |
|
|
2466 | my $fh = IO::AIO::memfd_create "somenameforprocfd", IO::AIO::MFD_CLOEXEC |
|
|
2467 | or die "m,emfd_create: $!\n"; |
2428 | =item $fh = IO::AIO::eventfd [$initval, [$flags]] |
2468 | =item $fh = IO::AIO::eventfd [$initval, [$flags]] |
2429 | |
2469 | |
2430 | This is a direct interface to the Linux L<eventfd(2)> system call. The |
2470 | This is a direct interface to the Linux L<eventfd(2)> system call. The |
2431 | (unhelpful) defaults for C<$initval> and C<$flags> are C<0> for both. |
2471 | (unhelpful) defaults for C<$initval> and C<$flags> are C<0> for both. |
2432 | |
2472 | |
… | |
… | |
2438 | The following symbol flag values are available: C<IO::AIO::EFD_CLOEXEC>, |
2478 | The following symbol flag values are available: C<IO::AIO::EFD_CLOEXEC>, |
2439 | C<IO::AIO::EFD_NONBLOCK> and C<IO::AIO::EFD_SEMAPHORE> (Linux 2.6.30). |
2479 | C<IO::AIO::EFD_NONBLOCK> and C<IO::AIO::EFD_SEMAPHORE> (Linux 2.6.30). |
2440 | |
2480 | |
2441 | Example: create a new eventfd filehandle: |
2481 | Example: create a new eventfd filehandle: |
2442 | |
2482 | |
2443 | $fh = IO::AIO::eventfd 0, IO::AIO::O_CLOEXEC |
2483 | $fh = IO::AIO::eventfd 0, IO::AIO::EFD_CLOEXEC |
2444 | or die "eventfd: $!\n"; |
2484 | or die "eventfd: $!\n"; |
2445 | |
2485 | |
2446 | =item $fh = IO::AIO::timerfd_create $clockid[, $flags] |
2486 | =item $fh = IO::AIO::timerfd_create $clockid[, $flags] |
2447 | |
2487 | |
2448 | This is a direct interface to the Linux L<timerfd_create(2)> system call. The |
2488 | This is a direct interface to the Linux L<timerfd_create(2)> system |
2449 | (unhelpful) default for C<$flags> is C<0>. |
2489 | call. The (unhelpful) default for C<$flags> is C<0>, but your default |
|
|
2490 | should be C<IO::AIO::TFD_CLOEXEC>. |
2450 | |
2491 | |
2451 | On success, the new timerfd filehandle is returned, otherwise returns |
2492 | On success, the new timerfd filehandle is returned, otherwise returns |
2452 | C<undef>. If the eventfd syscall is missing, fails with C<ENOSYS>. |
2493 | C<undef>. If the timerfd_create syscall is missing, fails with C<ENOSYS>. |
2453 | |
2494 | |
2454 | Please refer to L<timerfd_create(2)> for more info on this call. |
2495 | Please refer to L<timerfd_create(2)> for more info on this call. |
2455 | |
2496 | |
2456 | The following C<$clockid> values are |
2497 | The following C<$clockid> values are |
2457 | available: C<IO::AIO::CLOCK_REALTIME>, C<IO::AIO::CLOCK_MONOTONIC> |
2498 | available: C<IO::AIO::CLOCK_REALTIME>, C<IO::AIO::CLOCK_MONOTONIC> |