ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/IO-AIO/AIO.xs
(Generate patch)

Comparing IO-AIO/AIO.xs (file contents):
Revision 1.13 by root, Fri Jul 22 08:25:22 2005 UTC vs.
Revision 1.17 by root, Sun Jul 31 18:45:48 2005 UTC

1#define _XOPEN_SOURCE 500
2
3#include "EXTERN.h" 1#include "EXTERN.h"
4#include "perl.h" 2#include "perl.h"
5#include "XSUB.h" 3#include "XSUB.h"
4
5#include "autoconf/config.h"
6 6
7#include <sys/types.h> 7#include <sys/types.h>
8#include <sys/stat.h> 8#include <sys/stat.h>
9 9
10#include <unistd.h> 10#include <unistd.h>
11#include <fcntl.h> 11#include <fcntl.h>
12#include <signal.h> 12#include <signal.h>
13#include <sched.h> 13#include <sched.h>
14#if __linux
15#include <sys/syscall.h>
16#endif
17 14
18#include <pthread.h> 15#include <pthread.h>
19 16
20typedef void *InputStream; /* hack, but 5.6.1 is simply toooo old ;) */ 17typedef void *InputStream; /* hack, but 5.6.1 is simply toooo old ;) */
21typedef void *OutputStream; /* hack, but 5.6.1 is simply toooo old ;) */ 18typedef void *OutputStream; /* hack, but 5.6.1 is simply toooo old ;) */
233 req->type = REQ_QUIT; 230 req->type = REQ_QUIT;
234 231
235 send_req (req); 232 send_req (req);
236} 233}
237 234
235/* work around various missing functions */
236
237#if !HAVE_PREADWRITE
238# define pread aio_pread
239# define pwrite aio_pwrite
240
241/*
242 * make our pread/pwrite safe against themselves, but not against
243 * normal read/write by using a mutex. slows down execution a lot,
244 * but that's your problem, not mine.
245 */
246static pthread_mutex_t iolock = PTHREAD_MUTEX_INITIALIZER;
247
248static ssize_t
249pread (int fd, void *buf, size_t count, off_t offset)
250{
251 ssize_t res;
252 off_t ooffset;
253
254 pthread_mutex_lock (&iolock);
255 ooffset = lseek (fd, 0, SEEK_CUR);
256 lseek (fd, offset, SEEK_SET);
257 res = read (fd, buf, count);
258 lseek (fd, ooffset, SEEK_SET);
259 pthread_mutex_unlock (&iolock);
260
261 return res;
262}
263
264static ssize_t
265pwrite (int fd, void *buf, size_t count, off_t offset)
266{
267 ssize_t res;
268 off_t ooffset;
269
270 pthread_mutex_lock (&iolock);
271 ooffset = lseek (fd, 0, SEEK_CUR);
272 lseek (fd, offset, SEEK_SET);
273 res = write (fd, buf, count);
274 lseek (fd, offset, SEEK_SET);
275 pthread_mutex_unlock (&iolock);
276
277 return res;
278}
279#endif
280
281#if !HAVE_FDATASYNC
282# define fdatasync fsync
283#endif
284
285#if !HAVE_READAHEAD
286# define readahead aio_readahead
287
288static char readahead_buf[4096];
289
290static ssize_t
291readahead (int fd, off_t offset, size_t count)
292{
293 while (count > 0)
294 {
295 size_t len = count < sizeof (readahead_buf) ? count : sizeof (readahead_buf);
296
297 pread (fd, readahead_buf, len, offset);
298 offset += len;
299 count -= len;
300 }
301
302 errno = 0;
303}
304#endif
305
238static void * 306static void *
239aio_proc (void *thr_arg) 307aio_proc (void *thr_arg)
240{ 308{
241 aio_req req; 309 aio_req req;
242 int type; 310 int type;
269 337
270 switch (type) 338 switch (type)
271 { 339 {
272 case REQ_READ: req->result = pread (req->fd, req->dataptr, req->length, req->offset); break; 340 case REQ_READ: req->result = pread (req->fd, req->dataptr, req->length, req->offset); break;
273 case REQ_WRITE: req->result = pwrite (req->fd, req->dataptr, req->length, req->offset); break; 341 case REQ_WRITE: req->result = pwrite (req->fd, req->dataptr, req->length, req->offset); break;
274#if SYS_readahead 342
275 case REQ_READAHEAD: req->result = readahead (req->fd, req->offset, req->length); break; 343 case REQ_READAHEAD: req->result = readahead (req->fd, req->offset, req->length); break;
276#else
277 case REQ_READAHEAD: req->result = -1; errno = ENOSYS; break;
278#endif
279 344
280 case REQ_STAT: req->result = stat (req->dataptr, req->statdata); break; 345 case REQ_STAT: req->result = stat (req->dataptr, req->statdata); break;
281 case REQ_LSTAT: req->result = lstat (req->dataptr, req->statdata); break; 346 case REQ_LSTAT: req->result = lstat (req->dataptr, req->statdata); break;
282 case REQ_FSTAT: req->result = fstat (req->fd , req->statdata); break; 347 case REQ_FSTAT: req->result = fstat (req->fd , req->statdata); break;
283 348
284 case REQ_OPEN: req->result = open (req->dataptr, req->fd, req->mode); break; 349 case REQ_OPEN: req->result = open (req->dataptr, req->fd, req->mode); break;
285 case REQ_CLOSE: req->result = close (req->fd); break; 350 case REQ_CLOSE: req->result = close (req->fd); break;
286 case REQ_UNLINK: req->result = unlink (req->dataptr); break; 351 case REQ_UNLINK: req->result = unlink (req->dataptr); break;
287 352
353 case REQ_FDATASYNC: req->result = fdatasync (req->fd); break;
288 case REQ_FSYNC: req->result = fsync (req->fd); break; 354 case REQ_FSYNC: req->result = fsync (req->fd); break;
289 case REQ_FDATASYNC: req->result = fdatasync (req->fd); break;
290 355
291 case REQ_QUIT: 356 case REQ_QUIT:
292 break; 357 break;
293 358
294 default: 359 default:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines