… | |
… | |
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.77; |
176 | our $VERSION = 4.80; |
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 |
… | |
… | |
195 | max_poll_time max_poll_reqs |
195 | max_poll_time max_poll_reqs |
196 | sendfile fadvise madvise |
196 | sendfile fadvise madvise |
197 | mmap munmap mremap munlock munlockall |
197 | mmap munmap mremap munlock munlockall |
198 | |
198 | |
199 | accept4 tee splice pipe2 pipesize |
199 | accept4 tee splice pipe2 pipesize |
200 | fexecve memfd_create eventfd |
200 | fexecve mount umount memfd_create eventfd |
201 | timerfd_create timerfd_settime timerfd_gettime |
201 | timerfd_create timerfd_settime timerfd_gettime |
202 | pidfd_open pidfd_send_signal pidfd_getfd); |
202 | pidfd_open pidfd_send_signal pidfd_getfd); |
203 | |
203 | |
204 | push @AIO_REQ, qw(aio_busy); # not exported |
204 | push @AIO_REQ, qw(aio_busy); # not exported |
205 | |
205 | |
… | |
… | |
327 | |
327 | |
328 | $fh = IO::AIO::pidfd_open $pid[, $flags] |
328 | $fh = IO::AIO::pidfd_open $pid[, $flags] |
329 | $status = IO::AIO::pidfd_send_signal $pidfh, $signal[, $siginfo[, $flags]] |
329 | $status = IO::AIO::pidfd_send_signal $pidfh, $signal[, $siginfo[, $flags]] |
330 | $fh = IO::AIO::pidfd_getfd $pidfh, $targetfd[, $flags] |
330 | $fh = IO::AIO::pidfd_getfd $pidfh, $targetfd[, $flags] |
331 | |
331 | |
|
|
332 | $retval = IO::AIO::mount $special, $path, $fstype, $flags = 0, $data = undef |
|
|
333 | $retval = IO::AIO::umount $path, $flags = 0 |
|
|
334 | |
332 | =head2 API NOTES |
335 | =head2 API NOTES |
333 | |
336 | |
334 | All the C<aio_*> calls are more or less thin wrappers around the syscall |
337 | All the C<aio_*> calls are more or less thin wrappers around the syscall |
335 | with the same name (sans C<aio_>). The arguments are similar or identical, |
338 | with the same name (sans C<aio_>). The arguments are similar or identical, |
336 | and they all accept an additional (and optional) C<$callback> argument |
339 | and they all accept an additional (and optional) C<$callback> argument |
… | |
… | |
410 | =item aio_open $pathname, $flags, $mode, $callback->($fh) |
413 | =item aio_open $pathname, $flags, $mode, $callback->($fh) |
411 | |
414 | |
412 | Asynchronously open or create a file and call the callback with a newly |
415 | Asynchronously open or create a file and call the callback with a newly |
413 | created filehandle for the file (or C<undef> in case of an error). |
416 | created filehandle for the file (or C<undef> in case of an error). |
414 | |
417 | |
415 | The pathname passed to C<aio_open> must be absolute. See API NOTES, above, |
|
|
416 | for an explanation. |
|
|
417 | |
|
|
418 | The C<$flags> argument is a bitmask. See the C<Fcntl> module for a |
418 | The C<$flags> argument is a bitmask. See the C<Fcntl> module for a |
419 | list. They are the same as used by C<sysopen>. |
419 | list. They are the same as used by C<sysopen>. |
420 | |
420 | |
421 | Likewise, C<$mode> specifies the mode of the newly created file, if it |
421 | Likewise, C<$mode> specifies the mode of the newly created file, if it |
422 | didn't exist and C<O_CREAT> has been given, just like perl's C<sysopen>, |
422 | didn't exist and C<O_CREAT> has been given, just like perl's C<sysopen>, |
… | |
… | |
581 | |
581 | |
582 | Works almost exactly like perl's C<stat> or C<lstat> in void context. The |
582 | Works almost exactly like perl's C<stat> or C<lstat> in void context. The |
583 | callback will be called after the stat and the results will be available |
583 | callback will be called after the stat and the results will be available |
584 | using C<stat _> or C<-s _> and other tests (with the exception of C<-B> |
584 | using C<stat _> or C<-s _> and other tests (with the exception of C<-B> |
585 | and C<-T>). |
585 | and C<-T>). |
586 | |
|
|
587 | The pathname passed to C<aio_stat> must be absolute. See API NOTES, above, |
|
|
588 | for an explanation. |
|
|
589 | |
586 | |
590 | Currently, the stats are always 64-bit-stats, i.e. instead of returning an |
587 | Currently, the stats are always 64-bit-stats, i.e. instead of returning an |
591 | error when stat'ing a large file, the results will be silently truncated |
588 | error when stat'ing a large file, the results will be silently truncated |
592 | unless perl itself is compiled with large file support. |
589 | unless perl itself is compiled with large file support. |
593 | |
590 | |
… | |
… | |
978 | my @stat = stat $src_fh; # hmm, might block over nfs? |
975 | my @stat = stat $src_fh; # hmm, might block over nfs? |
979 | |
976 | |
980 | aioreq_pri $pri; |
977 | aioreq_pri $pri; |
981 | add $grp aio_open $dst, O_CREAT | O_WRONLY | O_TRUNC, 0200, sub { |
978 | add $grp aio_open $dst, O_CREAT | O_WRONLY | O_TRUNC, 0200, sub { |
982 | if (my $dst_fh = $_[0]) { |
979 | if (my $dst_fh = $_[0]) { |
|
|
980 | |
|
|
981 | # best-effort preallocate |
|
|
982 | aioreq_pri $pri; |
|
|
983 | add $grp aio_allocate $dst_fh, IO::AIO::FALLOC_FL_KEEP_SIZE, 0, $stat[7], sub { }; |
|
|
984 | |
983 | aioreq_pri $pri; |
985 | aioreq_pri $pri; |
984 | add $grp aio_sendfile $dst_fh, $src_fh, 0, $stat[7], sub { |
986 | add $grp aio_sendfile $dst_fh, $src_fh, 0, $stat[7], sub { |
985 | if ($_[0] == $stat[7]) { |
987 | if ($_[0] == $stat[7]) { |
986 | $grp->result (0); |
988 | $grp->result (0); |
987 | close $src_fh; |
989 | close $src_fh; |
… | |
… | |
1351 | C<FS_XFLAG_REALTIME>, C<FS_XFLAG_PREALLOC>, C<FS_XFLAG_IMMUTABLE>, C<FS_XFLAG_APPEND>, |
1353 | C<FS_XFLAG_REALTIME>, C<FS_XFLAG_PREALLOC>, C<FS_XFLAG_IMMUTABLE>, C<FS_XFLAG_APPEND>, |
1352 | C<FS_XFLAG_SYNC>, C<FS_XFLAG_NOATIME>, C<FS_XFLAG_NODUMP>, C<FS_XFLAG_RTINHERIT>, |
1354 | C<FS_XFLAG_SYNC>, C<FS_XFLAG_NOATIME>, C<FS_XFLAG_NODUMP>, C<FS_XFLAG_RTINHERIT>, |
1353 | C<FS_XFLAG_PROJINHERIT>, C<FS_XFLAG_NOSYMLINKS>, C<FS_XFLAG_EXTSIZE>, C<FS_XFLAG_EXTSZINHERIT>, |
1355 | C<FS_XFLAG_PROJINHERIT>, C<FS_XFLAG_NOSYMLINKS>, C<FS_XFLAG_EXTSIZE>, C<FS_XFLAG_EXTSZINHERIT>, |
1354 | C<FS_XFLAG_NODEFRAG>, C<FS_XFLAG_FILESTREAM>, C<FS_XFLAG_DAX>, C<FS_XFLAG_HASATTR>, |
1356 | C<FS_XFLAG_NODEFRAG>, C<FS_XFLAG_FILESTREAM>, C<FS_XFLAG_DAX>, C<FS_XFLAG_HASATTR>, |
1355 | |
1357 | |
|
|
1358 | C<BLKROSET>, C<BLKROGET>, C<BLKRRPART>, C<BLKGETSIZE>, C<BLKFLSBUF>, C<BLKRASET>, |
|
|
1359 | C<BLKRAGET>, C<BLKFRASET>, C<BLKFRAGET>, C<BLKSECTSET>, C<BLKSECTGET>, C<BLKSSZGET>, |
|
|
1360 | C<BLKBSZGET>, C<BLKBSZSET>, C<BLKGETSIZE64>, |
|
|
1361 | |
|
|
1362 | |
1356 | =item aio_sync $callback->($status) |
1363 | =item aio_sync $callback->($status) |
1357 | |
1364 | |
1358 | Asynchronously call sync and call the callback when finished. |
1365 | Asynchronously call sync and call the callback when finished. |
1359 | |
1366 | |
1360 | =item aio_fsync $fh, $callback->($status) |
1367 | =item aio_fsync $fh, $callback->($status) |
… | |
… | |
2238 | =item $retval = IO::AIO::fexecve $fh, $argv, $envp |
2245 | =item $retval = IO::AIO::fexecve $fh, $argv, $envp |
2239 | |
2246 | |
2240 | A more-or-less direct equivalent to the POSIX C<fexecve> functions, which |
2247 | A more-or-less direct equivalent to the POSIX C<fexecve> functions, which |
2241 | allows you to specify the program to be executed via a file descriptor (or |
2248 | allows you to specify the program to be executed via a file descriptor (or |
2242 | handle). Returns C<-1> and sets errno to C<ENOSYS> if not available. |
2249 | handle). Returns C<-1> and sets errno to C<ENOSYS> if not available. |
|
|
2250 | |
|
|
2251 | =item $retval = IO::AIO::mount $special, $path, $fstype, $flags = 0, $data = undef |
|
|
2252 | |
|
|
2253 | Calls the GNU/Linux mount syscall with the given arguments. All except |
|
|
2254 | C<$flags> are strings, and if C<$data> is C<undef>, a C<NULL> will be |
|
|
2255 | passed. |
|
|
2256 | |
|
|
2257 | The following values for C<$flags> are available: |
|
|
2258 | |
|
|
2259 | C<IO::AIO::MS_RDONLY>, C<IO::AIO::MS_NOSUID>, C<IO::AIO::MS_NODEV>, C<IO::AIO::MS_NOEXEC>, C<IO::AIO::MS_SYNCHRONOUS>, |
|
|
2260 | C<IO::AIO::MS_REMOUNT>, C<IO::AIO::MS_MANDLOCK>, C<IO::AIO::MS_DIRSYNC>, C<IO::AIO::MS_NOATIME>, |
|
|
2261 | C<IO::AIO::MS_NODIRATIME>, C<IO::AIO::MS_BIND>, C<IO::AIO::MS_MOVE>, C<IO::AIO::MS_REC>, C<IO::AIO::MS_SILENT>, |
|
|
2262 | C<IO::AIO::MS_POSIXACL>, C<IO::AIO::MS_UNBINDABLE>, C<IO::AIO::MS_PRIVATE>, C<IO::AIO::MS_SLAVE>, C<IO::AIO::MS_SHARED>, |
|
|
2263 | C<IO::AIO::MS_RELATIME>, C<IO::AIO::MS_KERNMOUNT>, C<IO::AIO::MS_I_VERSION>, C<IO::AIO::MS_STRICTATIME>, |
|
|
2264 | C<IO::AIO::MS_LAZYTIME>, C<IO::AIO::MS_ACTIVE>, C<IO::AIO::MS_NOUSER>, C<IO::AIO::MS_RMT_MASK>, C<IO::AIO::MS_MGC_VAL> and |
|
|
2265 | C<IO::AIO::MS_MGC_MSK>. |
|
|
2266 | |
|
|
2267 | =item $retval = IO::AIO::umount $path, $flags = 0 |
|
|
2268 | |
|
|
2269 | Invokes the GNU/Linux C<umount> or C<umount2> syscalls. Always calls |
|
|
2270 | C<umount> if C<$flags> is C<0>, otherwqise always tries to call |
|
|
2271 | C<umount2>. |
|
|
2272 | |
|
|
2273 | The following C<$flags> are available: |
|
|
2274 | |
|
|
2275 | C<IO::AIO::MNT_FORCE>, C<IO::AIO::MNT_DETACH>, C<IO::AIO::MNT_EXPIRE> and C<IO::AIO::UMOUNT_NOFOLLOW>. |
2243 | |
2276 | |
2244 | =item $numfd = IO::AIO::get_fdlimit |
2277 | =item $numfd = IO::AIO::get_fdlimit |
2245 | |
2278 | |
2246 | Tries to find the current file descriptor limit and returns it, or |
2279 | Tries to find the current file descriptor limit and returns it, or |
2247 | C<undef> and sets C<$!> in case of an error. The limit is one larger than |
2280 | C<undef> and sets C<$!> in case of an error. The limit is one larger than |