ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Linux-AIO/README
Revision: 1.7
Committed: Wed Aug 17 16:57:53 2005 UTC (18 years, 9 months ago) by root
Branch: MAIN
CVS Tags: rel-1_9, rel-1_8, HEAD
Changes since 1.6: +5 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 NAME
2     Linux::AIO - linux-specific aio implemented using clone
3    
4     SYNOPSIS
5     use Linux::AIO;
6    
7 root 1.7 # This module has been mostly superseded by IO::AIO.
8    
9 root 1.1 DESCRIPTION
10 root 1.7 *This module has been mostly superseded by IO::AIO, which is API
11     compatible.*
12    
13 root 1.3 This module implements asynchronous I/O using the means available to
14     Linux - clone. It does not hook into the POSIX aio_* functions because
15     Linux does not yet support these in the kernel (even as of 2.6.12, only
16     O_DIRECT files are supported) and even if, it would only allow aio_read
17     and write, not open, stat and so on.
18 root 1.1
19     Instead, in this module a number of (non-posix) threads are started that
20     execute your read/writes and signal their completion. You don't need
21     thread support in your libc or perl, and the threads created by this
22     module will not be visible to the pthreads library.
23    
24     NOTICE: the threads created by this module will automatically be killed
25     when the thread calling min_parallel exits. Make sure you only ever call
26     min_parallel from the same thread that loaded this module.
27    
28 root 1.3 Although the module will work with in the presence of other threads, it
29     is not reentrant, so use appropriate locking yourself.
30 root 1.1
31 root 1.4 API NOTES
32     All the "aio_*" calls are more or less thin wrappers around the syscall
33     with the same name (sans "aio_"). The arguments are similar or
34     identical, and they all accept an additional $callback argument which
35     must be a code reference. This code reference will get called with the
36     syscall return code (e.g. most syscalls return -1 on error, unlike perl,
37     which usually delivers "false") as it's sole argument when the given
38     syscall has been executed asynchronously.
39    
40     All functions that expect a filehandle will also accept a file
41     descriptor.
42    
43 root 1.5 The filenames you pass to these routines *must* be absolute. The reason
44     is that at the time the request is being executed, the current working
45     directory could have changed. Alternatively, you can make sure that you
46     never change the current working directory.
47    
48 root 1.1 Linux::AIO::min_parallel $nthreads
49     Set the minimum number of AIO threads to $nthreads. The default is
50     1, which means a single asynchronous operation can be done at one
51     time (the number of outstanding operations, however, is unlimited).
52    
53 root 1.2 It is recommended to keep the number of threads low, as some linux
54 root 1.1 kernel versions will scale negatively with the number of threads
55     (higher parallelity => MUCH higher latency).
56    
57 root 1.4 Under normal circumstances you don't need to call this function, as
58     this module automatically starts a single async thread.
59    
60 root 1.2 Linux::AIO::max_parallel $nthreads
61     Sets the maximum number of AIO threads to $nthreads. If more than
62     the specified number of threads are currently running, kill them.
63     This function blocks until the limit is reached.
64    
65     This module automatically runs "max_parallel 0" at program end, to
66     ensure that all threads are killed and that there are no outstanding
67     requests.
68    
69 root 1.4 Under normal circumstances you don't need to call this function.
70    
71 root 1.1 $fileno = Linux::AIO::poll_fileno
72     Return the *request result pipe filehandle*. This filehandle must be
73     polled for reading by some mechanism outside this module (e.g. Event
74     or select, see below). If the pipe becomes readable you have to call
75     "poll_cb" to check the results.
76    
77 root 1.4 See "poll_cb" for an example.
78    
79 root 1.1 Linux::AIO::poll_cb
80     Process all outstanding events on the result pipe. You have to call
81     this regularly. Returns the number of events processed. Returns
82     immediately when no events are outstanding.
83    
84     You can use Event to multiplex, e.g.:
85    
86     Event->io (fd => Linux::AIO::poll_fileno,
87     poll => 'r', async => 1,
88 root 1.4 cb => \&Linux::AIO::poll_cb);
89 root 1.1
90 root 1.2 Linux::AIO::poll_wait
91     Wait till the result filehandle becomes ready for reading (simply
92     does a select on the filehandle. This is useful if you want to
93     synchronously wait for some requests to finish).
94    
95 root 1.4 See "nreqs" for an example.
96    
97 root 1.1 Linux::AIO::nreqs
98     Returns the number of requests currently outstanding.
99    
100 root 1.4 Example: wait till there are no outstanding requests anymore:
101    
102 root 1.5 Linux::AIO::poll_wait, Linux::AIO::poll_cb
103     while Linux::AIO::nreqs;
104 root 1.4
105 root 1.1 aio_open $pathname, $flags, $mode, $callback
106     Asynchronously open or create a file and call the callback with the
107     filedescriptor (NOT a perl filehandle, sorry for that, but watch
108     out, this might change in the future).
109    
110 root 1.5 The pathname passed to "aio_open" must be absolute. See API NOTES,
111     above, for an explanation.
112    
113 root 1.4 The $mode argument is a bitmask. See the "Fcntl" module for a list.
114     They are the same as used in "sysopen".
115    
116     Example:
117    
118     aio_open "/etc/passwd", O_RDONLY, 0, sub {
119     if ($_[0] >= 0) {
120 root 1.6 open my $fh, "<&=$_[0]";
121 root 1.4 print "open successful, fh is $fh\n";
122     ...
123     } else {
124     die "open failed: $!\n";
125     }
126     };
127    
128 root 1.1 aio_close $fh, $callback
129     Asynchronously close a file and call the callback with the result
130     code.
131    
132     aio_read $fh,$offset,$length, $data,$dataoffset,$callback
133     aio_write $fh,$offset,$length, $data,$dataoffset,$callback
134     Reads or writes "length" bytes from the specified "fh" and "offset"
135     into the scalar given by "data" and offset "dataoffset" and calls
136 root 1.4 the callback without the actual number of bytes read (or -1 on
137     error, just like the syscall).
138    
139     Example: Read 15 bytes at offset 7 into scalar $buffer, strating at
140     offset 0 within the scalar:
141    
142     aio_read $fh, 7, 15, $buffer, 0, sub {
143     $_[0] >= 0 or die "read error: $!";
144     print "read <$buffer>\n";
145     };
146    
147     aio_readahead $fh,$offset,$length, $callback
148     Asynchronously reads the specified byte range into the page cache,
149     using the "readahead" syscall.
150    
151     readahead() populates the page cache with data from a file so that
152     subsequent reads from that file will not block on disk I/O. The
153     $offset argument specifies the starting point from which data is to
154     be read and $length specifies the number of bytes to be read. I/O is
155     performed in whole pages, so that offset is effectively rounded down
156     to a page boundary and bytes are read up to the next page boundary
157     greater than or equal to (off-set+length). aio_readahead() does not
158     read beyond the end of the file. The current file offset of the file
159     is left unchanged.
160 root 1.1
161     aio_stat $fh_or_path, $callback
162     aio_lstat $fh, $callback
163     Works like perl's "stat" or "lstat" in void context. The callback
164     will be called after the stat and the results will be available
165     using "stat _" or "-s _" etc...
166    
167 root 1.5 The pathname passed to "aio_stat" must be absolute. See API NOTES,
168     above, for an explanation.
169    
170 root 1.1 Currently, the stats are always 64-bit-stats, i.e. instead of
171     returning an error when stat'ing a large file, the results will be
172     silently truncated unless perl itself is compiled with large file
173     support.
174    
175 root 1.4 Example: Print the length of /etc/passwd:
176    
177     aio_stat "/etc/passwd", sub {
178     $_[0] and die "stat failed: $!";
179     print "size is ", -s _, "\n";
180     };
181    
182 root 1.1 aio_unlink $pathname, $callback
183 root 1.4 Asynchronously unlink (delete) a file and call the callback with the
184     result code.
185    
186     aio_fsync $fh, $callback
187     Asynchronously call fsync on the given filehandle and call the
188     callback with the fsync result code.
189    
190     aio_fdatasync $fh, $callback
191     Asynchronously call fdatasync on the given filehandle and call the
192     callback with the fdatasync result code.
193 root 1.1
194     BUGS
195     This module has been extensively tested in a large and very busy
196     webserver for many years now.
197    
198     - aio_open gives a fd, but all other functions expect a perl filehandle.
199    
200     SEE ALSO
201 root 1.5 Coro, IO::AIO.
202 root 1.1
203     AUTHOR
204     Marc Lehmann <schmorp@schmorp.de>
205     http://home.schmorp.de/
206