--- Linux-AIO/README 2005/07/08 02:43:47 1.2 +++ Linux-AIO/README 2005/07/10 01:02:51 1.4 @@ -5,10 +5,11 @@ use Linux::AIO; DESCRIPTION - This module implements asynchronous i/o using the means available to - linux - clone. It does not hook into the POSIX aio_* functions because - linux does not yet support these in the kernel (and even if, it would - only allow aio_read and write, not open and stat). + This module implements asynchronous I/O using the means available to + Linux - clone. It does not hook into the POSIX aio_* functions because + Linux does not yet support these in the kernel (even as of 2.6.12, only + O_DIRECT files are supported) and even if, it would only allow aio_read + and write, not open, stat and so on. Instead, in this module a number of (non-posix) threads are started that execute your read/writes and signal their completion. You don't need @@ -19,8 +20,20 @@ when the thread calling min_parallel exits. Make sure you only ever call min_parallel from the same thread that loaded this module. - Although the module will work with threads, it is not reentrant, so use - appropriate locking yourself. + Although the module will work with in the presence of other threads, it + is not reentrant, so use appropriate locking yourself. + + API NOTES + All the "aio_*" calls are more or less thin wrappers around the syscall + with the same name (sans "aio_"). The arguments are similar or + identical, and they all accept an additional $callback argument which + must be a code reference. This code reference will get called with the + syscall return code (e.g. most syscalls return -1 on error, unlike perl, + which usually delivers "false") as it's sole argument when the given + syscall has been executed asynchronously. + + All functions that expect a filehandle will also accept a file + descriptor. Linux::AIO::min_parallel $nthreads Set the minimum number of AIO threads to $nthreads. The default is @@ -31,6 +44,9 @@ kernel versions will scale negatively with the number of threads (higher parallelity => MUCH higher latency). + Under normal circumstances you don't need to call this function, as + this module automatically starts a single async thread. + Linux::AIO::max_parallel $nthreads Sets the maximum number of AIO threads to $nthreads. If more than the specified number of threads are currently running, kill them. @@ -40,12 +56,16 @@ ensure that all threads are killed and that there are no outstanding requests. + Under normal circumstances you don't need to call this function. + $fileno = Linux::AIO::poll_fileno Return the *request result pipe filehandle*. This filehandle must be polled for reading by some mechanism outside this module (e.g. Event or select, see below). If the pipe becomes readable you have to call "poll_cb" to check the results. + See "poll_cb" for an example. + Linux::AIO::poll_cb Process all outstanding events on the result pipe. You have to call this regularly. Returns the number of events processed. Returns @@ -55,21 +75,43 @@ Event->io (fd => Linux::AIO::poll_fileno, poll => 'r', async => 1, - cb => \&Linux::AIO::poll_cb ); + cb => \&Linux::AIO::poll_cb); Linux::AIO::poll_wait Wait till the result filehandle becomes ready for reading (simply does a select on the filehandle. This is useful if you want to synchronously wait for some requests to finish). + See "nreqs" for an example. + Linux::AIO::nreqs Returns the number of requests currently outstanding. + Example: wait till there are no outstanding requests anymore: + + Linux::AIO::poll_wait while Linux::AIO::nreqs; + aio_open $pathname, $flags, $mode, $callback Asynchronously open or create a file and call the callback with the filedescriptor (NOT a perl filehandle, sorry for that, but watch out, this might change in the future). + The $mode argument is a bitmask. See the "Fcntl" module for a list. + They are the same as used in "sysopen". + + Example: + + aio_open "/etc/passwd", O_RDONLY, 0, sub { + if ($_[0] >= 0) { + open my $fh, "<&$_[0]"; # create a copy for perl + aio_close $_[0], sub { }; # close the aio handle + print "open successful, fh is $fh\n"; + ... + } else { + die "open failed: $!\n"; + } + }; + aio_close $fh, $callback Asynchronously close a file and call the callback with the result code. @@ -78,8 +120,30 @@ aio_write $fh,$offset,$length, $data,$dataoffset,$callback Reads or writes "length" bytes from the specified "fh" and "offset" into the scalar given by "data" and offset "dataoffset" and calls - the callback without the actual number of bytes read (or "undef" on - error). + the callback without the actual number of bytes read (or -1 on + error, just like the syscall). + + Example: Read 15 bytes at offset 7 into scalar $buffer, strating at + offset 0 within the scalar: + + aio_read $fh, 7, 15, $buffer, 0, sub { + $_[0] >= 0 or die "read error: $!"; + print "read <$buffer>\n"; + }; + + aio_readahead $fh,$offset,$length, $callback + Asynchronously reads the specified byte range into the page cache, + using the "readahead" syscall. + + readahead() populates the page cache with data from a file so that + subsequent reads from that file will not block on disk I/O. The + $offset argument specifies the starting point from which data is to + be read and $length specifies the number of bytes to be read. I/O is + performed in whole pages, so that offset is effectively rounded down + to a page boundary and bytes are read up to the next page boundary + greater than or equal to (off-set+length). aio_readahead() does not + read beyond the end of the file. The current file offset of the file + is left unchanged. aio_stat $fh_or_path, $callback aio_lstat $fh, $callback @@ -92,8 +156,24 @@ silently truncated unless perl itself is compiled with large file support. + Example: Print the length of /etc/passwd: + + aio_stat "/etc/passwd", sub { + $_[0] and die "stat failed: $!"; + print "size is ", -s _, "\n"; + }; + aio_unlink $pathname, $callback - Asynchronously unlink a file. + Asynchronously unlink (delete) a file and call the callback with the + result code. + + aio_fsync $fh, $callback + Asynchronously call fsync on the given filehandle and call the + callback with the fsync result code. + + aio_fdatasync $fh, $callback + Asynchronously call fdatasync on the given filehandle and call the + callback with the fdatasync result code. BUGS This module has been extensively tested in a large and very busy