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.14 by root, Sat Jul 23 18:15:36 2005 UTC vs.
Revision 1.21 by root, Sun Aug 7 03:26:10 2005 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines