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.16 by root, Sun Jul 31 18:20:07 2005 UTC vs.
Revision 1.18 by root, Sun Jul 31 19:00:31 2005 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines